C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc

C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc

ID:50368084

大小:84.50 KB

頁(yè)數(shù):24頁(yè)

時(shí)間:2020-03-08

C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc_第1頁(yè)
C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc_第2頁(yè)
C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc_第3頁(yè)
C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc_第4頁(yè)
C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc_第5頁(yè)
資源描述:

《C#調(diào)用API函數(shù)詳細(xì)說(shuō)明.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。

1、C#:[DllImport("kernel32.dll")]是什么意思??這叫引入kernel32.dll這個(gè)動(dòng)態(tài)連接庫(kù)。這個(gè)動(dòng)態(tài)連接庫(kù)里面包含了很多WindowsAPI函數(shù),如果你想使用這面的函數(shù),就需要這么引入。舉個(gè)例子:[DllImport("kernel32.dll")]privatestaticexternvoid函數(shù)名(參數(shù),[參數(shù)]);函數(shù)名就是一個(gè)屬于kernel32.dll里的一個(gè)函數(shù)。完了你就可以用那個(gè)函數(shù)了。kernel32.dll調(diào)用kernel32.dll這個(gè)DLL里面的A

2、PI接口!系統(tǒng)API例如[DllImport("user32.dll")]//--引入APIpublicstaticexternReturnTypeFunctionName(typearg1,typearg2,...);//--聲明方法調(diào)用該方法是和調(diào)用普通方法沒(méi)區(qū)別DLLImport屬性現(xiàn)在是更深入地進(jìn)行探討的時(shí)候了。在對(duì)托管代碼進(jìn)行P/Invoke調(diào)用時(shí),DllImportAttribute類型扮演著重要的角色。DllImportAttribute的主要作用是給CLR指示哪個(gè)DLL導(dǎo)出您想要調(diào)用

3、的函數(shù)。相關(guān)DLL的名稱被作為一個(gè)構(gòu)造函數(shù)參數(shù)傳遞給DllImportAttribute。如果您無(wú)法肯定哪個(gè)DLL定義了您要使用的WindowsAPI函數(shù),PlatformSDK文檔將為您提供最好的幫助資源。在WindowsAPI函數(shù)主題文字臨近結(jié)尾的位置,SDK文檔指定了C應(yīng)用程序要使用該函數(shù)必須鏈接的.lib文件。在幾乎所有的情況下,該.lib文件具有與定義該函數(shù)的系統(tǒng)DLL文件相同的名稱。例如,如果該函數(shù)需要C應(yīng)用程序鏈接到Kernel32.lib,則該函數(shù)就定義在Kernel32.dll中。

4、您可以在MessageBeep中找到有關(guān)MessageBeep的PlatformSDK文檔主題。在該主題結(jié)尾處,您會(huì)注意到它指出庫(kù)文件是User32.lib;這表明MessageBeep是從User32.dll中導(dǎo)出的??蛇x的DllImportAttribute屬性除了指出宿主DLL外,DllImportAttribute還包含了一些可選屬性,其中四個(gè)特別有趣:EntryPoint、CharSet、SetLastError和CallingConvention。EntryPoint在不希望外部托管方法

5、具有與DLL導(dǎo)出相同的名稱的情況下,可以設(shè)置該屬性來(lái)指示導(dǎo)出的DLL函數(shù)的入口點(diǎn)名稱。當(dāng)您定義兩個(gè)調(diào)用相同非托管函數(shù)的外部方法時(shí),這特別有用。另外,在Windows中還可以通過(guò)它們的序號(hào)值綁定到導(dǎo)出的DLL函數(shù)。如果您需要這樣做,則諸如“#1”或“#129”的EntryPoint值指示DLL中非托管函數(shù)的序號(hào)值而不是函數(shù)名。CharSet對(duì)于字符集,并非所有版本的Windows都是同樣創(chuàng)建的。Windows9x系列產(chǎn)品缺少重要的Unicode支持,而WindowsNT和WindowsCE系列則一開(kāi)始

6、就使用Unicode。在這些操作系統(tǒng)上運(yùn)行的CLR將Unicode用于String和Char數(shù)據(jù)的內(nèi)部表示。但也不必?fù)?dān)心—當(dāng)調(diào)用Windows9xAPI函數(shù)時(shí),CLR會(huì)自動(dòng)進(jìn)行必要的轉(zhuǎn)換,將其從Unicode轉(zhuǎn)換為ANSI。如果DLL函數(shù)不以任何方式處理文本,則可以忽略DllImportAttribute的CharSet屬性。然而,當(dāng)Char或String數(shù)據(jù)是等式的一部分時(shí),應(yīng)該將CharSet屬性設(shè)置為CharSet.Auto。這樣可以使CLR根據(jù)宿主OS使用適當(dāng)?shù)淖址?。如果沒(méi)有顯式地設(shè)置Ch

7、arSet屬性,則其默認(rèn)值為CharSet.Ansi。這個(gè)默認(rèn)值是有缺點(diǎn)的,因?yàn)閷?duì)于在Windows2000、WindowsXP和WindowsNT?上進(jìn)行的interop調(diào)用,它會(huì)消極地影響文本參數(shù)封送處理的性能。應(yīng)該顯式地選擇CharSet.Ansi或CharSet.Unicode的CharSet值而不是使用CharSet.Auto的唯一情況是:您顯式地指定了一個(gè)導(dǎo)出函數(shù),而該函數(shù)特定于這兩種Win32OS中的某一種。ReadDirectoryChangesWAPI函數(shù)就是這樣的一個(gè)例子,它只存

8、在于基于WindowsNT的操作系統(tǒng)中,并且只支持Unicode;在這種情況下,您應(yīng)該顯式地使用CharSet.Unicode。有時(shí),WindowsAPI是否有字符集關(guān)系并不明顯。一種決不會(huì)有錯(cuò)的確認(rèn)方法是在PlatformSDK中檢查該函數(shù)的C語(yǔ)言頭文件。(如果您無(wú)法肯定要看哪個(gè)頭文件,則可以查看PlatformSDK文檔中列出的每個(gè)API函數(shù)的頭文件。)如果您發(fā)現(xiàn)該API函數(shù)確實(shí)定義為一個(gè)映射到以A或W結(jié)尾的函數(shù)名的宏,則字符集與您嘗試調(diào)用的函數(shù)有關(guān)系。Windo

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

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

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