青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級} {C#界面,C++核心算法} {設(shè)計模式} {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)]來實現(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怎么辦?這時候,可以使用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)用時候會用ANSI來封送字符串,一般是win95/98上。W版本用Unicode來封送,在NT,2K和XP上。

.Net和win32交互的時候,默認(rèn)是使用CharSet.Ansi來傳送。

DllImportAttribute.ExactSpelling 字段為 true 時(它是 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ù)如何實現(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如何用,什么時候用?
在MessageBox傳遞string去Dll的時,C#編譯器知道Win32LPSTR等價與一個C#字符串。但是如果想覆蓋默認(rèn).Net行為, 這時候就需要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)備了一個站點。這里有一個PInvoke的Add-In tools for Visual Studio.Net,幾乎所有的Win32 API都有。安裝了以后,基本不用自己寫了。
http://www.pinvoke.net

posted on 2007-06-04 20:35 夢在天涯 閱讀(6837) 評論(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)計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816190
  • 排名 - 5

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              性欧美超级视频| 欧美一区二区视频在线观看| 久久免费高清视频| 国产精品美女主播| 日韩视频一区二区三区在线播放免费观看| 久久精品国产清自在天天线| 日韩视频免费观看| 欧美岛国激情| 影音先锋欧美精品| 久久疯狂做爰流白浆xx| 一区二区欧美亚洲| 欧美另类女人| 亚洲区免费影片| 欧美xart系列在线观看| 久久9热精品视频| 国产欧美一区二区三区在线看蜜臀| 亚洲无毛电影| 日韩视频在线免费观看| 欧美国产日韩视频| 亚洲欧洲日本国产| 欧美mv日韩mv国产网站app| 欧美诱惑福利视频| 国产精品综合视频| 欧美一级理论片| 亚洲永久网站| 国产精品久久福利| 亚洲先锋成人| 亚洲视频碰碰| 欧美亚男人的天堂| 亚洲午夜高清视频| 一区二区三区久久网| 欧美三级第一页| 亚洲一区在线观看视频 | 国产精品一区二区三区观看| 亚洲一区二区三区四区五区午夜| 日韩一级免费| 国产精品豆花视频| 亚洲综合成人婷婷小说| 中国成人亚色综合网站| 国产精品久久久久久久久久ktv| 亚洲午夜久久久久久尤物 | 麻豆成人在线| 久久久99爱| 亚洲国产精品精华液2区45| 欧美成人激情视频| 欧美成人激情视频| 一本久道综合久久精品| 一区二区91| 国产美女精品| 麻豆成人综合网| 美女视频黄 久久| 9i看片成人免费高清| 日韩午夜三级在线| 国产精品手机视频| 久久蜜臀精品av| 老司机精品久久| 99在线视频精品| 亚洲深爱激情| 韩国欧美国产1区| 欧美岛国在线观看| 欧美区在线观看| 亚洲欧美三级在线| 欧美在线免费视频| 亚洲国产日韩在线一区模特| 亚洲人体1000| 国产精品欧美久久| 久久最新视频| 欧美精品99| 欧美一级片一区| 久久亚洲综合色| 亚洲神马久久| 欧美伊人久久久久久午夜久久久久 | 亚洲欧美日韩精品| 欧美一级播放| 91久久精品一区| 一本久久a久久免费精品不卡| 国产视频综合在线| 亚洲成人自拍视频| 国产精品久久久久久久久借妻| 久久久99精品免费观看不卡| 麻豆成人91精品二区三区| 亚洲一区二区成人| 久久国产一区二区| 日韩一级黄色av| 欧美一级理论性理论a| 91久久精品一区二区别| 亚洲视频一区在线| 在线播放视频一区| 在线视频你懂得一区| 一区在线视频观看| 一本色道**综合亚洲精品蜜桃冫 | 在线播放豆国产99亚洲| 亚洲毛片av| 好吊妞**欧美| 亚洲精品在线观| 国产自产精品| 一本久久综合亚洲鲁鲁五月天| 欲色影视综合吧| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 久久久蜜桃精品| 欧美另类videos死尸| 久久免费视频网| 欧美三级电影一区| 欧美激情一区二区三区高清视频| 国产精品自拍在线| 亚洲精品免费在线播放| 国产一区导航| 在线一区亚洲| 亚洲激情图片小说视频| 性做久久久久久| 亚洲午夜免费福利视频| 久久亚裔精品欧美| 欧美亚洲在线视频| 欧美日韩成人在线播放| 欧美成人蜜桃| 国模吧视频一区| 亚洲视频一区二区免费在线观看| 亚洲精品一区二区三区樱花| 久久国产精品72免费观看| 亚洲一区黄色| 欧美—级a级欧美特级ar全黄| 久久亚洲午夜电影| 国产精品一区二区在线观看网站| 亚洲毛片在线| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美香蕉视频| 亚洲日本成人| 亚洲黄一区二区三区| 久久成人免费视频| 欧美在线三级| 国产精品www色诱视频| 亚洲日本中文字幕免费在线不卡| 在线免费观看日本一区| 久久不见久久见免费视频1| 欧美在线free| 国产精品丝袜久久久久久app| 日韩一级网站| 一区二区三区日韩欧美精品| 欧美不卡激情三级在线观看| 欧美电影在线观看| 在线观看日韩国产| 久久漫画官网| 免费一级欧美在线大片| 永久域名在线精品| 久久久亚洲国产天美传媒修理工 | avtt综合网| 免费观看亚洲视频大全| 免费欧美在线视频| 在线观看福利一区| 久久亚洲综合| 免费在线观看日韩欧美| 亚洲高清不卡av| 另类春色校园亚洲| 亚洲第一福利社区| 亚洲人成免费| 欧美精品国产精品日韩精品| 亚洲国产精品专区久久| 999在线观看精品免费不卡网站| 欧美激情乱人伦| 亚洲精品一区二区三区在线观看| 日韩午夜在线| 欧美日韩国产综合视频在线观看| 亚洲人成艺术| 亚洲午夜一二三区视频| 国产精品黄色在线观看| 午夜精品美女自拍福到在线| 久久精品亚洲乱码伦伦中文| 韩国欧美一区| 男人的天堂亚洲| 亚洲区在线播放| 亚洲自拍偷拍福利| 国产视频观看一区| 久久久亚洲综合| 亚洲国产精选| 亚洲在线国产日韩欧美| 国产精品影片在线观看| 久久精品99久久香蕉国产色戒| 欧美a级在线| 99热在这里有精品免费| 欧美午夜电影一区| 亚洲欧美久久久| 久久久久久亚洲精品杨幂换脸| 亚洲第一毛片| 欧美精品一区二区三区四区| 国产精品99久久久久久人| 久久久久一区二区| 亚洲另类一区二区| 国产乱人伦精品一区二区 | 亚洲一区二区三区成人在线视频精品| 欧美一区二区网站| 亚洲国产高清自拍| 欧美午夜激情在线| 欧美在线视频观看免费网站| 欧美激情无毛| 亚洲自拍都市欧美小说| 一区久久精品| 欧美日韩一区二区视频在线| 午夜在线一区| 91久久精品www人人做人人爽| 午夜视频在线观看一区二区三区|