gpt4 book ai didi

c++ - 调用 SetupDiGetDeviceInterfaceDetail 时程序崩溃

转载 作者:行者123 更新时间:2023-11-27 23:24:01 25 4
gpt4 key购买 nike

我正在尝试使用 SetupDiGetDeviceInterfaceDetail() 函数获取设备的路径,但每次调用它时它都会崩溃。我已经为此工作了 12 多个小时,但仍然无法找出它有什么问题......有人可以看看他们是否能找到真正导致这种情况发生的原因吗?继承人的代码:

//DeviceManager.h
#include <windows.h>
//#include <hidsdi.h>
#include <setupapi.h>
#include <iostream>
#include <cfgmgr32.h>
#include <tchar.h>
#include <devpkey.h>
#include <string>

extern "C"{
#include <hidsdi.h>
}

//#pragma comment (lib, "setupapi.lib")

class DeviceManager
{
public:
DeviceManager();
~DeviceManager();

void ListAllDevices();
void GetDeviceHandler();

//HANDLE PSMove;
//byte reportBuffer[57];
GUID guid;
//private:
HDEVINFO deviceInfoSet; //A list of all the devices
SP_DEVINFO_DATA deviceInfoData; //A device from deviceInfoSet

SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailedData;
};

//DeviceManager.cpp
#include"DeviceManager.h"

DeviceManager::DeviceManager()
{
//deviceInterfaceData = new SP_DEVICE_INTERFACE_DATA;
//deviceInterfaceDetailedData = new SP_DEVICE_INTERFACE_DETAIL_DATA;

HidD_GetHidGuid(&guid);
deviceInfoSet = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); //Gets all Devices
GetDeviceHandler();
}

DeviceManager::~DeviceManager()
{
}

void DeviceManager::ListAllDevices()
{
DWORD deviceIndex = 0;

deviceInfoData.cbSize = sizeof(deviceInfoData);

while(SetupDiEnumDeviceInfo(deviceInfoSet, deviceIndex, &deviceInfoData))
{
deviceInfoData.cbSize = sizeof(deviceInfoData);

ULONG tcharSize;
CM_Get_Device_ID_Size(&tcharSize, deviceInfoData.DevInst, 0);
TCHAR* deviceIDBuffer = new TCHAR[tcharSize]; //the device ID will be stored in this array, so the tcharSize needs to be big enough to hold all the info.
//Or we can use MAX_DEVICE_ID_LEN, which is 200
CM_Get_Device_ID(deviceInfoData.DevInst, deviceIDBuffer, MAX_PATH, 0); //gets the devices ID - a long string that looks like a file path.

std::cout << deviceIDBuffer << std::endl;

deviceIndex++;
}
}

void DeviceManager::GetDeviceHandler()
{
DWORD deviceIndex = 0;

SP_DEVINFO_DATA deviceInfoData;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailedData;

deviceInfoData.cbSize = sizeof(deviceInfoData);

while(SetupDiEnumDeviceInfo(deviceInfoSet, deviceIndex, &deviceInfoData))
{
TCHAR deviceID[MAX_DEVICE_ID_LEN];

CM_Get_Device_ID(deviceInfoData.DevInst, deviceID, MAX_DEVICE_ID_LEN, 0);

//std::cout << deviceID << std::endl;

deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
if(SetupDiEnumDeviceInterfaces(deviceInfoSet, &deviceInfoData, &guid, 0, &deviceInterfaceData))
{
DWORD bufferLength = 0;
//deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
deviceInterfaceData.cbSize = 2048;
//std::cout << "it works not" << std::endl;

if(SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, NULL, 0, &bufferLength, NULL))
{
//deviceInterfaceData.cbSize = sizeof(bufferLength);
std::cout << "It works!" << std::endl;
}
else
{
std::cout << GetLastError() << std::endl;
}

}
else
{
//std::cout << GetLastError() << std::endl;
}


deviceIndex++;
}

}

//mainapp.cpp
#pragma once

int main()
{
DeviceManager deviceManager;

return 0;
}

SetupDiGetDeviceInterfaceDetail函数在DeviceManager的GetDeviceHandler()函数中调用。

请帮忙。谢谢。

更新:我发现它在第一个 SetupDiGetDeviceInterfaceDetail 上失败并返回 122 错误 (ERROR_INSUFFICIENT_BUFFER)。但我只是想获得所需的缓冲区大小,所以这怎么可能??

更新 2:是的,我通过将 deviceInterfaceData.cbsize 设置为 2048(用于测试目的的巨大空间)稍微更改了功能(参见上面的代码),现在我得到了 ERROR_INVALID_PARAMETER。越来越乱了。。。我给的参数怎么会无效呢?只是没有意义。唯一的区别是我传入了引用而不是指针,否则我会遇到访问冲突错误...

最佳答案

找到这个主题后,我想分享我的问题,即使用完全相同的源,我从调用中得到了 ERROR_INVALID_USER_BUFFER。

原因是这条线:

deviceInterfaceDetailedData->cbSize =
sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

在我的四字节对齐编译器上,它设置了值 8 而不是所需的值 5。

关于c++ - 调用 SetupDiGetDeviceInterfaceDetail 时程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10668988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com