Windows の [デバイス マネージャー] に移動し、リスト内の (ほぼ) 任意のデバイスをクリックすると、[全般] タブの 1 つの情報が [場所] と呼ばれます。これは、次のいずれかの文字列です。
- 「NVIDIA GeForce GTX 1080 で」のように人間が読める形式
- 「ロケーション 0 (Internal High Definition Audio Bus)」や「PCI バス 9、デバイス 0、機能 0」など、ある程度は便利です。
- 「Port_#0004.Hub_#0015」または「0009.0000.0000.004.000.000.000.000.000」のような USB の場所
この情報は、Windows の統合デバイス プロパティ モデルAPI を通じて入手できます。
私が探しているのは、特定のIMFActivate
オブジェクトからその情報を取得することです。
そうする方法はありますか?そのアクティベーション オブジェクトから「デバイス」情報を取得する方法が見つかりません。私が持っている唯一のデータは「シンボリックリンク」(私の場合、この文字列 : \\?\usb#vid_04b4&pid_8888&mi_00#9&4fe28be&0&0000#{e5323777-f976-4f5b-9b55-b94699c46e44}\global
) ですが、そのリンクの形式は「場所」に表示される文字列とはまったく異なります。
IMFActivate
したがって、私の質問:オブジェクトを指定して、デバイスの「場所」文字列を取得する方法は?
アップデート
setup-api 関数で認識可能なデバイス ID 文字列に提供されたシンボリック リンクを「変換」しIMFActivate
、「場所の文字列」を抽出するために使用しているコードを次に示します。
CString symLink2Location(const CString & _symLink)
{
DEVINST di;
CString devId = _symLink;
devId = devId.Left( devId.Find(L"#{") );
devId.Replace(L"\\\\?\\", L"");
devId.Replace(L"#", L"\\");
const auto rc = CM_Locate_DevNodeW(&di, devId.GetBuffer(), CM_LOCATE_DEVNODE_NORMAL);
if(rc == CR_SUCCESS){
DEVPROPTYPE dpt;
ULONG sz = MAX_PATH;
WCHAR prop[MAX_PATH];
if(CM_Get_DevNode_PropertyW(di, &DEVPKEY_Device_LocationInfo, &dpt, (PBYTE)&prop, &sz, 0) == CR_SUCCESS){
if(dpt == DEVPROP_TYPE_STRING){
return prop;
}
}
}
return L"";
}
更新 2
devmgmt.msc
「サウンド、ビデオ、およびゲーム コントローラー」の下にある 3 つのオーディオ入力デバイスを次に示します。
- MS LifeCam Cinema (TM)、場所: 0000.0014.0000.013.003.000.000.000.000 (symlink:
\\?\SWD#MMDEVAPI#{0.0.1.00000000}.{751fe058-cef2-4d28-bbeb-e438981938d7}#{2eef81be-33fa-4800-9670-1cd474972c3f}
) - MS LifeCam Studio (TM)、場所: 0000.0014.0000.013.004.004.000.000.000 (symlink:
\\?\SWD#MMDEVAPI#{0.0.1.00000000}.{59267d2e-940b-45f5-8655-45372787bd85}#{2eef81be-33fa-4800-9670-1cd474972c3f}
) - SUB2r USB 3.0 HD ウェブカメラ、場所: 0009.0000.0000.004.000.000.000.000.000 (シンボリックリンク:
\\?\SWD#MMDEVAPI#{0.0.1.00000000}.{26a4f608-cbd8-4206-b958-d57ee6847153}#{2eef81be-33fa-4800-9670-1cd474972c3f}
)
3 つすべてが USB デバイスであり、呼び出し時に 3 つすべてがリストされますMFEnumDeviceSources
が、それらの「シンボリック リンク」はハードウェア デバイスに解決されません。