使用RegSetValueEx时要注意的一点问题

今天在使用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指向的内容之外的其他字符也写入注册表中。导致错误发生。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
非常感谢您的指正!您是正确的,OEMBackground 的类型应该是 REG_DWORD。以下是修改后的代码: ```c #include <windows.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { HKEY hKey; DWORD dwType, dwSize, dwValue; TCHAR szValue[MAX_PATH] = {0}; TCHAR szPath[MAX_PATH] = {0}; TCHAR szDefaultPath[MAX_PATH] = _T("C:\\Windows\\System32\\oobe\\info\\backgrounds\\backgroundDefault.jpg"); DWORD dwDisposition = 0; // 打开注册表键 if (RegCreateKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background"), 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition) == ERROR_SUCCESS) { // 设置壁纸路径 _tcscpy_s(szPath, MAX_PATH, _T("C:\\Windows\\System32\\oobe\\info\\backgrounds\\mybackground.jpg")); dwValue = 1; RegSetValueEx(hKey, _T("OEMBackground"), 0, REG_DWORD, (LPBYTE)&dwValue, sizeof(DWORD)); RegSetValueEx(hKey, _T("OEMBackgroundImagePath"), 0, REG_SZ, (LPBYTE)szPath, (_tcslen(szPath) + 1) * sizeof(TCHAR)); RegCloseKey(hKey); } // 设置默认壁纸路径 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Authentication\\LogonUI\\Background"), 0, KEY_READ, &hKey) == ERROR_SUCCESS) { dwSize = MAX_PATH; if (RegQueryValueEx(hKey, _T("OEMBackgroundImagePath"), NULL, &dwType, (LPBYTE)szValue, &dwSize) == ERROR_SUCCESS) { if (_tcslen(szValue) > 0 && _tcsicmp(szValue, szDefaultPath) != 0) { // 如果当前壁纸不是默认壁纸,则备份当前壁纸并设置默认壁纸 _tcsncpy_s(szPath, MAX_PATH, szValue, MAX_PATH - 1); _tcscat_s(szPath, MAX_PATH, _T(".bak")); CopyFile(szValue, szPath, FALSE); RegSetValueEx(hKey, _T("OEMBackgroundImagePath"), 0, REG_SZ, (LPBYTE)szDefaultPath, (_tcslen(szDefaultPath) + 1) * sizeof(TCHAR)); } } RegCloseKey(hKey); } return 0; } ``` 再次感谢您的指正,希望这次的答案能够满足您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值