2016-11-23 77 views
-1

我阅读了一些文档并查看了代码示例,但我找不到任何我的代码无法工作的原因。RegSetValueEx不会创建字符串值

#include <iostream> 
#include <string> 
#include <Windows.h> 
using namespace std; 

void AddSubKeyWithValue(HKEY hRootKey, LPWSTR strSubKey, LPCTSTR StringVal, LPCTSTR data) 
{ 
    HKEY hKey; 
    RegOpenKeyEx(hRootKey, strSubKey, NULL, KEY_ALL_ACCESS, &hKey); 
    RegSetValueEx(hRootKey, StringVal, NULL, REG_SZ, (LPBYTE)&data, sizeof(REG_SZ)); 
    RegCloseKey(hKey); 
    return; 
} 


void main() { 

    AddSubKeyWithValue(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",L"Slayer Tool", L"c:\\Slayer\\Update.exe"); 

    system("pause"); 
    return; 

} 
+0

我对Windows编程一无所知,但我敢打赌,这些函数返回一个错误代码。而且,'sizeof(REG_SZ)'看起来很可疑。 – melpomene

回答

2

RegSetValueEx呼叫全部关闭。第一个参数应该是一个子键句柄,而不是HKEY_LOCAL_MACHINE。第五个参数应指向数据,而不是指向数据的指针。第六个参数应该包含字节长度,以字节为单位(记住它是一个宽字符串),包括终止空值。

所以重新制定这样的:

RegSetValueEx(hKey, StringVal, NULL, REG_SZ, (LPBYTE)data, sizeof(wchar_t)*(wcslen(data)+1)); 

最重要的是,在HKEY_LOCAL_MACHINE只读非管理员用户,甚至admin用户的它的只读无特权提升。

此外,system("pause")是等待按键的可怕方式。改为调用“getch()”。

+0

它没有工作,但你是正确的在我的参数错误。 – Nakruf

+2

总是检查返回值! 'RegSetValueEx()'(或者更可能是'RegOpenKeyEx()')失败并且没有捕获到错误。不要使用'KEY_ALL_ACCESS',在这种情况下'KEY_SET_VALUE'本身就足够了,只要代码运行时具有管理权限,因为它试图写入'HKLM',它受到非管理员写入的保护。当访问一个安全的资源时,绝不要求比实际需要更多的权限。 –