資源描述:
《用visual c#調(diào)用windows api函數(shù)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、用VisualC#調(diào)用WindowsAPI函數(shù)www.chinacs.net2001-09-24中文C#技術(shù)站Api函數(shù)是構(gòu)筑Windws應用程序的基石,每一種Windows應用程序開發(fā)工具,它提供的底層函數(shù)都間接或直接地調(diào)用了WindowsAPI函數(shù),同時為了實現(xiàn)功能擴展,一般也都提供了調(diào)用WindowsAPI函數(shù)的接口,也就是說具備調(diào)用動態(tài)連接庫的能力。VisualC#和其它開發(fā)工具一樣也能夠調(diào)用動態(tài)鏈接庫的API函數(shù)。.NET框架本身提供了這樣一種服務,允許受管轄的代碼調(diào)用動態(tài)鏈接庫中實現(xiàn)的非受管轄函數(shù),包括
2、操作系統(tǒng)提供的WindowsAPI函數(shù)。它能夠定位和調(diào)用輸出函數(shù),根據(jù)需要,組織其各個參數(shù)(整型、字符串類型、數(shù)組、和結(jié)構(gòu)等等)跨越互操作邊界。下面以C#為例簡單介紹調(diào)用API的基本過程:動態(tài)鏈接庫函數(shù)的聲明 動態(tài)鏈接庫函數(shù)使用前必須聲明,相對于VB,C#函數(shù)聲明顯得更加羅嗦,前者通過ApiViewer粘貼以后,可以直接使用,而后者則需要對參數(shù)作些額外的變化工作。 動態(tài)鏈接庫函數(shù)聲明部分一般由下列兩部分組成,一是函數(shù)名或索引號,二是動態(tài)鏈接庫的文件名?!∑┤?,你想調(diào)用User32.DLL中的MessageBox函數(shù)
3、,我們必須指明函數(shù)的名字MessageBoxA或MessageBoxW,以及庫名字User32.dll,我們知道Win32API對每一個涉及字符串和字符的函數(shù)一般都存在兩個版本,單字節(jié)字符的ANSI版本和雙字節(jié)字符的UNICODE版本。 下面是一個調(diào)用API函數(shù)的例子:[DllImport("KERNEL32.DLL",EntryPoint="MoveFileW",SetLastError=true,CharSet=CharSet.Unicode,ExactSpelling=true,CallingConventi
4、on=CallingConvention.StdCall)]publicstaticexternboolMoveFile(Stringsrc,Stringdst); 其中入口點EntryPoint標識函數(shù)在動態(tài)鏈接庫的入口位置,在一個受管轄的工程中,目標函數(shù)的原始名字和序號入口點不僅標識一個跨越互操作界限的函數(shù)。而且,你還可以把這個入口點映射為一個不同的名字,也就是對函數(shù)進行重命名。重命名可以給調(diào)用函數(shù)帶來種種便利,通過重命名,一方面我們不用為函數(shù)的大小寫傷透腦筋,同時它也可以保證與已有的命名規(guī)則保持一致,允許帶有
5、不同參數(shù)類型的函數(shù)共存,更重要的是它簡化了對ANSI和Unicode版本的調(diào)用。CharSet用于標識函數(shù)調(diào)用所采用的是Unicode或是ANSI版本,ExactSpelling=false將告訴編譯器,讓編譯器決定使用Unicode或者是Ansi版本。其它的參數(shù)請參考MSDN在線幫助. 在C#中,你可以在EntryPoint域通過名字和序號聲明一個動態(tài)鏈接庫函數(shù),如果在方法定義中使用的函數(shù)名與DLL入口點相同,你不需要在EntryPoint域顯示聲明函數(shù)。否則,你必須使用下列屬性格式指示一個名字和序號。[DllI
6、mport("dllname",EntryPoint="Functionname")][DllImport("dllname",EntryPoint="#123")]值得注意的是,你必須在數(shù)字序號前加“#”下面是一個用MsgBox替換MessageBox名字的例子:[C#]usingSystem.Runtime.InteropServices;publicclassWin32{[DllImport("user32.dll",EntryPoint="MessageBox")]publicstaticexternint
7、MsgBox(inthWnd,Stringtext,Stringcaption,uinttype);}許多受管轄的動態(tài)鏈接庫函數(shù)期望你能夠傳遞一個復雜的參數(shù)類型給函數(shù),譬如一個用戶定義的結(jié)構(gòu)類型成員或者受管轄代碼定義的一個類成員,這時你必須提供額外的信息格式化這個類型,以保持參數(shù)原有的布局和對齊。C#提供了一個StructLayoutAttribute類,通過它你可以定義自己的格式化類型,在受管轄代碼中,格式化類型是一個用StructLayoutAttribute說明的結(jié)構(gòu)或類成員,通過它能夠保證其內(nèi)部成員預期的布
8、局信息。布局的選項共有三種:布局選項描述LayoutKind.Automatic為了提高效率允許運行態(tài)對類型成員重新排序。注意:永遠不要使用這個選項來調(diào)用不受管轄的動態(tài)鏈接庫函數(shù)。LayoutKind.Explicit對每個域按照FieldOffset屬性對類型成員排序LayoutKind.Sequential對出現(xiàn)在受管轄類型定義地方的不受管轄內(nèi)存中的類型