2012-01-30 151 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; 
} 

希望这有助于;)