SetupDiGetClassDevs函数详解
SetupDiGetClassDevs函數
SetupDiGetClassDevs 函數返回一個包含本機上所有被請求的設備信息的設備信息集句柄。
語法
//C++: HDEVINFO SetupDiGetClassDevs(_In_opt_ const GUID *ClassGuid,_In_opt_ PCTSTR Enumerator,_In_opt_ HWND hwndParent,_In_ DWORD Flags );參數
ClassGuid[輸入參數,可選的]
一個指向GUID的指針,此GUID可標識一個設備安裝類或一個設備接口類。這個指針是可選的,并且可以為NULL。更多關于ClassGuid賦值問題,請參考備注部分。
Enumerator[輸入參數,可選的]
一個指向以空字符結束的字符串的指針,指定了:
即插即用設備枚舉樹的ID,此ID既可以是全局唯一標識符(GUID)也可以是符號名稱。比如:“PCI”可以用于指定PCI的PnP值,符號名稱則包括像“USB”,“PCMCIA”和“SCSI”這樣的Pnp值。
一個PnP設備句柄ID。當指定了一個PnP設備句柄ID時,DIGCF_DEVICEINTERFACE必須在Flag參數上被設置。
hwndParent[輸入參數,可選的]
用于與在設備信息集中安裝設備實例相關聯的用戶界面的頂級窗口句柄。該句柄是可選的,并且可以為NULL。
Flags[輸入參數]
Flags是一個DWORD類型的變量,通過此參數來過濾指定的設備信息集中的設備。此參數可以是以下標志位中的一個或多個的按位或組合,更多有關標志位組合的信息,請參考備注部分。
DIGCF_ALLCLASSES
返回所有已安裝設備的列表或所有設備接口類。
DIGCF_DEVICEINTERFACE
返回支持指定設備接口類的設備。如果Enumerators參數制定了設備的實例ID,那么必須在Flags參數中設置此標志位。
DIGCF_DEFAULT
對于指定的設備接口類,只返回與系統默認設備接口相關聯的設備(如果已設置的話)。
DIGCF_PRESENT
只返回當前系統中存在的(已連接)設備。
DIGCF_PROFILE
只返回當前硬件列表中的一部分設備。
返回值
如果調用成功,SetupDiGetClassDevs將返回一個設備信息集的句柄,該句柄包含了與所提供參數所匹配的所有設備。如果調用失敗,函數返回INVALID_HANDLE_VALUE。要進一步獲取錯誤信息,請調用GetLastError。
備注
當調用完此函數并處理完相應數據后,必須調用SetupDiDestroyDeviceInfoList函。
調用SetupDiGetClassDevsEx來檢索遠程計算機上的設備。
如果SetupDiGetClassDevs使用完,不釋放掉的話,就會一直增長句柄數,內存也大大的增加。。
解決方法:
設備安裝類控制選項
使用以下過濾選項來控制SetupDiGetClassDevs是否返回所有設備:
要返回所有設備,設置標志位DIGCF_ALLCLASSES,并將ClassGuid設置為NULL。
如果只是返回指定設備,不要動DIGCF_ALLCLASSES標志位,而是應該使用CLassGuid提供的Guid。
此外,還可以通過下面的組合來進一步控制設備的過濾條件:
設置DIGCF_PRESENT標志位來返回系統中當前已連接設備。
設置DIGCF_PROFILE標志位來返回當前硬件列表配置文件中的設備。
要想返回一個PnP枚舉設備,使用Enumerator參數,并提供其GUID或符號名稱。如果Enumerator為NULL,SetupDiGetClassDevs返回所有PnP枚舉設備。
設備接口類控制選項
使用以下過濾選項來控制SetupDiGetClassDevs是否返回支持任何設備接口類的設備或僅返回支持指定設備接口類的設備:
要返回支持任何類接口的設備,請同時設置DIGCF_DEVICEINTERFACE和DIGCF_ALLCLASSES標志位,并將ClassGuid設置為NULL。該函數將設備信息設置為表示這種設備的設備信息元素,然后向設備信息元素添加包含設備支持的所有設備接口的設備接口列表。
總結
以上是生活随笔為你收集整理的SetupDiGetClassDevs函数详解的全部內容,希望文章能夠幫你解決所遇到的問題。