Я часами просматривал этот код, пробуя разные вещи. Но безрезультатно. После запуска приведенного ниже кода иногда возникает исключение «.exe вызвал точку останова».
После нажатия кнопки «Продолжить» появится сообщение «Необработанное исключение в 0x00007FFCF935775F (ntdll.dll) в SeekThermalCPP_V3.exe: 0xC0000374: повреждена куча (параметры: 0x00007FFCF93B86B0)».
Затем я снова нажимаю продолжить и получаю мои фактические результаты (которые являются путями к устройствам).
Я попытался установить свои собственные точки останова и посмотреть на значения. Но все они выглядят хорошо. Я переключился между 32 и 64 битами, но это мало что значило.
Кажется, проблема возникает в GetDevicePathString (). если я удаляю его, в двух первых двух методах проблем не возникает.
Большое спасибо, любая помощь и / или совет будут оценены! Если я не делаю что-то правильно, пожалуйста, сообщите.
Я пытаюсь получить путь к устройству. Сначала я нахожу GUID, а затем я смотрю на интерфейсы устройства. Из SetupDiGetDeviceInterfaceDetail я пытаюсь получить SP_DEVICE_INTERFACE_DETAIL_DATA и получить DevicePath. Я хочу использовать этот путь устройства позже для отправки команд на мое USB-устройство. Я думаю об использовании WINUSB API для этого.
#include "stdafx.h"#include <iostream>
#include <string>
#include <windows.h>
#include <SetupAPI.h>
#include <Cfgmgr32.h>
#include <vector>
//#include <winusb.h>
#pragma comment (lib, "Setupapi.lib")
using namespace std;
vector<GUID> EnumerateAllWinUsbGuids();
void FindUsbDevicePath(GUID inputGUID);
void GetDevicePathString(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData);
int main()
{
vector<GUID> guid = EnumerateAllWinUsbGuids();
GUID guid0 = guid[0];
GUID guid1 = guid[1];FindUsbDevicePath(guid0);
FindUsbDevicePath(guid1);
std::getchar();
return 0;
}
vector<GUID> EnumerateAllWinUsbGuids()
{
vector<GUID> dataVECTOR;
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
PSP_DEVINFO_DATA devInfoData = new SP_DEVINFO_DATA();
devInfoData->cbSize = sizeof(SP_DEVINFO_DATA);
for (unsigned int i = 0;; i++)
{
bool checkINFO = SetupDiEnumDeviceInfo(DeviceInfoSet, i, devInfoData);
HKEY hkey = SetupDiOpenDevRegKey(DeviceInfoSet, devInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY);
if (!checkINFO)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
RegCloseKey(hkey);
break;
}
wchar_t dataIN[MAX_DEVICE_ID_LEN];
unsigned long outLength = sizeof(dataIN);
LPCWSTR deviceProperty = L"DeviceInterfaceGUIDs";
long checkGET = RegGetValue(hkey, NULL, deviceProperty, RRF_RT_REG_SZ | RRF_RT_REG_MULTI_SZ, NULL, &dataIN, &outLength);
if (checkGET == 0)
{
GUID guid;
CLSIDFromString(dataIN, (LPCLSID)&guid);
dataVECTOR.push_back(guid);
}
}
return dataVECTOR;
}
void FindUsbDevicePath(GUID inputGUID)
{
HDEVINFO DeviceInfoSet = SetupDiGetClassDevs(&inputGUID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
if (GetLastError() == 8)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
}
cout << "LAST ERROR SetupDiGetClassDevs : " << GetLastError() << endl;
unsigned long i = 0;
while (true)
{
SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;
DeviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
bool checkINFO = SetupDiEnumDeviceInterfaces(DeviceInfoSet, NULL, &inputGUID, i, &DeviceInterfaceData);
if (!checkINFO)
{
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
break;
}
GetDevicePathString(DeviceInfoSet, &DeviceInterfaceData);
i++;
}
}
void GetDevicePathString(HDEVINFO DeviceInfoSet, PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData)
{
unsigned long checkSize;
bool check = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, DeviceInterfaceData, NULL, 0, &checkSize, NULL);
cout << "LAST ERROR SetupDiGetDeviceInterfaceDetail 1: " << GetLastError() << endl;
unsigned long trueSize = checkSize;
int** pointerSize;
cout << "size of a pointer : " << sizeof(pointerSize) << endl;
unsigned long structlength = 6;
if (sizeof(pointerSize) == 8) { structlength = 8; }
PSP_DEVICE_INTERFACE_DETAIL_DATA mem = new SP_DEVICE_INTERFACE_DETAIL_DATA();
mem->cbSize = structlength;
check = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, DeviceInterfaceData, mem, trueSize, &checkSize, NULL);
cout << "LAST ERROR SetupDiGetDeviceInterfaceDetail 2: " << GetLastError() << endl;
wstring dataSTR = wstring(mem->DevicePath);
wcout << dataSTR << endl;
}
Нашел мою ошибку.
Исправлено добавлением следующей строки в мой код:
PSP_DEVICE_INTERFACE_DETAIL_DATA mem = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LPTR, size);
Мне нужно было выделить определенное количество байтов памяти. Причина этого заключается в том, что недостаточно памяти было выделено с использованием «new»; это мое предположение. Если кто-то знает, почему это решило проблему, пожалуйста, прокомментируйте ниже, чтобы дать больше информации.
Пример по ссылке ниже помог мне найти решение.
https://msdn.microsoft.com/en-us/library/windows/desktop/bb204769(v=vs.85).aspx
Других решений пока нет …