2016-11-23 59 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',它受到非管理員寫入的保護。當訪問一個安全的資源時,絕不要求比實際需要更多的權限。 –