熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

VB.NET編程中調用Windows API

2013-11-13 10:05:08  來源: .NET編程 
Windows API就是Windows系統的API函數簡稱(Application Program Interface應用程序接口函數)它是Windows操作系統提供給各種開發基於Windows平台應用軟件的開發語言的一些公用的函數這些函數一般都比較底層所以當各種開發語言使用自帶的函數或類庫已無法解決問題時調用Windows API函數往往是一種非常直接有效的解決方法但由於在程序中調用Windows API函數一般都很復雜所以對於程序員來說是否能夠靈活的使用Windows API函數往往也是其水平高低的一個重要標志但自從微軟推出Net框架以後各種開發基於Net平台下的程序語言如Visual Basic NetVisual C#等卻很少使用Windows API函數並且微軟公司也不像以前那樣提倡在這些Net開發語言中使用Windows API函數其主要的原因如下

   Net框架所附帶的類庫Net FrameWork SDK是一個內容豐富功能強大的軟件開發包各種Windows API函數所實現的各種功能幾乎都可以在這個軟件開發包中找到與之對應的部分

   微軟Visual Basic NetVisual C#等目的是編寫跨平台的應用程序如果在Visual Basic NetVisual C#等中使用Windows API函數這也就注定了編寫出的程序只能運行於Windows平台之下而弱化了NET的跨平台能力這也就是為什麼微軟不提倡在Net平台調用Windows API函數的原因

  雖然微軟並不提倡在Visual Basic NetVisual C#中調用Windows API函數但由於目前Net 框架推出時間較短Net FrameWork SDK中提供的類庫還並不足以完全替換Windows API函數的所有功能所以在某些時候Net開發語言還是必須要調用Windows API函數

  一平台調用托管DLL非托管DLL簡介

  托管DLL就是能夠在公共語言運行庫(Common Language Runtime簡稱CLR)中能夠直接引用的並且擴展名為DLL的文件具體所指就是封裝各種命名空間所在的DLL文件如Systemdll等非托管DLL就是平常所的動態鏈接庫等其中就包括了封裝所有Windows API函數的DLL文件各種非托管DLL中的函數在公共語言運行庫中不能直接被調用而需要經過Net框架提供的平台調用服務後才可以

  平台調用Net框架為Visual Basic NetVisual C#等Net開發語言提供的一種服務用以在托管代碼中引入各種非托管DLL中封裝的函數(其中包括Windows API函數)平台調用依賴於元數據在運行時查找導出函數並封裝其參數公共語言運行庫利用平台服務調用非托管DLL中的函數的流程圖



平台服務的調用非托管函數的流程圖
  在托管代碼中使用平台調用服務調用非托管DLL中封裝的函數時平台服務將依次執行以下操作

  . 查找包含該函數所在的DLL文件

  . 如果找到則將該DLL文件 加載到內存中

  . 查找函數在內存中的地址並將其參數推到堆棧上並封送所需的數據

  . 將控制權轉移給非托管函數 這樣整個函數調用完成

  在Visual Basic Net中使用平台調用服務申明Windows API函數主要有二種具體的實現方法

  . 使用DllImport特征類來申明Windows API函數

  . 使用Declare語句來申明Windows API函數

  這二種方法雖有異曲同工之效但在繁簡上卻有很大差異第一種方法申明過程比較復雜很容易在申明Windows API函數時出錯所以並不提倡而第二種方法相對簡單並且又保存了以前Visual Basic中的很多語法所以在平常時大都使用這種方法來申明Windows API函數

