2016-08-11 3 views
0

RegEnumValue를 사용하여 단일 값의 이름을 표시하려고합니다. RegGetValue를 사용할 수 있지만 RegEnumValue 함수를 사용하는 방법을 배우려고합니다. 그러나 오류 코드 87이 발생합니다. "매개 변수가 올바르지 않습니다".RegEnumValue가 포함 된 오류 코드 87

int wmain() 
{ 
    //RegOpenKeyEx 
    HKEY hKey = HKEY_CURRENT_USER; 
    LPCWSTR subKey = L"WinSide"; 
    DWORD options = 0; 
    REGSAM samDesired = KEY_QUERY_VALUE; 
    HKEY pkOpenResult; 

    //RegEnumValue 
    DWORD index = 0; 
    WCHAR valueName[16383]; 
    LPWSTR pValueName = valueName; 
    DWORD size=sizeof(valueName); 
    DWORD reserved = NULL; 
    DWORD type; 
    WCHAR data[255]; 
    LPWSTR pData=data; 
    DWORD sizeData = sizeof(data); 

    LONG openKey = RegOpenKeyEx(hKey, subKey, options, samDesired, &pkOpenResult); 

    if (openKey != ERROR_SUCCESS) 
    { 
     wprintf(L"Error opening the key. Code: %li\n"); 
    } 
    else 
    { 
     wprintf(L"Key opened!\n"); 

     LONG enumValue = RegEnumValue(pkOpenResult, index, pValueName, &size, 
             &reserved, &type, pData, &sizeData); 

     if (enumValue != ERROR_SUCCESS) 
      wprintf(L"Error code: %li\n", enumValue); 
     else 
     { 
      wprintf(L"Going to show the value's name here!"); 
     } 

     RegCloseKey(pkOpenResult); 
    } 


    return 0; 
} 

내가 잘못 뭐하는 거지 :

여기 내 코드입니까?

실수해서 죄송합니다.

답변

1

lpReserved은 설명서에 명시된대로 NULL이어야합니다. null이 아닌 값을 전달합니다. 그게 실패의 이유입니다. reserved 변수를 삭제하고 lpReservedNULL을 전달하기 만하면됩니다.

lpcchValueName 인수는 바이트가 아닌 문자를 지정합니다. 오류가 발생한 바이트 수를 전달합니다. 그 실수는 지금 당신을 해칠 필요는 없지만 거기에 버퍼 오버런 오류가있어서 그것을 고칠 필요가 있습니다.

+0

그래서 ...'NULL '에 대한 포인터로'reserved'를 만들 수 있습니까? 그리고'size'는'DWORD size = wcslen (valueName);과 같을 것입니다. 맞습니까? –

+0

옵션 인수도 잘못되었습니다. –

+0

'options '가 잘못된 이유는 무엇입니까? MSDN 기사에서는 "이 매개 변수를 0 또는 다음으로 설정하십시오"라고 말합니다. 나는 심볼릭 링크로 작업하고 있지 않다. –

관련 문제