Посмотри пожалуйста редактировать ниже.
Я пытаюсь получить GUID класса / интерфейса подключенного устройства, такого как телевизор или проектор. Я использую функцию RegisterDeviceNotification (), чтобы дать мне GUID, когда телевизор подключен.
Моя проблема: Когда телевизор подключен, я могу быть успешно уведомлен, но когда я иду к доступу GUID устройства (проверяя структуру lParam), я получаю нарушение доступа или ошибку.
Я не могу понять, что происходит не так? Всякий раз, когда я захожу, чтобы получить доступ или использовать GUID, моя программа терпит неудачу, обратите внимание, что моя программа не падает, но окно вывода пишет что-то вроде First-chance exception at 0x001c1a9d in myProgram.exe...
и я не могу понять, что происходит не так?
HDEVNOTIFY *hDeviceNotify;
GUID interfaceClassGuid = { 0x25dbce51, 0x6c8f, 0x4a72, 0x8a,0x6d,0xb5,0x4c,0x2b,0x4f,0xc8,0x35 };
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_CREATE:
{
openConsoleWindow();
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = interfaceClassGuid;
*hDeviceNotify = RegisterDeviceNotification( hWnd, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE );
if (*hDeviceNotify == NULL)
printf("hDeviceNotify = NULL \n");
}
break;
case WM_DEVICECHANGE:
{
PDEV_BROADCAST_DEVICEINTERFACE b = (PDEV_BROADCAST_DEVICEINTERFACE) lParam;
// The following printf NEVER prints out.
// When accessing the below GUID I get an error:
// "First-chance exception at 0x001c1a9d in myProgram.exe: 0xC0000005: Access violation writing location 0x00000000."printf("GUID: Data1: %x, Data2: %x, Data3: %x, Data4: %s \n", b->dbcc_classguid.Data1,
b->dbcc_classguid.Data2, b->dbcc_classguid.Data3, (char*)b->dbcc_classguid.Data4);
// The following function ALWAYS fails.
// GetLastError() gives the error "The parameter is incorrect"HDEVINFO hDevInfo = SetupDiGetClassDevs(&b->dbcc_classguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
//printf("hDevInfo == INVALID_HANDLE_VALUE \n");
outputLastError(_T("hDevInfo == INVALID_HANDLE_VALUE \n"));
}
}
break;
...
Редактировать: Я применил совет Ганса, но все еще возникает та же проблема (printf () никогда не печатает, и возникает исключение):
case WM_DEVICECHANGE:
{
if (wParam != DBT_DEVNODES_CHANGED) {
printf("1: \n");
break;
}
PDEV_BROADCAST_HDR h = (PDEV_BROADCAST_HDR) lParam;
if (h->dbch_devicetype != DBT_DEVTYP_DEVICEINTERFACE) {
printf("2\n");
break;
}
PDEV_BROADCAST_DEVICEINTERFACE b = (PDEV_BROADCAST_DEVICEINTERFACE) h;
// When accessing the below GUID I get an error:
// "First-chance exception at 0x001c1a9d in TEST GUID Error.exe: 0xC0000005: Access violation writing location 0x00000000."printf("GUID: Data1: %x, Data2: %x, Data3: %x, Data4: %s \n", b->dbcc_classguid.Data1,
b->dbcc_classguid.Data2, b->dbcc_classguid.Data3, (char*)b->dbcc_classguid.Data4);
// The following function ALWAYS fails.
// GetLastError() gives the error "The parameter is incorrect"HDEVINFO hDevInfo = SetupDiGetClassDevs(&b->dbcc_classguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
//printf("hDevInfo == INVALID_HANDLE_VALUE \n");
outputLastError(_T("hDevInfo == INVALID_HANDLE_VALUE \n"));
}
}
break;
Задача ещё не решена.
Других решений пока нет …