2016-11-23 2 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ではなく、サブキーのハンドルにする必要があります。 5番目のパラメータは、データへのポインタではなく、データを指す必要があります。 6番目のパラメータには、文字列の長さ(バイト数)が含まれている必要があります(ワイド文字列であることに注意してください)。

だから、次のように定式:

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

最も重要なのは、HKEY_LOCAL_MACHINEは読み取り専用で、管理者以外のユーザーのために、とさえ、それは読み取り専用の権限昇格せずに管理者ユーザーのために。

また、system("pause")は、キーを押すのを待つためのひどい方法です。代わりに "getch()"を呼び出します。

+0

それは動作しませんでしたが、あなたは私のパラメータエラーの権利です。 – Nakruf

+2

常に戻り値をチェックしてください! 'RegSetValueEx()'(あるいは 'RegOpenKeyEx()')は、あなたが捕まえていないエラーで失敗しています。 'KEY_ALL_ACCESS'を使用しないでください。この場合は' KEY_SET_VALUE'だけで十分です。コードは管理者権限で実行されているので、 'HKLM'への書き込みを試みています。セキュリティで保護されたリソースにアクセスするときは、実際に必要以上に多くのアクセス権を要求しないでください。 –

関連する問題