使用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 失败");
    }

 

 

 

 

 

posted @ 2018-01-11 09:55  ~小小鸟~  阅读(950)  评论(0编辑  收藏  举报