2017-05-13 5 views
0

레지스트리에서 문자열 키를로드하기위한 여러 코드를 시험해보고 테스트 한 후에이 코드를 적어 두었습니다. 하지만 매우 혼란스러운 것은이 코드가 HKEY_LOCAL_MACHINE/HARDWARE 키에서 작동하지만 소프트웨어에서는 작동하지 않는다는 것입니다. 내가 뭘 무시하는지 모르겠다.레지스트리 키 오류로드

char rgValue [512]; 
char fnlRes [512]; 
DWORD size1; 
DWORD Type; 
HKEY hKey = 0; 
char buf[512] = {0}; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(buf); 

if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) 
{ 
    dwType = REG_DWORD; 
    if(RegQueryValueEx(hKey, TEXT("test"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     cout << "key value is '" << buf << "'\n"; 
    } 
    else 
     cout << "can not query for key value\n"; 
    RegCloseKey(hKey); 
} 
else 
    cout << "Can not open key\n"; 
+0

전화'GetLastError' 및 결과에 게시물을 업데이트합니다. –

+0

@RichardCritten GetLastError에 익숙하지 않지만 코드에 삽입하고 0 값을 반환했습니다. 내 주 코드에서 regKey를 성공적으로 열면 RegQueryValueEx 오류가 발생하고 디버거가 "키 값을 쿼리 할 수 ​​없습니다"행으로 바뀝니다. –

+0

'RegQueryValueEx'에 대한 문서를 읽은 후 반환 결과에 대한 부울 값을 반환하지 않습니다. 참조 : https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspx 링크의 샘플도 참조하십시오. –

답변

0

당신은 레지스트리에서 DWORD 값을 읽는 것으로 나타하지만, 대신 null로 끝나는 문자열 인 것처럼 콘솔에 출력이에 노력하고 있습니다. DWORD를 읽으려면 char[]에서 DWORD에 버퍼 변수를 변경하고 RegQueryValueEx()에 해당 주소를 전달하는 & 연산자를 사용하여, 예를 들면 :

HKEY hKey = 0; 
DWORD dwValue = 0; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(dwValue); 
LONG lRes; 

lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey); 
if (lRes == ERROR_SUCCESS) 
{ 
    lRes = RegQueryValueEx(hKey, TEXT("test"), 0, &dwType, (LPBYTE)&dwValue, &dwBufSize); 
    if (lRes == ERROR_SUCCESS) 
    { 
     if (dwType == REG_DWORD) 
      cout << "key value is " << dwValue << endl; 
     else 
      cout << "key value is not a DWORD" << endl; 
    } 
    else 
     cout << "can not query for key value. Error: " << lRes << endl; 
    RegCloseKey(hKey); 
} 
else 
    cout << "Can not open key. Error: " << lRes << endl; 
+0

답변 해 주셔서 감사합니다. 일부 reg 키에 대한 귀하의 코드를 시도하지만로드 된 아무도. lRes는 일부 키의 경우 2를 반환하고 다른 키의 경우 234를 반환합니다. 내 레지스트리 사용 권한을 확인하고 아무 문제가 없습니다. 나는 관리자로서 내 프로그램을 실행하지만 아직 작동하지 않습니다! –

+0

어떤 뿌리에서 일부 키를 열 수 있지만 혼란 스럽지만 특별한 루트에서 만든 자체 키를 읽을 수 없습니다 !!! –

+0

오류 2는 'ERROR_FILE_NOT_FOUND'이고 오류 234는'ERROR_MORE_DATA '입니다. 둘 다 ['RegQueryValueEx'] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911.aspx) 문서에서 설명됩니다 : "* lpValueName'이 아닌 값을 지정하면 레지스트리에서 함수는'ERROR_FILE_NOT_FOUND'를 반환합니다 ...'lpData' 매개 변수에 의해 지정된 버퍼가 데이터를 담을만큼 크지 않으면 함수는'ERROR_MORE_DATA'를 반환하고'lpcbData '가 가리키는 변수에 필요한 버퍼 크기를 저장합니다 '이 경우,'lpData' 버퍼의 내용은 정의되어 있지 않습니다. * " –