vb.net編程中調用Window AP函數

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

  1. Net框架所附帶的類庫.Net FrameWork SDK是一個內容豐富、功能強大的軟件開發包,各種Windows API函數所實現的各種功能幾乎都可以在這個軟件開發包中找到與之對應的部分。
  
  2.微軟Visual Basic .Net、Visual C#等目的是編寫跨平臺的應用程序,如果在Visual Basic .Net、Visual C#等中使用Windows API函數,這也就註定了編寫出的程序只能運行於Windows平臺之下,而弱化了.NET的跨平臺能力。這也就是爲什麼微軟不提倡在.Net平臺調用Windows API函數的原因。
  
  雖然微軟並不提倡在Visual Basic .Net、Visual C#中調用Windows API函數,但由於目前.Net 框架推出時間較短,.Net FrameWork SDK中提供的類庫還並不足以完全替換Windows API函數的所有功能,所以在某些時候,.Net開發語言還是必須要調用Windows API函數。
  
  一.平臺調用、託管DLL、非託管DLL簡介:
  託管DLL就是能夠在公共語言運行庫(Common Language Runtime,簡稱CLR)中能夠直接引用的,並且擴展名爲“DLL”的文件。具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非託管DLL就是平常所的動態鏈接庫等,其中就包括了封裝所有Windows API函數的DLL文件。各種非託管DLL中的函數在公共語言運行庫中不能直接被調用,而需要經過.Net框架提供的“平臺調用”服務後纔可以。
  
  “平臺調用”是.Net框架爲Visual Basic .Net、Visual C#等.Net開發語言提供的一種服務,用以在託管代碼中引入各種非託管DLL中封裝的函數(其中包括Windows API函數)。“平臺調用”依賴於元數據在運行時查找導出函數並封裝其參數。圖01公共語言運行庫利用“平臺服務”調用非託管DLL中的函數的流程圖:
  

圖01:“平臺服務”的調用非託管函數的流程圖


  在託管代碼中使用“平臺調用”服務調用非託管DLL中封裝的函數時,“平臺服務”將依次執行以下操作:
  
  1.查找包含該函數所在的DLL文件。
  
  2.如果找到,則將該DLL文件 加載到內存中。
  
  3.查找函數在內存中的地址並將其參數推到堆棧上,並封送所需的數據。
  
  4.將控制權轉移給非託管函數。 這樣整個函數調用完成。
  
  在Visual Basic .Net中使用“平臺調用”服務,申明Windows API函數主要有二種具體的實現方法:
  
  1.使用DllImport特徵類來申明Windows API函數。
  
  2.使用“Declare”語句來申明Windows API函數。
  
  這二種方法雖有異曲同工之效,但在繁簡上卻有很大差異,第一種方法申明過程比較複雜,很容易在申明Windows API函數時出錯,所以並不提倡。而第二種方法相對簡單,並且又保存了以前Visual Basic中的很多語法,所以在平常時大都使用這種方法來申明Windows API函數。
  
  二.vb.net查看文件中圖標的函數及申明Windows API的方法:
  Visual Basic .Net要實現查看文件中的圖標,目前只使用.Net FrameWork SDK是無法實現這種功能的,正如前面所說,主要是由於.Net FrameWork SDK推出的時間較短,其功能還不可能面面俱到。解決問題的關鍵是正確使用Windows API函數,其中所涉及到的Windows API函數主要有二個:其一是獲得指定文件中的圖標數目;其二是從指定文件的指定位置導出圖標的Windows句柄。這二個函數都位於“Shell32.dll”文件中,並且函數的入口點都爲“ExtractIcon”。下面是在Visual Basic .Net中分別使用DllImport特徵類和“Declare”語句申明這二個Windows API函數的具體方法。
  
  (1).使用DllImport特徵類來申明Windows API函數:
  
  下面是在Visual Basic .Net中使用DllImport特徵類申明二個Windows API函數的具體示例:
  
  '函數ExtractIcon,其功能是是從指定文件的指定位置導出圖標的Windows句柄。
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
ExtractIcon ( 
ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function

  '函數Icon_Num,其功能是獲得指定文件中的圖標數目
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" , EntryPoint := "ExtractIcon" ) > _
Public Function _
Icon_Num ( 
ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As Integer ) As Integer
End Function

  
  在使用DllImport特徵類申明Windows API函數時,如果申明的函數名稱和函數的入口點相同,則可以在申明Windows API函數時,省略定義函數入口點對應的代碼,即EntryPoint對象字段對應的代碼,這樣聲明ExtractIcon函數的代碼也可以簡化爲如下所示:
  
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" ) > _
Public Function _
ExtractIcon ( 
ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
End Function

  
  (2).使用“Declare”語句來申明Windows API函數:
  
  使用“Declare”語句的確比使用DllImport特徵類要簡單了許多,下面是在Visual Basic .Net中使用“Declare”語句來聲明上述二個Windows API函數的具體方法:
  
  
Declare Auto Function ExtractIcon Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
'聲明ExtractIcon函數

  
Declare Auto Function Icon_Num Lib "Shell32.dll" Alias "ExtractIcon" ( ByVal src As System.IntPtr , 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 "Shell32.dll" ( ByVal src As System.IntPtr , ByVal strFileName As string , ByVal uiIconIndex As UInt32 ) As System.IntPtr
  
  下面就結合一個示例的編寫過程來掌握的這二個Windows API函數的具體使用方法,這個示例的作用就是讀取指定文件中的圖標數目,並顯示文件中的圖標。
  
  三.本文中程序的編寫、調試和運行環境:
  (1).視窗2000高級服務器版。
  
  (2).Visual Studio .Net 2003企業結構設計版,.Net FrameWork SDK版本號4322。
  
  四.Visual Basic .Net讀取文件中的圖標的實現步驟:
  下面介紹的示例,其功能讀取指定文件中包含的圖標數目,並把這些圖標全部顯示出來。下面是這個示例的實現步驟:
  
  1.啓動Visual Studio .Net。
  
  2.選擇菜單【文件】|【新建】|【項目】後,彈出【新建項目】對話框。
  
  3.將【項目類型】設置爲【Visual Basic項目】。
  
  4.將【模板】設置爲【Windows應用程序】。
  
  5.在【名稱】文本框中輸入【Visual Basic .Net查看文件中的圖標】。
  
  6. 在【位置】的文本框中輸入【E:/VS.NET項目】,然後單擊【確定】按鈕,這樣在【E:/VS.NET項目】目錄中就產生了名稱爲【Visual Basic .Net查看文件中的圖標】文件夾,裏面存放着【Visual Basic .Net查看文件中的圖標】項目的所有文件。具體如圖02所示:
 
  

圖02:【Visual Basic .Net查看文件中的圖標】項目的【新建項目】對話框


  7. 選擇菜單【項目】|【添加新項】,在彈出的對話框中的【模板】設置爲【模塊】,【名稱】文本框設置爲【Module1.vb】後。單擊【打開】按鈕,則在項目中增加了一個模板文件,名稱爲【Module1.vb】。
  
  8. 把Visual Stuido .Net的當前窗口切換到Module1.vb的代碼編輯窗口,並在其Module1的代碼區中添加下列代碼,下列代碼是用二種方式聲明二個Windows API函數:
  
< System.Runtime.InteropServices.DllImport ( "Shell32.dll" ) > _
Public Function _
ExtractIcon ( 
ByVal src As System.IntPtr , ByVal strFileName As String , ByVal uiIconIndex As UInt32  

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章