8.27.2009

VS2006 CE 6.0 Win32 Program with Resource

原來是要用VS2005 Platform Builder 6.0 OS Project 中加一個 Dialog application 的 sub project
但是實際上 run 起來,dialog 都不會出現,

用 kitl trace code,發現是 DialogBox( ) 內找不到 resource。

但是用 platform builder 的 build system 又沒有 Makefile 可以看。所以不知道他有沒有 link resource data.

所以:
  • 修改 sources,把 *.rc 加到 SOURCES = 的 list 中。
之後,在 VS2005 下"Build" 就可以link .res 了。
其實這個只要在 VS2005 的 solution explorer 中的 "source file"選 Add New Item 把 *.rc 加入就可以了。
不是在"resource files" 加入.




但是在command console 下 build 的話,一樣不會 link .res
所以說,VS2005 沒有這麼自動,會把add的 file 自動加到 sources 檔中。

另外,雖然 resource 檔可以利用到 VS2005 的 tool 功能:
  • Resource Include file - 指定產生 .res 中使用到的ID definition
但是必須要是真的由 VS2005 新增的 control 才會被加到 .h 中,還有,刪除的control , .h 的宣告不會消除。

8.25.2009

使用VS2005 + Ce 6.0 + KITL 時,可底指定哪些 module 由 release directory load,而不要從 NK.BIN 中load。

這樣的好處是在作 driver developement 時,可以 build 完 driver 重開機就可以,不用再 makeimg, write to boot media , boot。

8.24.2009

findstr - win32 的 grep

用 findstr /? 可以顯示 help

FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
字串 [[drive:][path]filename[ ...]]

/B 如果是在行的開端,則符合類型。
/E 如果是在行的尾端,則符合類型。
/L 逐字使用搜尋字串。
/R 使用搜尋字串為一般表示式。
/S 在現存目錄及所有的子目錄中
搜尋符合的檔案。
/I 指定搜尋不區分大小寫。
/X 列印完全符合的行數。
/V 只列印不含相符字串的行數。
/N 列印每一行符合的行數前的行編號。
/M 只列印包含相符字串的檔案的檔案名稱。
/O 列印每一個相符行之前的字元位移。
/P 略過沒有可列印字元的檔案
/OFF[LINE] 不要略過有離線屬性組的檔案。
/A:attr 指定有兩個十六進位數字的色彩屬性。請參考 "color /?"
/F:file 從指定的檔案 (/ 代表主控台) 讀取檔案清單。
/C:string 使用特定的字串作為逐字搜尋的字串。
/G:file 從指定的檔案取得搜尋字串(/ 代表主控台)。
strings 要搜尋的文字。
[drive:][path]filename
指定要搜尋的一個或多個檔案。

除非引數的字首有 /C ,否則請以空格將多重搜尋
字串分開。例如,'FINDSTR "hello there" x.y' 將會在檔案 x.y 中搜尋 "hello",或
"there"。'FINDSTR /C:"hello there" x.y' 將會在檔案 x.y 中搜尋
"hello there"。

8.21.2009

timestamp of module on device does not match timestamp of local module.

在用 VS2008 platformbuilder 6.0 debug subproject。
在 load subproject 的symble file 時,會 complain:
timestamp of module on device does not match timestamp of local module.
這好像是因為 這個 sub project 的時間和 kernel 不一樣。

Follow 說明,到
VS2005 -- Tool -- Option -- Platform Builder for CE -- System Debugger -- General

CHECK : "Ignore timestamp mismatched"

8.20.2009

_OEMINCPATH & _ISVINCPATH

用Platform Builder New Project,其中的 sources,雖然有

_ISVINCPATH
_OEMINCPATH
的定義,但是在build得時候並不會參考。

如果要叫 build tool 參考這兩個 宣告,要:

WINCEOEM=1

*可以寫在 sources 的一開頭



其實要加include path,可以在 sub project 的 property 的 C/C++ 裡加。

這樣會加在source 的最後,增加:
CDEFINES=$(_CSPCOMMONPATH)\src\inc;

8.13.2009

Codesnip for platformbuilder

想follow msdn 的
How to Create, Customize, and Debug an Image for the Windows CE 5.0 Emulator
作,發現platformbuilder沒有 codesnip 呀?

結果:就是在msdn 該篇文章開頭,

Windows CE 5.0 Embedded Development Labs.msi

Download 安裝後,就有了。

這個說明有說錯的地方,Walktree是"'WCE Application" 不是 "WCE Console Application"。

Walktree 是 "WCE Application" 然後選 "A simple Windows CE application"。


一定要這樣選,否則從 code clip copy 下來的 sample code 會 build fail。

8.12.2009

memtrack to find memory leak

