Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取USB设备C+的父级信息+;_C++_Windows_Winapi_Device Instance Id - Fatal编程技术网

C++ 获取USB设备C+的父级信息+;

C++ 获取USB设备C+的父级信息+;,c++,windows,winapi,device-instance-id,C++,Windows,Winapi,Device Instance Id,我正在使用一个MFC工具来检查连接的USB设备的一些驱动程序信息,如位置信息、父设备、硬件id等。我已经获得了所有其他我想要的信息,但我一直在获取设备父设备信息 我使用Setupapi.dll在代码中获取设备信息。 使用SetupDiGetClassDevs函数获取USB设备信息句柄。 使用SetupDiEnumDeviceInfo函数获取特定的设备信息数据。 使用SetupDiGetDeviceRegistryProperty功能获取设备描述和硬件id // List all connecte

我正在使用一个MFC工具来检查连接的USB设备的一些驱动程序信息,如位置信息、父设备、硬件id等。我已经获得了所有其他我想要的信息,但我一直在获取设备父设备信息

我使用Setupapi.dll在代码中获取设备信息。 使用SetupDiGetClassDevs函数获取USB设备信息句柄。 使用SetupDiEnumDeviceInfo函数获取特定的设备信息数据。 使用SetupDiGetDeviceRegistryProperty功能获取设备描述和硬件id

// List all connected USB devices
hDevInfo = SetupDiGetClassDevs(pClassGuid, pszEnumerator, 
    NULL, pClassGuid != NULL ? DIGCF_PRESENT : DIGCF_ALLCLASSES | 
    DIGCF_PRESENT);

// Get device info data
SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData);

// Get device instance id
CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH, 
    0);

// Get device description
SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, 
    SPDRP_DEVICEDESC,
    &dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize);

#define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, 
    b8, pid) EXTERN_C const DEVPROPKEY DECLSPEC_SELECTANY 
    name = { { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6, b7,  b8 } }, pid 
}

// DEVPROP_TYPE_STRING 
DEFINE_DEVPROPKEY(DEVPKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c, 
    0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13);        
// DEVPROP_TYPE_GUID
DEFINE_DEVPROPKEY(DEVPKEY_Device_ContainerId, 0x8c7ed206, 0x3f8a, 0x4827, 
    0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c, 2);     

typedef BOOL(WINAPI *FN_SetupDiGetDevicePropertyW)(
    __in       HDEVINFO DeviceInfoSet,
    __in       PSP_DEVINFO_DATA DeviceInfoData,
    __in       const DEVPROPKEY *PropertyKey,
    __out      DEVPROPTYPE *PropertyType,
    __out_opt  PBYTE PropertyBuffer,
    __in       DWORD PropertyBufferSize,
    __out_opt  PDWORD RequiredSize,
    __in       DWORD Flags
);

FN_SetupDiGetDevicePropertyW fn_SetupDiGetDevicePropertyW = 
    (FN_SetupDiGetDevicePropertyW) 
    GetProcAddress(GetModuleHandle(TEXT("Setupapi.dll")), 
    "SetupDiGetDevicePropertyW");

if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, 
    &DEVPKEY_Device_Manufacturer, &ulPropertyType, (BYTE*)szBuffer, 
    sizeof(szBuffer), &dwSize, 0)) 
{
    _tprintf(TEXT("    Device Manufacturer: \"%ls\"\n"), szBuffer);
}

if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, 
    &DEVPKEY_Device_ContainerId, &ulPropertyType, (BYTE*)szDesc, 
    sizeof(szDesc), &dwSize, 0)) 
{
    StringFromGUID2((REFGUID)szDesc, szBuffer, ARRAY_SIZE(szBuffer));
    _tprintf(TEXT("    ContainerId: \"%ls\"\n"), szBuffer);
}
对我来说,获取USB设备的家长信息非常有用。请提供一些线索


CM\u Locate\u DevNode
在给定设备ID的情况下打开设备句柄

CM\u Get\u Parent
查找父设备

CM\u-Get\u-Device\u-ID\u-Size
CM\u-Get\u-Device\u-ID
取下设备手柄并返回设备ID

样本:

#include <Windows.h>
#include <setupapi.h>
#include <cfgmgr32.h>
#include <tchar.h>
#include <stdio.h>
#define ARRAY_SIZE(arr)     (sizeof(arr)/sizeof(arr[0]))

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

