HeapAlloc()
で使用されるバッファを割り当てるために使用しようとしていますSetupDiGetDeviceRegistryProperty()
。
内部GetDeviceInformation()
には次のものがあります。
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()
私は持っています:
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() の仕組みを理解していないと思います。
別の関数でそれを持っている理由は、異なるsGetRegistryProperty()
で複数回呼び出したいからです。DWORD Property
コードを別の関数に移動する前は、完全に機能していました。