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