啟用與停用裝置

2021-05-24 04:45:01 字數 1923 閱讀 8729

想要實現類似裝置管理器的功能,其實也不是很難,無非就是呼叫一些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而逐步進行資料的更改,所以在這裡專門記錄...