int main()
{
    HDEVINFO hDevInfo;
    GUID guid;
    BYTE buffer[1024];
    DWORD dwRequiredSize;
    DEVINST devInstParent;
    SP_DEVICE_INTERFACE_DATA devInterfaceData;
    SP_DEVINFO_DATA devInfoData;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDevDetail;
    CONFIGRET status;
    TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];
    BOOL bSuccess;

    guid = GUID_DEVINTERFACE_VOLUME;
    hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
    if (hDevInfo == INVALID_HANDLE_VALUE) {
        return 1;
    }

    for (DWORD dwIndex = 0;; dwIndex++)
    {
        ZeroMemory(&devInterfaceData, sizeof(devInterfaceData));
        devInterfaceData.cbSize = sizeof(devInterfaceData);

        if (!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex, &devInterfaceData)) {
            DWORD dwErrorCode = GetLastError();
            if (dwErrorCode == ERROR_NO_MORE_ITEMS)
                break;
            else
                return 1;  
        }

        ZeroMemory(&devInfoData, sizeof(devInfoData));
        devInfoData.cbSize = sizeof(devInfoData);
        pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer;
        pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);

        // Get device interface detail data to get Device Instance from
        // SP_DEVINFO_DATA and Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA
        bSuccess = SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInterfaceData,
            pDevDetail,// SP_DEVICE_INTERFACE_DETAIL_DATA
            sizeof(buffer), &dwRequiredSize, &devInfoData); // SP_DEVINFO_DATA

        status = CM_Get_Parent(&devInstParent, devInfoData.DevInst, 0);
        if (status == CR_SUCCESS) 
        {
            status = CM_Get_Device_ID(devInstParent, szDeviceInstanceID, ARRAY_SIZE(szDeviceInstanceID), 0);
            if (status == CR_SUCCESS)
                _tprintf(TEXT("    %s\n"), szDeviceInstanceID);
        }
        else 
        {
            continue;
        }
    }

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#定义数组大小(arr)(sizeof(arr)/sizeof(arr[0]))
#pragma注释(lib,“setupapi.lib”)
int main()
{
HDEVINFO HDEVINFO;
GUID;
字节缓冲区[1024];
DWORD DWORD所需尺寸;
Devist DevistParent;
SP_设备_接口_数据设备接口数据;
SP_DEVINFO_数据DEVINFO数据;
PSP\设备\接口\详细信息\数据pDevDetail;
配置状态;
TCHAR szDeviceInstanceID[最大设备ID长度];
成功;
guid=guid\u设备接口\u卷;
hDevInfo=SetupDiGetClassDevs(&guid,NULL,NULL,DIGCF_设备接口| DIGCF_PRESENT);
if(hDevInfo==无效的句柄值){
返回1;
}
for(DWORD-dwIndex=0;dwIndex++)
{
零内存(&DeviceInterfaceData,sizeof(DeviceInterfaceData));
DeviceInterfaceData.cbSize=sizeof(DeviceInterfaceData);
if(!setupDienumDeviceInterface(hDevInfo、NULL和guid、dwIndex和DeviceInterfaceData)){
DWORD dwErrorCode=GetLastError();
if(dwErrorCode==错误\u无\u更多\u项)
打破
其他的
返回1;
}
零内存(&devinfo数据,sizeof(devinfo数据));
devinfo.cbSize=sizeof(devinfo数据);
pDevDetail=(PSP_设备_接口_细节_数据)缓冲区;
pDevDetail->cbSize=sizeof(SP_设备_接口_细节_数据);
//获取要从中获取设备实例的设备接口详细信息数据
//SP_设备接口_详细信息_数据中的SP_设备信息_数据和设备路径
bSuccess=SetupDiGetDeviceInterfaceDetail(hDevInfo和DeviceInterfaceData,
pDevDetail,//SP\u设备\u接口\u详细信息\u数据
sizeof(缓冲区),&dwRequiredSize,&DEVINFO数据);//SP\u DEVINFO\u数据
status=CM\u Get\u Parent(&devinstpresent,devinfo.DevInst,0);
如果(状态==CR\U成功)
{
status=CM_Get_Device_ID(devinstpresent,szDeviceInstanceID,数组大小(szDeviceInstanceID),0);
如果(状态==CR\U成功)
_tprintf(文本(“%s\n”),szDeviceInstanceID);
}
其他的
{
继续;
}
}
返回0;
}
调试结果:


< /P>你是否尝试过DepKig?DeVice?父???是C++的,并且有链接,所以请用具体的参数更新你的答案。为了清楚起见,我添加了一个示例。我知道它是一个C和C++ API。我只是希望得到一个更充实的答案,而不是一个简单的C#问题答案链接。(您的答案仍然感觉像是一个代码转储,因此更多地评论您所做的事情仍然会改进答案)从-1到+1least@TarickWelling谢谢你的提醒。我只是希望能更快地找到解决方案。代码样本已经过验证,能够满足OP:)的要求