避免使用 Win API 如果您是一位 Microsoft Visual Basic®
開發人員
您就無法避免調用 Win
API
開發人員有太多的任務需要完成
而 Visual Basic 卻不能提供任何實現方法
例如
在 Visual Basic
中
您很難完成以下任務
確定文件版本信息 在注冊表的任何位置進行讀取和寫入操作
確定用戶的特定文件夾
例如 Microsoft Windows® 收藏夾或個人文件夾
檢索所有可用驅動器的列表
查找用戶的登錄名或計算機名
檢索所有打開窗口的列表
如果僅使用 Visual Basic
中提供的工具
您不可能解決上述任何問題
對於每個問題
開發人員都需要使用 Windows API
許多開發人員使用 Windows API 已經找到了完成這些(以及許多其他)任務的方法
Windows API 存在什麼問題? 為什麼不繼續在
NET 環境中使用 Windows API 呢?如果使用
NET 平台調用服務(稱為
P/Invoke
)
您當然可以這樣做
從 Visual Basic 開發人員的角度來說
調用 Windows API 並不比使用他們所熟悉的 Declare 語句困難
不過
在
NET 環境中使用 Windows API 存在一些比較嚴重的缺陷
您可能需要考慮采取任何可行的措施來避免這些問題
例如
NET 公共語言運行時不會受平台影響
當您使用 Windows API 調用時
您將代碼綁定到編寫代碼的特定平台上(即
相對於其他操作系統的某個特定 Windows 版本或 Windows 本身)
必要時
您需要將代碼轉換到另一個平台上
而這樣做就需要修改使用 API 調用的每行代碼
從
NET 中調用 Windows API(或 DLL 中的任何非托管代碼)不像在 Visual Basic
中那樣簡單
例如
對結構的工作方式的限制使得很難將結構傳遞給 API 調用
此外
由於數據類型的更改以及更嚴格的類型轉換
Visual Basic
的 API 聲明也需要進行更改
根據語言的不同
使用 Windows API(以及通常情況下使用的外部代碼)的技巧也不盡相同
如果您打算在多
NET 語言環境中工作
則需要掌握各種語言的不同技巧
調用 Windows API 的代碼要求調用這些代碼的用戶具有執行此操作的權限
這將影響應用程序的安全保護方案
您需要對此要求提前做出安排
這個問題很簡單
盡管您可以在 Visual Basic
NET 應用程序中繼續使用 Windows API
但通常情況下
您應當盡可能尋找由
NET 框架提供的替代品
雖然
NET 框架的目的並不是要阻止您直接使用 Windows 的功能
但框架的確提供了大量的類
可以幫助您放棄對 Windows API 調用的依賴
如果能夠給出一個完整列表
列出 Win
API 調用以及在
NET 框架中完成相同任務的相應方法(如果有)
可能會很方便
不過本文不涉及此任務
在本文中
您將了解到一些由
NET 框架提供的特定且非常有用的類
它們可以解決您的問題
在每個示例中
本文所討論的類都可以用來替代一個或多個 Win
API 調用
而在 Microsoft Visual Basic
中
您必須調用一個或多個 Win
API 才能完成相同的任務
使用注冊表 如果您與大多數 Visual Basic
開發人員一樣
您會發現 Microsoft Visual Basic for Applications (VBA) 中內置的 SaveSetting
GetSetting
GetAllSettings 和 DeleteSetting 方法有點兒用處
但卻很可能被它們的局限性弄得精疲力盡
所有這些方法都只能在注冊表的 HKEY_CURRENT_USER\Software\VB 和 VBA Program Settings 下的項中使用
如果您要在注冊表的其他地方讀取或寫入注冊表項或注冊表值
則必須使用復雜的 API 調用
或依靠別人的代碼來處理此問題
NET 框架在 Microsoft
Win
名稱空間中提供了一對功能強大的類(Registry 和 RegistryKey)
從而簡化了注冊表的使用
即不再需要 API 調用!
作為演示
請在示例項目的主窗體上單擊 Work with the Registry(使用注冊表)按鈕
此窗體提供了 SOFTWARE\Microsoft\Windows\CurrentVersion\Run 項的 HKEY_LOCAL_MACHINE 配置單元中所有注冊表值的列表
您可以右鍵單擊列表中的任何項
然後選擇插入新項
或者編輯或刪除選定項
如圖
所示
提示
示例窗體也已經過設計
在列表框中按下 Enter 鍵時
可以編輯當前選定的項
按下 Delete 鍵可以刪除選定項
按下 Insert 鍵可以添加一個新值
這些項對應於列表框的上下文菜單中的項
圖 使用 Registry 和 RegistryKey 類輕松檢索和修改 Windows 注冊表中的信息 NET 框架提供了兩個非常有用的類
使您可以輕松使用 Windows 注冊表
第一個類是 Registry
它提供的字段與標准 Registry 配置單元的各字段相對應
ClassesRoot (HKEY_CLASSES_ROOT)
CurrentConfig (HKEY_CURRENT_CONFIG)
CurrentUser (HKEY_CURRENT_USER)
DynData (HKEY_DYN_DATA)
LocalMachine (HKEY_LOCAL_MACHINE)
PerformanceData (HKEY_PERFORMANCE_DATA)
Users (HKEY_USERS)
要使用 Registry 類
只需檢索所需配置單元的引用
示例窗體的 LoadList 過程中包含如下代碼
以便使用注冊表中的 HKEY_LOCAL_MACHINE 配置單元
Imports Microsoft
Win
Dim reg As RegistryKey = Registry
LocalMachine
另一個類是 RegistryKey
它可以完成所有工作
它提供了一組使用 Registry 的方法
表
列出了 RegistryKey 類的所有有用方法
RegistryKey 類還提供以下三個屬性
Name
檢索項的名稱
SubkeyCount
檢索與該項相關聯的子項的數量
ValueCount
檢索與該項相關聯的項值的數量
示例窗體的 ListLoad 過程將檢索所請求項中的所有值
並將檢索到的值添加到窗體的列表框中
Private Const conRegKey As String = _
SOFTWARE\Microsoft\Windows\CurrentVersion\Run
Private Structure RegData
Public Value As String
Public Data As String
Public Overrides _
Function ToString() As String
Return Me
Value
End Function
End Structure
Private Sub ListLoad()
Dim reg As RegistryKey = Registry
LocalMachine
Dim astrValues() As String
Dim strValue As String
Dim rd As RegData
清除列表框中的現有項
lstItems
BeginUpdate()
lstItems
Items
Clear()
打開注冊表項
然後使用
該項的值加載列表框
reg = reg
OpenSubKey(conRegKey)
astrValues = reg
GetValueNames()
For Each strValue In astrValues
rd
Value = strValue
ToString
rd
Data = reg
GetValue(strValue)
lstItems
Items
Add(rd)
Next
lstItems
EndUpdate()
End Sub
要編輯示例窗體中的值或添加新值
需要運行以下代碼
Private Sub AddOrEdit( _
ByVal rd As RegData
_
ByVal Mode As frmAddValue
AccessMode)
Dim reg As RegistryKey = Registry
LocalMachine
Dim frm As New frmAddValue(Mode)
frm
KeyName = rd
Value
frm
KeyData = rd
Data
If frm
ShowDialog() = DialogResult
OK Then
If frm
KeyName <> String
Empty Then
reg = reg
OpenSubKey(conRegKey
True)
reg
SetValue(frm
KeyName
frm
KeyData)
ListLoad()
End If
End If
End Sub
此代碼將再次打開注冊表項
這次將請求寫入項值的權限(此請求由 OpenSubKey 的第二個參數發出)
然後
代碼將調用 SetValue 方法
傳遞圖
所示的對話框窗體中的項名和項值
為簡化工作
可以使用 SetValue 方法添加新值或修改現有值
如果項值不存在
SetValue 方法將添加一個項值
要刪除項值示例窗體將調用以下代碼 Private Sub DeleteKey(ByVal rd As RegData)
Dim strText As String
Dim reg As RegistryKey = Registry
LocalMachine
If lstItems
SelectedIndex =
Then
Exit Sub
End If
刪除選定的項
strText = String
Format( _
Are you sure you want to delete
{
}
?
_
rd
Value)
If MessageBox
Show(strText
_
Delete Registry Value
_
MessageBoxButtons
YesNo
_
MessageBoxIcon
Question) = DialogResult
Yes Then
打開項
允許寫入
reg = reg
OpenSubKey(conRegKey
True)
reg
DeleteValue(rd
Value)
重新加載列表框
ListLoad()
End If
End Sub
此代碼將打開項並請求對其執行寫入操作
然後將調用 DeleteValue 方法刪除選定的值
有了示例窗體提供的信息和
NET 框架附帶的文檔
便可以輕松地完成與注冊表相關的任何任務
而不必使用 Windows API
這是一個簡單的對象模型
但它提供的功能比 Visual Basic
開發人員先前所擁有的功能更強大
提示
如果具有必要的權限
您還可以使用遠程計算機上的注冊表
您可以調用
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26384.html