이 사용하는 버퍼를 할당하기 위해 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)