轉(zhuǎn)自:
http://hacker.cnblogs.com/archive/2004/08/12/32563.aspx1, PInvoke什么意思? Platform Invocation Services
2, 干什么用? 導(dǎo)入外部函數(shù)?什么是外部函數(shù),就是不屬于.Net托管的函數(shù)。
3,如何用?看下面的例子。用[DllImport(dllname)]來實(shí)現(xiàn),但是首先要把System.Runtiime.InteropServices using進(jìn)來。但是不using也行,就要敲全稱,隨你便了。
4,萬一我的程序中已經(jīng)有了一個函數(shù)叫MessageBoxA怎么辦?這時(shí)候,可以使用EntryPoint來幫忙,下面的例子中,你把自己的函數(shù)定義為MyMsg.
5,charset如何使用?****A的是Ansi編碼,****W的是unicode編碼,如何使用charset,看你的函數(shù)調(diào)用而定。2K以后都用unicode了,前面的9x都是ansi編碼,但是這是缺省的,微軟給9x打布丁支持unicode不算。
API有兩個版本: A(ASNI)版本和W(Unicode)版本. A版本調(diào)用時(shí)候會用ANSI來封送字符串,一般是win95/98上。W版本用Unicode來封送,在NT,2K和XP上。
.Net和win32交互的時(shí)候,默認(rèn)是使用CharSet.Ansi來傳送。
在 DllImportAttribute.ExactSpelling 字段為 true 時(shí)(它是 Visual Basic .NET 中的默認(rèn)值),平臺調(diào)用將只搜索您指定的名稱。例如,如果指定 MessageBox,則平臺調(diào)用將搜索 MessageBox,如果它找不到完全相同的拼寫則失敗。
當(dāng) ExactSpelling 字段為 false(它是 C++ 托管擴(kuò)展和 C# 中的默認(rèn)值),平臺調(diào)用將首先搜索未處理的別名 (MessageBox),如果沒有找到未處理的別名,則將搜索已處理的名稱 (MessageBoxA)。請注意,ANSI 名稱匹配行為與 Unicode 名稱匹配行為不同。
6,Dll里面的callback函數(shù)如何實(shí)現(xiàn)?看下面這個例子:
7,MarshalAs如何用,什么時(shí)候用?
在MessageBox傳遞string去Dll的時(shí),C#編譯器知道Win32LPSTR等價(jià)與一個C#字符串。但是如果想覆蓋默認(rèn).Net行為, 這時(shí)候就需要MarshallAs
8,我怎么知道要調(diào)用的函數(shù)在那個dll了?
這個問題我不會比你更清楚,特殊的函數(shù)應(yīng)該在你特殊的dll中。Win32中常用的幾個dll是user32.dll, kernel32.dll和GDI32.dll.用dumpbin -exports kernel32.dll可以看到這個dll所有的API函數(shù)。
9,相互之間傳遞struct怎么辦?我是說傳遞很復(fù)雜的struct?
傳遞一個結(jié)構(gòu),這個要用到StructLayoutAttribute屬性。比如:
PtInRect 具有以下非托管簽名:
BOOL PtInRect(const RECT *lprc, POINT pt);
請注意,由于函數(shù)需要指向 RECT 類型的指針,必須通過引用來傳遞 Rect 結(jié)構(gòu)。
10,哪里有不錯的教程,我可以學(xué)到更詳細(xì)的東西?
google一下多的是。MSDN里面也有一些不錯的教程:(vs.net 2003)
平臺調(diào)用數(shù)據(jù)類型
提供托管數(shù)據(jù)類型及其相應(yīng)的非托管數(shù)據(jù)類型的列表。
封送字符串
描述如何通過值、通過引用、在結(jié)構(gòu)中、在類中和在數(shù)組中傳遞字符串。
封送類、結(jié)構(gòu)和聯(lián)合
描述如何通過值傳遞類,如何傳遞各種結(jié)構(gòu)以及如何傳遞具有值和混合類型的聯(lián)合。
封送類型數(shù)組
描述如何通過值傳遞多維整數(shù)數(shù)組以及如何通過引用傳遞一維數(shù)組。
其他封送處理示例
描述影響 Interop 封送處理行為的垃圾回收和線程處理的各個方面。
11,最后,這位大哥,你說了很多,我想問一個對我來說最關(guān)鍵的問題,我看了你的東西,似是而非,不會用怎么辦?
這位兄弟勇氣可嘉,我給你準(zhǔn)備了一個站點(diǎn)。這里有一個PInvoke的Add-In tools for Visual Studio.Net,幾乎所有的Win32 API都有。安裝了以后,基本不用自己寫了。
http://www.pinvoke.net