Я пытаюсь получить информацию (информацию о местоположении, путь к местоположению и т. Д.) Об устройстве, которое в настоящее время подключено к компьютеру в C ++ Win32. Я знаю, как получить эту информацию с помощью функции SetupDiGetDeviceRegistryProperty ()
Прежде чем использовать функцию SetupDiGetDeviceRegistryProperty()
Я должен сначала позвонить SetupDiGetSelectedDevice () потому что мне нужно пройти SP_DEVINFO_DATA
как параметр внутри SetupDiGetDeviceRegistryProperty()
, Это правильно?
Моя проблема: Я никогда не могу получить устройство с помощью функции SetupDiGetSelectedDevice()
, Когда я вызываю эту функцию, она всегда терпит неудачу, то есть возвращает FALSE. GetLastError()
возвращает код e0000211, который я не уверен, что это значит.
Что не так с моим следующим кодом? Если я использую неправильную функцию для получить устройство, то какую функцию я использую, чтобы получить устройство?
INT_PTR WINAPI WinProcCallback( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch (message)
{
case WM_DEVICECHANGE:
{
TCHAR strBuff[256];
PDEV_BROADCAST_HDR h = (PDEV_BROADCAST_HDR) lParam;
if (h->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE) {
printf("h->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE\n");
break;
}
switch (wParam)
{
case DBT_DEVICEARRIVAL:
{
DWORD dataT = 0;
SP_DEVINFO_DATA deviceInfoData = {0};
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
deviceInfoData.ClassGuid = h->dbcc_classguid;
// The following function always works and is successful
HDEVINFO hDevInfo = SetupDiGetClassDevs(&h->dbcc_classguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
printf("hDevInfo == INVALID_HANDLE_VALUE\n");
break;
}
// ERROR OCCURS HERE: The following function ALWAYS returns false: whats going wrong?
if (SetupDiGetSelectedDevice(hDevInfo, &deviceInfoData) == FALSE) {
printf("SetupDiGetSelectedDevice(hDevInfo, &deviceInfoData) == FALSE\n");
break;
}
// Get device location information
DWORD buffersize = 0;
LPTSTR buffer = NULL;
while (!SetupDiGetDeviceRegistryProperty(hDevInfo, &deviceInfoData, SPDRP_LOCATION_INFORMATION, &dataT,
(PBYTE)buffer, buffersize, &buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
// Change the buffer size.
if (buffer)
LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR, buffersize);
}
}
printf("Data: %d: %s\n", i, buffer);
}
break;
Задача ещё не решена.
Других решений пока нет …