2010年7月30日 星期五

C/C++, Windows CE registry 與 CreateFile

利用 CReg 宣告物件進而讀出registry中的Key值。
例如要讀出某一個String:

CReg regDaemon;

regDaemon.OpenOrCreateRegKey(HKEY_LOCAL_MACHINE, RK_TEST_KEY);

WCHAR * wchRegKeyString = (WCHAR * ) regDaemon(HKEY_LOCAL_MACHINE, RK_BASE_TEST, 0);

然而當你要用這個方法讀出存在Key中的String,然後放進 CreateFile 中去進行檔案的操作時。
CreateFile會一直說路徑錯誤。

例如:

HANDLE hFile = CreateFile(wchRegKeyString ,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

原因不明,但是有方法可以解決(找了好久才發現一定需要這樣子做)。因為reg key 傳回的只有一個字元陣列的指標。那就是必須在function中額外宣告一個字元陣列來暫存這些字元。因此你必須利用memcpy或是wcscpy_s先將字元拷貝到暫存的陣列:

WCHAR wStringBuffer[128] = {0};
wcscpy_s(wStringBuffer,sizeof(wStringBuffer)/sizeof(WCHAR),wchRegKeyString );

HANDLE hFile = CreateFile(wStringBuffer,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);

真的是很機車的M$,很不乾脆的一個作法。害我浪費了許多時間try and error。(這才是這篇網誌的主要目的,上來幹橋一下M$)。