二.VBNet查看文件中圖標的函數及申明Windows API的方法

  Visual Basic Net要實現查看文件中的圖標目前只使用Net FrameWork SDK是無法實現這種功能的正如前面所說主要是由於Net FrameWork SDK推出的時間較短其功能還不可能面面俱到解決問題的關鍵是正確使用Windows API函數其中所涉及到的Windows API函數主要有二個其一是獲得指定文件中的圖標數目其二是從指定文件的指定位置導出圖標的Windows句柄這二個函數都位於Shelldll文件中並且函數的入口點都為ExtractIcon下面是在Visual Basic Net中分別使用DllImport特征類和Declare語句申明這二個Windows API函數的具體方法

  (使用DllImport特征類來申明Windows API函數

  下面是在Visual Basic Net中使用DllImport特征類申明二個Windows API函數的具體示例

函數ExtractIcon其功能是是從指定文件的指定位置導出圖標的Windows句柄
< SystemRuntimeInteropServicesDllImport ( Shelldll EntryPoint := ExtractIcon ) > _
Public Function _
ExtractIcon ( ByVal src As SystemIntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As SystemIntPtr
End Function
函數Icon_Num其功能是獲得指定文件中的圖標數目
< SystemRuntimeInteropServicesDllImport ( Shelldll EntryPoint := ExtractIcon ) > _
Public Function _
Icon_Num ( ByVal src As SystemIntPtr ByVal strFileName As string ByVal uiIconIndex As Integer ) As Integer
End Function
  在使用DllImport特征類申明Windows API函數時如果申明的函數名稱和函數的入口點相同則可以在申明Windows API函數時省略定義函數入口點對應的代碼即EntryPoint對象字段對應的代碼這樣聲明ExtractIcon函數的代碼也可以簡化為如下所示

< SystemRuntimeInteropServicesDllImport ( Shelldll ) > _
Public Function _
ExtractIcon ( ByVal src As SystemIntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As SystemIntPtr
End Function
  (使用Declare語句來申明Windows API函數

  使用Declare語句的確比使用DllImport特征類要簡單了許多下面是在Visual Basic Net中使用Declare語句來聲明上述二個Windows API函數的具體方法

Declare Auto Function ExtractIcon Lib Shelldll Alias ExtractIcon ( ByVal src As SystemIntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As SystemIntPtr
聲明ExtractIcon函數
Declare Auto Function Icon_Num Lib Shelldll Alias ExtractIcon ( ByVal src As SystemIntPtr ByVal strFileName As string ByVal uiIconIndex As Integer ) As Integer
聲明Icon_Num函數
  在Visual Basic Net中聲明Windows API函數時Declare語句中Alias關鍵字的作用相當於使用DllImport特征類中的EntryPoint對象字段同樣在使用Declare語句聲明Windows API函數時如果聲明的函數和函數的入口點相同也可以省略Alias關鍵字對應的代碼所以ExtractIcon函數也可以簡化為如下

Declare Auto Function ExtractIcon Lib Shelldll ( ByVal src As SystemIntPtr ByVal strFileName As string ByVal uiIconIndex As UInt ) As SystemIntPtr
  下面就結合一個示例的編寫過程來掌握的這二個Windows API函數的具體使用方法這個示例的作用就是讀取指定文件中的圖標數目並顯示文件中的圖標

三.本文中程序的編寫調試和運行環境

  (視窗高級服務器版

  (Visual Studio Net 企業結構設計版Net FrameWork SDK版本號

四.Visual Basic Net讀取文件中的圖標的實現步驟

  下面介紹的示例其功能讀取指定文件中包含的圖標數目並把這些圖標全部顯示出來下面是這個示例的實現步驟

   啟動Visual Studio Net

   選擇菜單【文件】|【新建】|【項目】後彈出【新建項目】對話框

   將【項目類型】設置為【Visual Basic項目】

   將【模板】設置為【Windows應用程序】

   在【名稱】文本框中輸入【Visual Basic Net查看文件中的圖標】

   在【位置】的文本框中輸入【E:\VSNET項目】然後單擊【確定】按鈕這樣在【E:\VSNET項目】目錄中就產生了名稱為【Visual Basic Net查看文件中的圖標】文件夾裡面存放著【Visual Basic Net查看文件中的圖標】項目的所有文件具體如圖所示



【Visual Basic Net查看文件中的圖標】項目的【新建項目】對話框
   選擇菜單【項目】|【添加新項】在彈出的對話框中的【模板】設置為【模塊】【名稱】文本框設置為【Modulevb】後單擊【打開】按鈕則在項目中增加了一個模板文件名稱為【Modulevb】

   把Visual Stuido Net的當前窗口切換到Modulevb的代碼編輯窗口並在其Module的代碼區中添加下列代碼下列代碼是用二種方式聲明二個Windows API函數

< SystemRuntimeInteropServicesDllImport ( Shelldll ) > _
Public Function _
ExtractIcon ( ByVal src As SystemIntPtr ByVal strFileName As String ByVal uiIconIndex As UInt ) As SystemIntPtr
End Function
聲明ExtractIcon函數
Declare Auto Function Icon_Num Lib Shelldll Alias ExtractIcon ( ByVal src As SystemIntPtr ByVal strFileName As String ByVal uiIconIndex As Integer ) As Integer
   把Visual Studio Net的當前窗口切換到Form窗體的設計查看並從【工具箱】中的【Windows窗體】選項卡中拖入下列組件到Form窗體

  四個Label組件其中二個用以顯示提示信息另外二個分別用以顯示選擇的文件名稱和這個文件中包含的圖標數目

  一個ListView組件利用其顯示大圖標的屬性用以顯示選定文件中的圖標

  一個OpenFileDialog組件用以選擇要查看圖標的文件名稱

  一個ImageList組件它起的是橋梁的作用首先把從文件中導出的圖標存放到這裡然後再提供ListView組件顯示出來

  一個Button組件

   按照表中數值來設定設定組件的主要屬性

組件類型 組件名稱 屬性 設置結果 Form Form Text VBNET查看文件中的圖標 Form MaximizeBox False Form MinimizeBox False Form FormBorderStyle FixedSingle ListView ListView ImageList LargeImageList ListView MultiSelect False ListView Size Size ( ) Button Button Text 選擇文件 Button FlatStyle Flat ImageList ImageList Size Size ( ) ImageList TransparentColor ColorTransparent Label Label Text 文件名稱 Label Text 圖標數目 Label Text Label Text     表【Visual Basic Net查看文件中的圖標】項目窗體中各組件的主要屬性設定數值表

  並按照圖中各組件的位置大小和排列方式來調整窗體中各個組件



【Visual Basic Net查看文件中的圖標】項目的設計界面
   把Visual Studio Net當前窗口切換到Formvb的代碼編輯窗口並用下列代碼替換Formvb中的Button組件的Click事件的處理代碼下列代碼是在Button組件的Click事件中處理查看文件中圖標的功能具體如下

Private Sub Button_Click ( ByVal sender As SystemObject ByVal e As SystemEventArgs ) Handles ButtonClick
If OpenFileDialogShowDialog ( ) = DialogResultOK Then
 清除組件中的所有項目
 ListViewItemsClear ( )
 ImageListImagesClear ( )
 Dim sfName As String = OpenFileDialogFileName
 LabelText = sfName
 Dim iIcon_Num As Integer = Icon_Num ( IntPtrZero sfName )
 顯示文件中的圖標數目
 LabelText = iIcon_NumToString ( )
 Dim i As Integer
 For i = To iIcon_Num Step
  強制實現int到uint類型轉換
  Dim j As UInt
  j = SystemConvertToUInt ( i )
  Dim hIcon As SystemIntPtr = ExtractIcon ( IntPtrZero sfName j )
  在imageList組件中加入當然提取的圖標
  ImageListImagesAdd ( IconFromHandle ( hIcon )ToBitmap ( ) )
  在ListView組件中加入一個項目
  ListViewItemsAdd ( + ( i + )ToString ( ) + 個圖標 )
  把加入項目的圖象索引指向剛才加入圖標在imagList組件中的索引從而顯示圖標
  ListViewItems ( i )ImageIndex = i
 Next i
End If
End Sub
   至此在上述步驟都正確執行後【Visual Basic Net查看文件中的圖標】項目的全部工作就完成了單擊快捷鍵F就可以運行程序此時單擊【選擇文件】按鈕選擇文件後程序就能夠讀取這個文件中的圖標及其數目並顯示出來了具體如圖所示



【Visual Basic Net查看文件中的圖標】項目的運行界面
五.總結

  解決Visual Basic Net查看文件中的圖標的關鍵並非是使用Net框架中提供的類庫而是使用Windows的API函數雖然這與利用Visual Basic Net開發跨平台程序的初衷相違背但的確不失為一種解決問題的方法有些時候通過Windows API函數能夠快捷方便的解決實際問題而這往往是只使用Net FrameWork SDK所望塵莫及的但隨著Net FrameWork SDK內容的不斷豐富各種新的組成部分和新的功能不斷加入可以預見的是在未來的Net FrameWork SDK中必將擁有可以替換本文中介紹的二個Windows API函數的組成部分

From:http://tw.wingwit.com/Article/program/net/201311/12511.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.