• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            C++ Programmer's Cookbook

            {C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

            C#通過p/invoke調(diào)用C++ DLL (轉(zhuǎn))


            轉(zhuǎn)自:http://hacker.cnblogs.com/archive/2004/08/12/32563.aspx

            1, PInvoke什么意思? Platform Invocation Services

            2, 干什么用?  導(dǎo)入外部函數(shù)?什么是外部函數(shù),就是不屬于.Net托管的函數(shù)。

            3,如何用?看下面的例子。用[DllImport(dllname)]來實(shí)現(xiàn),但是首先要把System.Runtiime.InteropServices using進(jìn)來。但是不using也行,就要敲全稱,隨你便了。
            [DllImport("user32.dll")] 
                     static extern int MessageBoxA(int hWnd,

                                                      string msg,

                                                      string caption,

                                                      int type );

                     private void button1_Click(object sender, System.EventArgs e)

                     {

                          MessageBoxA( 0, "Msg:hello", "Caption:Hello",0 );

                     }



            4,萬一我的程序中已經(jīng)有了一個函數(shù)叫MessageBoxA怎么辦?這時(shí)候,可以使用EntryPoint來幫忙,下面的例子中,你把自己的函數(shù)定義為MyMsg.

            [DllImport("user32.dll",EntryPoint="MessageBoxA")]

                     static extern int MyMsg(int hWnd,

                                                      string msg,

                                                      string caption,

                                                      int type );

                     private void button1_Click(object sender, System.EventArgs e)

                     {

                          MyMsg( 0, "Msg:hello", "Caption:Hello",0 );

                     }



            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 名稱匹配行為不同。       

             //CharSet.Ansi will call MessageBoxA

                     //CharSet.Unicode will call MessageBoxW

             

                     [DllImport("user32.dll",EntryPoint="MessageBox",CharSet=CharSet.Ansi)]

                     static extern int MyMsg(int hWnd,

                                                      string msg,

                                                      string caption,

                                                      int type );

                     private void button1_Click(object sender, System.EventArgs e)

                     {

                          MyMsg( 0, "Msg:hello", "Caption:Hello",0 );

                     }


            6,Dll里面的callback函數(shù)如何實(shí)現(xiàn)?看下面這個例子:

            delegate bool CallBackDef( int hWnd, int lParm );

             

                     [DllImport("user32.dll")]

                          static extern int GetWindowText( int hWnd,

                                                               StringBuilder text,

                                                               int count );

                     [DllImport("user32.dll")]

                          static extern int EnumWindows(CallBackDef callback, int lParam );

             

                     static bool PrintWindow(int hWnd, int lParm )

                     {

                          StringBuilder text = new StringBuilder(255);

                          GetWindowText( hWnd, text, 255 );

                          Console.WriteLine( text.ToString() );

             

                          return true;

                     }

             

                     private void button1_Click(object sender, System.EventArgs e)

                     {

                          CallBackDef callBack = new CallBackDef( PrintWindow );

                          EnumWindows( callBack, 0 );

                     }


            7,MarshalAs如何用,什么時(shí)候用?
            在MessageBox傳遞string去Dll的時(shí),C#編譯器知道Win32LPSTR等價(jià)與一個C#字符串。但是如果想覆蓋默認(rèn).Net行為, 這時(shí)候就需要MarshallAs

            [DllImport("user32.dll", CharSet=CharSet.Unicode )]

                          static extern int MessageBox( int hWnd,

                                                           [MarshalAs(UnmanagedType.LPWStr)]

                                                           string msg,

                                                           [MarshalAs(UnmanagedType.LPWStr)]

                                                           string caption,

                                                           int type);



            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)。

            using System.Runtime.InteropServices;


            [StructLayout(LayoutKind.Sequential)]

            public struct Point 

            {

                 public int x;

                 public int y;

            }   

             

            [StructLayout(LayoutKind.Explicit)]

            public struct Rect 

            {

                 [FieldOffset(0)] public int left;

                 [FieldOffset(4)] public int top;

                 [FieldOffset(8)] public int right;

                 [FieldOffset(12)] public int bottom;

            }   

             

            class Win32API 

            {

                 [DllImport("User32.dll")]

                 public static extern bool PtInRect(ref Rect r, Point p);

            }


            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

            posted on 2007-06-04 20:35 夢在天涯 閱讀(6827) 評論(2)  編輯 收藏 引用 所屬分類: CPlusPlusC#/.NET

            評論

            # re: C#通過p/invoke調(diào)用C++ DLL (轉(zhuǎn)) 2007-06-04 20:44 夢在天涯

            還可以參考:http://www.codeproject.com/csharp/interop.asp  回復(fù)  更多評論   

            # re: C#通過p/invoke調(diào)用C++ DLL (轉(zhuǎn))[未登錄] 2007-06-17 18:35 zz

            寫得好!!!  回復(fù)  更多評論   

            公告

            EMail:itech001#126.com

            導(dǎo)航

            統(tǒng)計(jì)

            • 隨筆 - 461
            • 文章 - 4
            • 評論 - 746
            • 引用 - 0

            常用鏈接

            隨筆分類

            隨筆檔案

            收藏夾

            Blogs

            c#(csharp)

            C++(cpp)

            Enlish

            Forums(bbs)

            My self

            Often go

            Useful Webs

            Xml/Uml/html

            搜索

            •  

            積分與排名

            • 積分 - 1811117
            • 排名 - 5

            最新評論

            閱讀排行榜

            久久er国产精品免费观看2| 欧美日韩精品久久久久| 99久久99久久久精品齐齐| 国产免费久久久久久无码| 漂亮人妻被中出中文字幕久久| 精品久久久久久无码不卡| 久久国产精品成人片免费| 国产真实乱对白精彩久久| 久久无码人妻一区二区三区午夜 | 亚洲AV无码久久寂寞少妇| 久久精品国产99国产电影网 | 国产精品亚洲综合专区片高清久久久 | 理论片午午伦夜理片久久| 久久99久久99精品免视看动漫| 日本久久久精品中文字幕| 麻豆AV一区二区三区久久| 欧美性大战久久久久久| 996久久国产精品线观看| 一本一本久久A久久综合精品| 久久精品夜色噜噜亚洲A∨| 97久久超碰国产精品2021| 狠狠综合久久综合88亚洲| 久久亚洲2019中文字幕| 国产午夜福利精品久久| 久久99久久99小草精品免视看| 少妇人妻综合久久中文字幕 | 中文字幕无码精品亚洲资源网久久 | 色欲综合久久中文字幕网| 精品国产日韩久久亚洲| 亚洲国产天堂久久综合| 久久天天日天天操综合伊人av| 久久免费美女视频| 国产精品99久久精品爆乳| 国产精品99久久精品| 色综合久久88色综合天天 | 久久婷婷色综合一区二区| 久久精品国产国产精品四凭| 久久国产成人午夜aⅴ影院| 欧美国产成人久久精品| 国产精品久久久久久久久软件| 亚洲国产高清精品线久久|