何が欠けているのかわかりませんが、私よりも知識のある人に尋ねる時が来ました。ここで見つけた 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 で bitwise-or を外してみましたが、これは役に立ちませんでした。
この API の使用方法に関する私の知識は非常に限られており、今は車輪を回転させる以外に何もしていません。
助けてくれてありがとう。