熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

使用.NET框架類替代API調用的問題

2013-11-23 19:09:58  來源: Java核心技術 

  避免使用 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) 中內置的 SaveSettingGetSettingGetAllSettings 和 DeleteSetting 方法有點兒用處但卻很可能被它們的局限性弄得精疲力盡所有這些方法都只能在注冊表的 HKEY_CURRENT_USER\Software\VB 和 VBA Program Settings 下的項中使用如果您要在注冊表的其他地方讀取或寫入注冊表項或注冊表值則必須使用復雜的 API 調用或依靠別人的代碼來處理此問題
  
  NET 框架在 MicrosoftWin 名稱空間中提供了一對功能強大的類(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 MicrosoftWin
  
  Dim reg As RegistryKey = RegistryLocalMachine
  
  另一個類是 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 MeValue
  End Function
  End Structure
  
  Private Sub ListLoad()
  Dim reg As RegistryKey = RegistryLocalMachine
  Dim astrValues() As String
  Dim strValue As String
  Dim rd As RegData
  
   清除列表框中的現有項
  lstItemsBeginUpdate()
  lstItemsItemsClear()
  
   打開注冊表項然後使用
   該項的值加載列表框
  reg = regOpenSubKey(conRegKey)
  astrValues = regGetValueNames()
  For Each strValue In astrValues
  rdValue = strValueToString
  rdData = regGetValue(strValue)
  lstItemsItemsAdd(rd)
  Next
  lstItemsEndUpdate()
  End Sub
  
  要編輯示例窗體中的值或添加新值需要運行以下代碼
  
  Private Sub AddOrEdit( _
  ByVal rd As RegData _
  ByVal Mode As frmAddValueAccessMode)
  Dim reg As RegistryKey = RegistryLocalMachine
  Dim frm As New frmAddValue(Mode)
  
  frmKeyName = rdValue
  frmKeyData = rdData
  
  If frmShowDialog() = DialogResultOK Then
  If frmKeyName <> StringEmpty Then
  reg = regOpenSubKey(conRegKey True)
  regSetValue(frmKeyName frmKeyData)
  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 = RegistryLocalMachine
  
  If lstItemsSelectedIndex = Then
  Exit Sub
  End If
  
   刪除選定的項
  strText = StringFormat( _
  Are you sure you want to delete {}? _
  rdValue)
  
  If MessageBoxShow(strText _
  Delete Registry Value _
  MessageBoxButtonsYesNo _
  MessageBoxIconQuestion) = DialogResultYes Then
   打開項允許寫入
  reg = regOpenSubKey(conRegKey True)
  regDeleteValue(rdValue)
   重新加載列表框
  ListLoad()
  End If
  End Sub
  
  此代碼將打開項並請求對其執行寫入操作然後將調用 DeleteValue 方法刪除選定的值
  
  有了示例窗體提供的信息和 NET 框架附帶的文檔便可以輕松地完成與注冊表相關的任何任務而不必使用 Windows API這是一個簡單的對象模型但它提供的功能比 Visual Basic 開發人員先前所擁有的功能更強大
  
  提示如果具有必要的權限您還可以使用遠程計算機上的注冊表您可以調用
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26384.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.