用visual c#調(diào)用windows api函數(shù)

用visual c#調(diào)用windows api函數(shù)

ID:20360118

大小:46.00 KB

頁數(shù):6頁

時(shí)間:2018-10-12

用visual c#調(diào)用windows api函數(shù)_第1頁
用visual c#調(diào)用windows api函數(shù)_第2頁
用visual c#調(diào)用windows api函數(shù)_第3頁
用visual c#調(diào)用windows api函數(shù)_第4頁
用visual c#調(diào)用windows api函數(shù)_第5頁
資源描述:

《用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)存中的類型

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會顯示錯(cuò)亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。