想要實現類似裝置管理器的功能,其實也不是很難,無非就是呼叫一些api函式,就像本文描述的,採用的api函式就是setupdi系列的函式。不過這類函式有很多,具體的請參見msdn,而實現裝置啟用、停用僅需要用到的就只有5個函式:
setupdigetclassdevs // 獲取裝置資訊集
setupdienumdeviceinfo // 從裝置資訊集中列舉每個裝置的具體資訊
setupdigetdeviceregistryproperty // 從登錄檔中讀取pnp裝置的屬性
setupdisetclassinstallparams // 設定(包括取消)裝置類的安裝引數
setupdicallclassinstaller // 安裝指定裝置
以上函式均在setupapi.h標頭檔案中宣告,該標頭檔案包含在setupapi.lib函式庫中(使用以上函式前需要宣告這個標頭檔案)。
接下來就是如何實現裝置的啟用與停用。
從原理上講,裝置的啟用與停用其實就是對該裝置進行重安裝。
首先,我們需要宣告兩個變數用來儲存指定裝置類的屬性資訊:
hdevinfo m_hdevinfo; // 類似裝置控制代碼,以下暫且稱為裝置控制代碼
sp_devinfo_data m_deviceinfodata; // 裝置詳細屬性資訊
然後呼叫setupdigetclassdevs函式獲取裝置控制代碼的值。(在這個函式中,需要指定裝置類的guid,如果不清楚這個guid,可以在相應的安裝檔案.inf中查詢。注意:是裝置類的guid,不是裝置的guid!)
接著迴圈使用setupdienumdeviceinfo函式列舉對應裝置類中的裝置,並使用setupdigetdeviceregistryproperty函式獲取得到的裝置的詳細資訊,進行判斷是否為所需的裝置(判斷的方式有多種,具體參考msdn,本文採用裝置描述進行判斷)。
一旦列舉結束(即列舉不成功,而且用getlasterror()可以得到錯誤碼259)即可退出迴圈。當然如果找到裝置,即可break退出。
如果找到對應的裝置,就呼叫setupdisetclassinstallparams函式設定安裝的屬性。這裡有個注意的地方需要詳細說明一下:
setupdisetclassinstallparams的函式原型如下:
winsetupapi bool winapi
setupdisetclassinstallparams(
in hdevinfo deviceinfoset,
in psp_devinfo_data deviceinfodata, optional
in psp_classinstall_header classinstallparams, optional
in dword classinstallparamssize
);注意第三個引數psp_classinstall_header classinstallparams,
這裡我們不採用這個結構,而是採用另外乙個結構:sp_propchange_params
並在這個結構中,
設定classinstallheader欄位中(我們發現這個欄位也是乙個結構,就是psp_classinstall_header結構)的installfunction字段值為dif_propertychange,
設定statechange值為dics_enable(該值為啟用,若是停用則為dics_disable)
然後採用強行轉換將其轉為psp_classinstall_header結構。
最後,呼叫setupdicallclassinstaller函式執行裝置的安裝(即:啟用或者停用),注意該函式第乙個引數值應為dif_propertychange。
從裝置管理器中,可以驗證我們的做法。
**展開
Oracle約束的啟用和停用
關於oracle的約束概念和基本操作,我已經在以前的 constraint基礎概念 constraint的簡單操作 兩篇文章中有過比較詳細的介紹了,但是對於如何停用和啟用constraint沒有作特別的描述,以至於在使用plsql中無法忽略constraint而逐步進行資料的更改,所以在這裡專門記錄...
如何啟用Service,如何停用Service。
android 中的service 類似於windows 中的service service 一般沒有使用者操作介面,它執行於系統中不容易被使用者發覺,可以使用它開發如監控之類的程式。一。步驟 第一步 繼承 service 類public class smsservice extends servi...
Oracle約束的啟用和停用
關於oracle的約束概念和基本操作,我已經在以前的 constraint基礎概念 constraint的簡單操作 兩篇文章中有過比較詳細的介紹了,但是對於如何停用和啟用constraint沒有作特別的描述,以至於在使用plsql中無法忽略constraint而逐步進行資料的更改,所以在這裡專門記錄...