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 で bitwise-or を外してみましたが、これは役に立ちませんでした。

この API の使用方法に関する私の知識は非常に限られており、今は車輪を回転させる以外に何もしていません。

助けてくれてありがとう。

4

1 に答える 1

0

このコンテキストでインターフェイスが何を意味するのか、私は明らかに無知です。答えは、SetupDiEnumDeviceInterfaces() を使用する代わりに SetupDiEnumDeviceInfo() を呼び出すことだったようです。どうやら、私が質問をしたとき、私は正しい軌道に乗っていたようです。確かに、問題は、私が持っていなかったインターフェースを反復しようとすることに関係していたようです。

いずれにせよ、このコードを使用して ATA デバイスを有効/無効にできるようになりました (これが私の目的でした)。参考までに、この過去の記事から Stack Overflow: Win32 API function to programatically enable/disable device に移動しました。

そのコードは C++ に適応されました。

SetupApi に精通している人には、これらが何であるかについての教育をいただければ幸いです。

于 2012-02-01T15:33:56.903 に答える