今天在使用RegSetValueEx时发现一个问题:
RegSetValueEx(hKey, TEXT("test"), 0, REG_SZ, (LPBYTE)TEXT("test.dll"), 256);
向注册表的某位置写了一个test,键值为test.dll
程序运行时,按理说会自动去加载我的test.dll。(因为我手动去修改机器上的注册表,添加此注册表项时,确实是能让系统加载test.dll了)。但是结果却是通过程序向注册表去写时,注册表确实写上了,可是系统没有加载我的dll。
原因:
256!!!
把程序改成:
TCHAR szTest[32];
wcsncpy(szTest, TEXT("test.dll"), 32);
int iLen = wcslen(szTest);
RegSetValueEx(hKey, TEXT("test"), 0, REG_SZ, (LPBYTE)szTest, sizeof(TCHAR)*iLen );
就可以了。
我们看一下RegSetValueEx中的参数:
LONG RegSetValueEx( HKEY hKey, LPCWSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE* lpData, DWORD cbData );
cbData不能太大,否则很可能把lpData指向的内容之外的其他字符也写入注册表中。导致错误发生。