2012-01-30 82 views
0

考慮下面的代碼函數RegSetValueEx和CHAR

addHash("hash"); 

bool addHash(char* hash) { 
    HKEY hKey = 0; 
    int code = RegOpenKey(HKEY_CURRENT_USER, subkey, &hKey); 

    const int length = strlen(hash)+1; 
    WCHAR whash[100]; 
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, hash, strlen(hash), whash, 100); 
    LONG setRes = RegSetValueEx(hKey, L"hash", 0, REG_SZ, (LPBYTE)whash, strlen(hash)+1); 

    return true; 
} 

代碼被編譯並執行後,「哈」是puted到註冊表中。有人可以告訴我問題在哪裏嗎?

預先感謝您!

回答

1

最後一個參數是第二個最後一個參數指向的字節數,而不是字符數。

因此whash的前五個字節(strlen(hash) + 1)將被存儲在註冊表中。更改爲:

LONG setRes = RegSetValueEx(hKey, 
          L"hash", 
          0, 
          REG_SZ, 
          (LPBYTE)whash, 
          (wcslen(whash) + 1) * sizeof(WCHAR)); 

您可能還需要初始化whash(我不認爲MultiByteToWideChar()添加一個空終止你):

WCHAR whash[100] = { 0 }; 
+0

^什麼hmjd說。嘗試'sizeof' – chris 2012-01-30 17:12:35

1

我想這是你正在嘗試做的:

#include <tchar.h> 
#include <Windows.h> 
using namespace std; 

bool addHash(wstring hash) { 
    const wchar_t* wHash = hash.c_str(); 
    LONG ret = RegSetKeyValue(HKEY_CURRENT_USER, _T("Software\\aa\\test"), _T("hash"), REG_SZ, wHash, hash.length() * sizeof(wchar_t)); 
    return (ret == ERROR_SUCCESS); 
} 

int main() 
{ 
    addHash(_T("A42B2094EDC43")); 
    return 0; 
} 

希望這有助於;)