0

我不确定我错过了什么,但现在是时候向比我更有知识的人提问了。我正在使用我在这里找到的 HDC GUID 。我试图在我的 C++ 代码中打开它:

// note: devGuid is pointer of type struct GUID in the class this ctor belongs to
DeviceHelper::DeviceManager::DeviceManager(GUID devClassGuid) : devGuid(new GUID(devClassGuid)) {
    hDevices = SetupDiGetClassDevs(&devClassGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
    if(INVALID_HANDLE_VALUE == hDevices) {
        throw std::exception("Failure to get a handle to a list of device classes");
    }
}

这个调用通过并且 hDevices 持有一个有效的引用。但是,当我调用 SetupDiEnumDeviceInterfaces() 时,它不会迭代:

// hDevices is assigned in the c-tor as is devGuid which is a pointer
DWORD index(0);
SP_DEVICE_INTERFACE_DATA devInterfaceData = {sizeof(SP_DEVICE_INTERFACE_DATA)};
while(SetupDiEnumDeviceInterfaces(hDevices, NULL, devGuid, index, &devInterfaceData)) {
    // look for the HBA I want from parameters passed to the class function
    // FindHba()
}

SetupDiEnumDeviceInterfaces() 将系统错误代码设置为 249,即“没有更多项目”,但没有进行任何迭代。显然,句柄指向一个空列表。我在调用 SetupDiGetClassDevs() 时遇到了什么问题?我认为可能是 GUID 不是“接口”GUID(即名称中没有“接口”一词)。所以,我尝试使用 DIGCF_DEVICEINTERFACE 取消按位或,但这没有帮助。

我对如何使用这个 API 的了解非常有限,我现在除了旋转我的轮子什么都不做。

谢谢你的帮助。

4

1 回答 1

0

我显然不知道接口在这种情况下的含义。答案似乎是调用 SetupDiEnumDeviceInfo() 而不是使用 SetupDiEnumDeviceInterfaces()。显然,当我问这个问题时,我是在正确的轨道上。事实上,问题似乎与尝试迭代我没有的接口有关。

无论如何,我现在可以通过此代码启用/禁用我的 ATA 设备(这就是我所追求的)。作为参考,我从上一篇文章转到 Stack Overflow:Win32 API 函数以编程方式启用/禁用设备

该代码适用于 C++。

对于非常熟悉 SetupApi 的任何人,我肯定会感谢一些关于这些东西是什么的教育。

于 2012-02-01T15:33:56.903 回答