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