2016-11-23 1 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

나는 윈도우 프로그래밍에 대해 아무것도 모르지만 나는 그 함수가 에러 코드를 반환 할 것이다. 또한,'sizeof (REG_SZ)'는 의심스러워 보입니다. – melpomene

답변

2

RegSetValueEx 호출이 모두 꺼져 있습니다. 첫 번째 매개 변수는 HKEY_LOCAL_MACHINE이 아닌 하위 키 핸들이어야합니다. 5 번째 매개 변수는 데이터를 가리키는 포인터가 아니라 데이터를 가리켜 야합니다. 여섯 번째 매개 변수는 종료 널을 포함하여 문자열 길이를 바이트 단위로 포함해야합니다 (넓은 문자열 임에 유의하십시오).

그래서 다음과 같이 재구성 :

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 '에 쓰기를 시도하고 있기 때문에 관리자 권한으로 실행 중일 때만 가능합니다. 보안 가능 리소스에 액세스 할 때 실제로 필요한 것보다 많은 권한을 요구하지 마십시오. –

관련 문제