使用RegSetValueEx修改注册表时遇到的问题(转)
原文转自 http://blog.csdn.net/tracyzhongcf/article/details/4076870
1、今天在使用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指向的内容之外的其他字符也写入注册表中。导致错误发生。
2、在我的项目中修改注册表后,界面上看起来修改成功了,但实际上未生效,重启电脑才生效,不知道为什么?
TCHAR value[32]; memset(value, 0, sizeof(value)); wcsncpy(value, TEXT("zh-CN"), 32); int iLen = wcslen(value); LONG ret = RegSetValueEx(hk, TEXT("LocaleName"), NULL, REG_SZ, (const BYTE*)value, sizeof(TCHAR)*iLen ); if (ret != ERROR_SUCCESS) { MSG_LOG("RegSetValueEx 失败"); } memset(value, 0, sizeof(value)); wcsncpy(value, TEXT("00000804"), 32); iLen = wcslen(value); ret = RegSetValueEx(hk, TEXT("Locale"), NULL, REG_SZ, (const BYTE*)value, sizeof(TCHAR)*iLen ); if (ret != ERROR_SUCCESS) { MSG_LOG("RegSetValueEx 失败"); }