淺析調用VB.NET Windows API函數(shù)
VB.NET還是比較常用的,于是我研究了一下VB.NET Windows API ,在這里拿出來和大家分享一下,希望對大家有用。Windows API就是Windows系統(tǒng)的API函數(shù)簡稱(Application Program Interface,即:應用程序接口函數(shù)),它是Windows操作系統(tǒng)提供給各種開發(fā)基于Windows平臺應用軟件的開發(fā)語言的一些公用的函數(shù),這些函數(shù)一般都比較底層,所以當各種開發(fā)語言使用自帶的函數(shù)或類庫已無法解決問題時,調用VB.NET Windows API函數(shù)往往是一種非常直接、有效的解決方法。但由于在程序中調用Windows API函數(shù)一般都很復雜,所以對于程序員來說,是否能夠靈活的使用Windows API函數(shù),往往也是其水平高低的一個重要標志。但自從微軟推出.Net框架以后,各種開發(fā)基于.Net平臺下的程序語言,如VB.NET、Visual C#等卻很少使用Windows API函數(shù),并且微軟公司也不像以前那樣,提倡在這些.Net開發(fā)語言中使用
#T#VB.NET Windows API函數(shù),其主要的原因如下:
1. Net框架所附帶的類庫.Net FrameWork SDK是一個內(nèi)容豐富、功能強大的軟件開發(fā)包,各種Windows API函數(shù)所實現(xiàn)的各種功能幾乎都可以在這個軟件開發(fā)包中找到與之對應的部分。
2.微軟VB.NET、Visual C#等目的是編寫跨平臺的應用程序,如果在VB.NET、Visual C#等中使用Windows API函數(shù),這也就注定了編寫出的程序只能運行于Windows平臺之下,而弱化了.NET的跨平臺能力。這也就是為什么微軟不提倡在.Net平臺調用 Windows API函數(shù)的原因。
雖然微軟并不提倡在VB.NET、Visual C#中調用Windows API函數(shù),但由于目前.Net 框架推出時間較短,.Net FrameWork SDK中提供的類庫還并不足以完全替換Windows API函數(shù)的所有功能,所以在某些時候,.Net開發(fā)語言還是必須要調用Windows API函數(shù)。
平臺調用、托管DLL、非托管DLL簡介
托管DLL就是能夠在公共語言運行庫(Common Language Runtime,簡稱CLR)中能夠直接引用的,并且擴展名為“DLL”的文件。具體所指就是封裝各種命名空間所在的DLL文件,如System.dll 等。非托管DLL就是平常所的動態(tài)鏈接庫等,其中就包括了封裝所有Windows API函數(shù)的DLL文件。各種非托管DLL中的函數(shù)在公共語言運行庫中不能直接被調用,而需要經(jīng)過.Net框架提供的“平臺調用”服務后才可以。
“平臺調用”是.Net框架為VB.NET、Visual C#等.Net開發(fā)語言提供的一種服務,用以在托管代碼中引入各種非托管DLL中封裝的函數(shù)(其中包括Windows API函數(shù))?!捌脚_調用”依賴于元數(shù)據(jù)在運行時查找導出函數(shù)并封裝其參數(shù)。圖01公共語言運行庫利用“平臺服務”調用非托管DLL中的函數(shù)的流程圖:
圖01:“平臺服務”的調用非托管函數(shù)的流程圖
在托管代碼中使用“平臺調用”服務調用非托管DLL中封裝的函數(shù)時,“平臺服務”將依次執(zhí)行以下操作:
1.查找包含該函數(shù)所在的DLL文件。
2.如果找到,則將該DLL文件 加載到內(nèi)存中。
3.查找函數(shù)在內(nèi)存中的地址并將其參數(shù)推到堆棧上,并封送所需的數(shù)據(jù)。
4.將控制權轉移給非托管函數(shù)。 這樣整個函數(shù)調用完成。
在VB.NET中使用“平臺調用”服務,申明Windows API函數(shù)主要有二種具體的實現(xiàn)方法:
1.使用DllImport特征類來申明Windows API函數(shù)。
2.使用“Declare”語句來申明Windows API函數(shù)。
這二種方法雖有異曲同工之效,但在繁簡上卻有很大差異,第一種方法申明過程比較復雜,很容易在申明Windows API函數(shù)時出錯,所以并不提倡。而第二種方法相對簡單,并且又保存了以前Visual Basic中的很多語法,所以在平常時大都使用這種方法來申明Windows API函數(shù)。