2012-11-21 3 views
0

이 사용하는 버퍼를 할당하기 위해 HeapAlloc()을 사용하려고합니다.VC++ HeapAlloc 내부 함수가 널 포인터를 제공합니다.

HANDLE hHeap = GetProcessHeap(); 

while (SetupDiEnumDeviceInfo(DeviceInfoSet, MemberIndex++, DeviceInfoData)) 
{ 
    DWORD DataT; 
    LPTSTR buffer = NULL; 
    DWORD buffersize = 0; 
    // port of device 
    DWORD portnum = 0; 

    GetRegistryProperty(DeviceInfoSet, DeviceInfoData, SPDRP_FRIENDLYNAME, 
     &DataT, buffer, &buffersize, &buffersize); 

    if (!buffer) 
    { 
     cerr << "Null Ptr!" << endl; 
     exit(1); 
    } 
    // Do stuff, uninstall device 


    if (buffer) HeapFree(hHeap, NULL, buffer); 

    } 
} 

을 그리고 GetRegistryProperty() 안에 내가 가진 : GetDeviceInformation() 내부

나는이 예상대로

void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, 
    DWORD Property, PDWORD DataT, LPTSTR buffer, PDWORD buffersize, PDWORD size) 
{ 


    HANDLE hHeap = GetProcessHeap(); 

    while (!SetupDiGetDeviceRegistryProperty(
     DeviceInfoSet, 
     DeviceInfoData, 
     Property, //SPDRP_FRIENDLYNAME or SPDRP_CLASS 
     DataT, //&DataT 
     (PBYTE)buffer, 
     *buffersize, 
     size)) //&buffersize 
    { 
     if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
     { 
      // Change the buffer size. 
      if (buffer) HeapFree(hHeap, NULL, buffer); 

      // Double the size to avoid problems on 
      // W2k MBCS systems per KB 888609. 
      buffer = (LPTSTR)HeapAlloc(hHeap, HEAP_ZERO_MEMORY | 
       HEAP_GENERATE_EXCEPTIONS, *buffersize * 2); 
     } 
     else 
     { 
      // error handling 
      break; 
     } 
    } 
} 

HeapAlloc() 작품 GetRegistryProperty() 반환 될 때까지 (버퍼가 재산으로 가득합니다). 이 시점에서 버퍼는 항상 NULL입니다. 이것은 또한 예상되는가요? 그것을 만든 함수의 수명을 지난 배열을 가리키는 char *를 어떻게 반환 할 수 있습니까? HeapAlloc()이 어떻게 작동하는지 이해하지 못한다고 가정합니다.

내가 별도의 기능에있는 이유는 내가 다른 DWORD Property들과 GetRegistryProperty() 여러 번 전화를하고 싶은 것입니다. 코드를 별도의 함수로 옮기기 전에 완벽하게 작동했습니다. 당신이 그것을 다시 할당 할 때, 당신은 단순히에서 포인터의 사본을 덮어 GetRegistryProperty에, 그래서

void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, 
    DWORD Property, PDWORD DataT, LPTSTR& buffer, PDWORD buffersize, PDWORD size) 

답변

2

통과 기준으로 buffer합니다 (LPTSTR &주의) GetRegistryProperty.

변경에 GetRegistryProperty의 서명 :

void GetRegistryProperty(HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property, PDWORD DataT, LPTSTR& buffer, PDWORD buffersize, PDWORD size) 
1

당신은 값으로 buffer 전달됩니다