2011-02-08 4 views
1

RegQueryValueEx를 ​​사용하여 REG_SZ 유형의 Windows 레지스트리에서 값을 추출하려고합니다. 각 문자 앞에 이상한 "\ 000"이있는 것을 제외하고는 값을 얻었습니다. 여기에 의미 일부 이미지는 다음과 같습니다RegQueryValueEx에서 적절한 값 가져 오기

enter image description here

시간 : 내가 원하는

값은 내가 가진 enter image description here

값 (그것은 무선 어댑터의 장치 이름입니다) ERES 코드 :

HKEY hlistkey = NULL; 
    HKEY hkey = NULL; 

    int dwIndex=0; 

    string devName = returndevName(); //return current selected device name using iphlpapi.h 
    WCHAR KeyNameBuf[512]; 
    DWORD keyNameSizBuf = 512; 

    char buffer[512]; 


    RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}") ,0,KEY_READ, &hlistkey); 
    if(!hlistkey) 
    { 
     cout << "failed" << endl; 
    } 
    while(RegEnumKeyEx(hlistkey,dwIndex++,KeyNameBuf,&keyNameSizBuf,0,NULL,NULL,NULL) == ERROR_SUCCESS) 
    { 

     RegOpenKeyEx(hlistkey, KeyNameBuf, 0, KEY_READ | KEY_SET_VALUE, &hkey); 
     if(hkey) 
     { 
      keyNameSizBuf = 512; 
      if(RegQueryValueEx(hkey,TEXT("NetCfgInstanceId"), 0,NULL,(LPBYTE)buffer,&keyNameSizBuf) == ERROR_SUCCESS) 
      { 
       if(strcmp(buffer,devName.c_str()) ==0) 
       { 
        //set value here 
       } 
      } 
      RegCloseKey(hkey); 
     }   
    } 
} 

버퍼를 비교하고 DEVNAME 때문에 나는 단순히 가지고 문자열로 버퍼를 캐스팅 .if 여분의 널 (null)의 동일하지 않을 것 "{"처음 value.i 인 얻을 필요 내가 레지스트리에서 "NetworkAddress"를 변경할 수 있기 전에 레지스트리에있는 devicename의 값.

답변

5

WCHAR을 사용하고 있으므로 유니 코드 지원으로 컴파일한다고 가정합니다. 이것이 사실이라면 bufferWCHAR이어야합니다.

+0

나는 Qing을 사용하고 있기 때문에 Mingw와 함께 netbeans를 사용하고 있는데, 유니 코드 지원을 설정하는 방법을 모르겠지만 유니 코드 때문에 버퍼에 널 (null)이 있습니까? WCHAR 형식으로 버퍼를 설정하면 버퍼를 devname과 어떻게 비교할 수 있습니까? – cftmon

+0

@cftmon 예, ansi 버퍼에 유니 코드 문자열을 넣기 때문에 널 (null)을 얻습니다. devname과 비교하는 방법은 여러 가지가 있습니다. 1. devname에 std :: wstring을 사용하십시오. 2. 유니 코드 문자열을 ansi로 변환합니다. 3. ansi 버전의 레지스트리 함수를 강제로 사용하고 끝에 A를 붙이십시오 (WCHAR 대신 char을 사용하십시오) – Loghorn