2013-04-17 5 views
1

"HKEY_LOCAL_MACHINE \ SOFTWARE \ blah \ SetupPath"로 시작하는 레지스트리 키를 CString으로 검색하고 가능한 경우이를 검색하고 싶습니다.레지스트리 키 읽기 및 쓰기. C++ MFC MBCS.

나는 RegOpenKeyEx 함수를 내가 몇 가지 설정에 필요한 것 같습니다 이것에 대한 그래서

LONG WINAPI RegOpenKeyEx(
    _In_  HKEY hKey, 
    _In_opt_ LPCTSTR lpSubKey, 
    _Reserved_ DWORD ulOptions, 
    _In_  REGSAM samDesired, 
    _Out_  PHKEY phkResult 
); 

에 MSDN을 참조하십시오.

HKEY hKey = HKEY_LOCAL_MACHINE; 
LPCTSTR lpSubKey = "SOFTWARE\blah\SetupPath"; 

그리고 키가 존재하는지 확인하기는

LONG res = RegOpenKeyEx(hKey, lpSubKey, 0, 0, 0); 
if(res == ERROR_SUCCESS) 
    // The key exists 

지금 키가 나는 CString을에,이 무엇을 읽을 수있는 경우 않습니다. RegQueryValueEx도 볼 수 있습니다.

LONG WINAPI RegQueryValueEx(
    _In_   HKEY hKey, 
    _In_opt_  LPCTSTR lpValueName, 
    _Reserved_ LPDWORD lpReserved, 
    _Out_opt_ LPDWORD lpType, 
    _Out_opt_ LPBYTE lpData, 
    _Inout_opt_ LPDWORD lpcbData 
); 

이 기능을 호출하기 전에 설정이 필요합니다.

HKEY hKey = HKEY_LOCAL_MACHINE; 
lpSubKey = "SOFTWARE\blah\SetupPath"; 
LPDWORD type = null; 
LPDWORD data = null; 

지금은

LONG res2 = RegValueQueryEX(hKey, lpSubKey, 0, type, data,0); 

그럼 내가 유형을 확인할 수 있습니다 생각하고 문자열로 캐스팅 호출 할 수 있습니다?

CString regVal; 
if(res2 == ERROR_SUCCESS) 
    if(type == REG_SZ) 
     if(data != null) 
      regVal = new CString((LPSTR)data); 

모두 맞습니까? 내가 누락되었거나해야 할 일은 무엇입니까?

답변

0

아니요. 맞습니다. 가장 큰 오해는 포인터가 C++에서 작동하는 방식입니다. 포인터 인수에 NULL을 제공하는 것만으로는 충분하지 않으므로 RegOpenKeyEx 또는 RegValueQueryEx 루틴이 해당 변수에 값을 반환 할 수 있도록 변수에 대한 포인터를 제공해야합니다. 또한 CString에 할당하는 방법을 잘못 이해 한 것 같습니다 (new은 필요 없음). 마지막으로 'setup'을 할 필요가없는 오류는 아니지만 값을 함수에 직접 전달하면됩니다.

먼저 키를 엽니 다

HKEY key; 
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\blah", 0, 0, &key); 

다음 마지막으로 키

을 닫습니다

DWORD type, size; 
char data[99]; 
size = sizeof(data); 
RegQueryValueEx(key, "SetupPath", 0, &type, (BYTE*)data, &size); 

은 다음 CString

CString regval(data); 

에 값을 할당 값을 얻을

해당 코드를 검사 할 때 오류가 없으므로 추가해야합니다. 또한 나는 당신이 얻을 수있는 모든 값이 99 바이트에 맞을 것이라고 가정하고 있는데, 그것은 사실이 아닐 수도 있습니다.

key 변수에 대한 포인터를 전달하는 방법에 유의하십시오. 따라서 RegOpenKeyEx이 키를 반환 할 수 있습니다. 그런 다음 RegValueQueryExRegCloseKey에 대한 호출에서 해당 키를 사용합니다. typesize 변수와 동일합니다. 또한 RegOpenKeyExRegValueQueryEx 사이의 경로를 분할했습니다. I 생각하면이 맞습니다.

정확하지는 않은지, 테스트하지는 않았지만 조금 더 가까이 있어야합니다.

0

모두 맞습니까? 내가 누락되었거나해야 할 일은 무엇입니까? 당신은 단지 키를 읽으려고하는 경우 액세스 권한이 RegOpenKeyEx에 마스크로

  1. 패스 KEY_READ | KEY_QUERY_VALUE :

는 존으로 대답 또한 나는 약간의 수정을 건의 할 것입니다.

  • RegQueryValueEx은 버퍼 크기가 너무 작 으면 ERROR_MORE_DATA을 반환 할 수 있습니다. 미리 데이터의 크기를 알지 못하면 루프로 호출 할 수 있습니다.