上次忘了寫,大概紀錄一下。

MSDN 上有提到利用 celog 和 memtrack 作 memoryleak 的分析。

大概的步驟是:
  1. 連上kitl,開啟cesh
  2. 開啟要測試的程式 s testprogram.exe
  3. 開啟memtrack : memtrack on
  4. memtrack 會要你開啟celog。回答Y
  5. 操作 testprogram,run 過你認為有可能發生 leak的動作
  6. 關閉memtrack : memtrack off
  7. 將celog 存到 release folder : celog -flush /release/celog.clg
  8. 到 pc 端,開啟 memalyz 讀入剛剛存的 celog.clg,她會轉成 txt 檔
最後的 txt 檔就會列出在memtrack on -- off 的過程中,有哪些 memory 沒有free掉。




那~有沒有找到memory leak ?

沒有 :)

因為 log 很複雜呀,而且看不懂 XD

8.11.2009

WorkItem in SDBUS driver

SDBUS 中的 CSDWorkItem class 好像只是一個 client/server class, server 介面實做一個 servicecode queue,和一個 wakeup event。

class server 實做在繼承的 MiniThread( ) 上。
class 包裝好 "put service in queue & trigger wakeup event" 在一個 function 中,方便 client 使用。

這樣的目的好像是要做出 asynchroniz 的動作。讓 client 在作某些 SD card 動作時,不會被block著。

至於動作有沒有完成就沒有同步的方法了----

GlobalMemoryStatus

MSDN GlobalMemoryStatus

void GlobalMemoryStatus(
LPMEMORYSTATUS lpBuffer
);

其中傳入/出的structure 是:

typedef struct _MEMORYSTATUS {
DWORD dwLength; - 很莫名其妙,就是 這個structure 的size。
DWORD dwMemoryLoad; - memory loading %
DWORD dwTotalPhys; - 所有的 physical memory size
DWORD dwAvailPhys; - 目前可用的 physical memory size (還沒被 commit 的 memory)
DWORD dwTotalPageFile; - 所有的 disk page size
DWORD dwAvailPageFile; - 目前可用的 disk page size
DWORD dwTotalVirtual; - caller process 的所有 virtual memory address
DWORD dwAvailVirtual; - caller process 目前可用的 virtual memory address space
} MEMORYSTATUS, *LPMEMORYSTATUS;

所以一般看 AvailablePhys 就可以了,代表還有多少實體記憶體可以用。
頂多再看一下 AvailVirtual,看看是不是所有的Virtual Address都被 alloc 掉了 (DLL有這麼多嗎?)


這幾個參數值,可以用 remote performance monitor 看。

8.10.2009

msdn : DirectDraw Blt function.

HRESULT Blt(
LPRECT lpDestRect,
LPDIRECTDRAWSURFACE4 lpDDSrcSurface,
LPRECT lpSrcRect,
DWORD dwFlags,
LPDDBLTFX lpDDBltFx
);

8.06.2009

Fix Windows CE 5.0 KITL after install Windows CE 6.0

因為安裝了 Windows CE 6.0 在 platform builder 5.0 的 PC 上,所以 Platform builder 的 Kitl 不能用了 :(

後來這一篇 有教 - uninstall 6.0 後,5.0 的 connection 不能用的解決方法,照著作後,果然可以連了 (雖然還是有點小問題..)

大概就是:

Windows CE 5.0, 6.0 的連線設定都放在

C:\Documents and Settings\--User-Name--\Local Settings\Application Data\Microsoft\CoreCon\1.0

所以把這個 folder 備份起來 (以免以後 6.0 要用),然後到 5.0 的目錄把 addon folder 和一個 microsoft.xxxxx.xsl copy 過來,重新開 Platform builder 後,其他資料就會自動產生了。

C:\Program Files\Windows CE Platform Builder\5.00\CEPB\BIN\microsoft.platformbuilder500.servicecategory.xsl

C:\Program Files\Windows CE Platform Builder\5.00\CORECON\SDK\XSL\ADDONS

8.05.2009

msdn : clone public code

先bookmark一下..

原來msdn 就有說把public code clone 出來的方法..



Show Software Input Panel (SIP 螢幕小鍵盤)

如果OS有把 software input panel (keyboard) 加到 OS 中,但是沒有把 start bar 顯示出來,可以用下面的code 來顯示:


顯示

HWND hInputWnd = ::FindWindow(_T("SipWndClass"),NULL);
if(hInputWnd != 0)
{
::ShowWindow(hInputWnd,SW_SHOW);
}


關閉


HWND hInputWnd = ::FindWindow(_T("SipWndClass"),NULL);
if(hInputWnd != 0)
{
::ShowWindow(hInputWnd,SW_HIDE);
}