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

C++ Programmer's Cookbook

{C++ 基礎} {C++ 高級} {C#界面,C++核心算法} {設計模式} {C#基礎}

C#通過p/invoke調用C++ DLL (轉)


轉自:http://hacker.cnblogs.com/archive/2004/08/12/32563.aspx

1, PInvoke什么意思? Platform Invocation Services

2, 干什么用?  導入外部函數?什么是外部函數,就是不屬于.Net托管的函數。

3,如何用?看下面的例子。用[DllImport(dllname)]來實現,但是首先要把System.Runtiime.InteropServices using進來。但是不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,萬一我的程序中已經有了一個函數叫MessageBoxA怎么辦?這時候,可以使用EntryPoint來幫忙,下面的例子中,你把自己的函數定義為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,看你的函數調用而定。2K以后都用unicode了,前面的9x都是ansi編碼,但是這是缺省的,微軟給9x打布丁支持unicode不算。

API有兩個版本: A(ASNI)版本和W(Unicode)版本. A版本調用時候會用ANSI來封送字符串,一般是win95/98上。W版本用Unicode來封送,在NT,2K和XP上。

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

DllImportAttribute.ExactSpelling 字段為 true 時(它是 Visual Basic .NET 中的默認值),平臺調用將只搜索您指定的名稱。例如,如果指定 MessageBox,則平臺調用將搜索 MessageBox,如果它找不到完全相同的拼寫則失敗。

當 ExactSpelling 字段為 false(它是 C++ 托管擴展和 C# 中的默認值),平臺調用將首先搜索未處理的別名 (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函數如何實現?看下面這個例子:

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#字符串。但是如果想覆蓋默認.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,我怎么知道要調用的函數在那個dll了?
這個問題我不會比你更清楚,特殊的函數應該在你特殊的dll中。Win32中常用的幾個dll是user32.dll, kernel32.dll和GDI32.dll.用dumpbin -exports kernel32.dll可以看到這個dll所有的API函數。

9,相互之間傳遞struct怎么辦?我是說傳遞很復雜的struct?
傳遞一個結構,這個要用到StructLayoutAttribute屬性。比如:

PtInRect 具有以下非托管簽名:
BOOL PtInRect(const RECT *lprc, POINT pt);
請注意,由于函數需要指向 RECT 類型的指針,必須通過引用來傳遞 Rect 結構。

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,哪里有不錯的教程,我可以學到更詳細的東西?
google一下多的是。MSDN里面也有一些不錯的教程:(vs.net 2003)

 

平臺調用數據類型
提供托管數據類型及其相應的非托管數據類型的列表。
封送字符串
描述如何通過值、通過引用、在結構中、在類中和在數組中傳遞字符串。
封送類、結構和聯合
描述如何通過值傳遞類,如何傳遞各種結構以及如何傳遞具有值和混合類型的聯合。
封送類型數組
描述如何通過值傳遞多維整數數組以及如何通過引用傳遞一維數組。
其他封送處理示例
描述影響 Interop 封送處理行為的垃圾回收和線程處理的各個方面。

11,最后,這位大哥,你說了很多,我想問一個對我來說最關鍵的問題,我看了你的東西,似是而非,不會用怎么辦?

這位兄弟勇氣可嘉,我給你準備了一個站點。這里有一個PInvoke的Add-In tools for Visual Studio.Net,幾乎所有的Win32 API都有。安裝了以后,基本不用自己寫了。
http://www.pinvoke.net

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

評論

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

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

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

寫得好!??!  回復  更多評論   

公告

EMail:itech001#126.com

導航

統計

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

常用鏈接

隨筆分類

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816192
  • 排名 - 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>
              99精品免费视频| 欧美日韩第一区| 免费久久精品视频| 在线观看91久久久久久| 麻豆精品91| 最新69国产成人精品视频免费| 亚洲人成人一区二区三区| 欧美人成在线| 亚洲女人小视频在线观看| 久久精品中文字幕一区二区三区| 精品动漫3d一区二区三区免费版 | 久久久综合激的五月天| 欧美成人资源网| 一本色道精品久久一区二区三区| 欧美视频在线免费看| 欧美在线观看你懂的| 亚洲高清一区二区三区| 亚洲综合首页| 精品成人在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲一区视频在线观看视频| 米奇777超碰欧美日韩亚洲| 一本一道久久综合狠狠老精东影业 | 欧美日韩国产欧| 香港久久久电影| 亚洲国产综合91精品麻豆| 欧美伊人久久久久久久久影院 | 精品91免费| 欧美日韩一区二区三| 欧美有码视频| 日韩写真在线| 美女视频黄a大片欧美| 亚洲视频一二三| 亚洲国产va精品久久久不卡综合| 国产精品久久久久久久久久妞妞| 久久久久国产精品麻豆ai换脸| 日韩视频永久免费| 欧美aaa级| 欧美一区二区三区四区在线观看 | 一区二区国产在线观看| 国产日产欧美a一级在线| 免费看精品久久片| 欧美在线视频免费| 亚洲天堂黄色| 亚洲全部视频| 欧美大片国产精品| 久久久久久久综合色一本| 亚洲午夜成aⅴ人片| 亚洲免费av电影| 一区二区三区在线看| 国产精品你懂的在线欣赏| 欧美日韩高清区| 久久影视三级福利片| 午夜久久影院| 亚洲免费影视| 亚洲午夜未删减在线观看| 亚洲美女性视频| 亚洲国产精品激情在线观看| 久久亚洲一区| 久久中文精品| 久久精品夜夜夜夜久久| 午夜久久美女| 午夜精品久久久久久久久久久久久| 99re6热只有精品免费观看| 亚洲国产va精品久久久不卡综合| 激情成人亚洲| 一区久久精品| 亚洲成人原创| 在线观看国产成人av片| 在线精品视频免费观看| 激情视频一区二区三区| 黑人巨大精品欧美黑白配亚洲| 国产日韩精品一区| 国产一区二区三区久久| 国产一区二区高清| 国产一区二区三区直播精品电影 | 亚洲一二三区在线| 亚洲图片欧美日产| 亚洲一区二区三区四区五区黄| 亚洲天堂男人| 午夜亚洲激情| 久久久久女教师免费一区| 久久香蕉国产线看观看av| 久久野战av| 欧美激情日韩| 亚洲美女电影在线| 亚洲一区二区三区在线视频| 亚洲一级高清| 欧美一区国产一区| 蜜臀久久99精品久久久画质超高清| 另类图片国产| 欧美日韩国产精品| 国产精品视频福利| 一区二区三区在线视频免费观看| 精品999日本| 亚洲精品色婷婷福利天堂| 亚洲午夜在线视频| 久久精品麻豆| 亚洲第一视频网站| 一本到12不卡视频在线dvd| 亚洲欧美日韩一区| 裸体素人女欧美日韩| 欧美另类女人| 国产一区二区欧美| 日韩一区二区精品| 久久爱www| 亚洲国产高清在线| 亚洲欧美日韩中文在线制服| 久久综合中文字幕| 欧美性一区二区| 曰本成人黄色| 亚洲一区国产| 欧美成人免费大片| 亚洲一区在线视频| 欧美本精品男人aⅴ天堂| 国产精品久久9| 一区在线视频| 欧美三级在线视频| 免费看成人av| 国产麻豆日韩欧美久久| 亚洲成人在线视频播放| 亚洲香蕉网站| 亚洲第一二三四五区| 亚洲免费视频中文字幕| 欧美黄色免费| 一区视频在线播放| 午夜精品视频| 亚洲精品欧美一区二区三区| 欧美一区二区三区视频| 欧美日韩一区二区在线视频| 一区二区三区无毛| 性欧美1819性猛交| 亚洲精品视频一区| 久久人91精品久久久久久不卡| 国产精品porn| 亚洲人久久久| 免费观看成人网| 欧美一区二区三区四区视频| 欧美色道久久88综合亚洲精品| 尤物yw午夜国产精品视频明星| 午夜欧美视频| 99热在这里有精品免费| 欧美成人免费网| 激情文学一区| 久久精品国产2020观看福利| 9l国产精品久久久久麻豆| 女主播福利一区| 在线观看欧美成人| 久久夜色精品亚洲噜噜国产mv| 亚洲自拍都市欧美小说| 欧美日韩一级黄| 一区二区三区欧美在线| 亚洲国产高清视频| 免费日韩成人| 亚洲国产精品va| 欧美成在线观看| 麻豆精品在线播放| 亚洲国产老妈| 欧美高清在线视频| 免播放器亚洲一区| 亚洲日韩欧美视频| 亚洲电影在线观看| 欧美精品二区| 一区二区三区欧美成人| 99视频精品免费观看| 欧美日韩三级一区二区| 中文日韩欧美| 亚洲婷婷免费| 国产欧美日韩综合精品二区| 久久精品国产亚洲a| 欧美一区二区三区四区在线| 国产亚洲欧美一级| 久久亚洲春色中文字幕| 久久在线免费观看视频| 亚洲精品国产精品国自产在线| 亚洲电影免费观看高清完整版在线| 男人插女人欧美| 99国产精品久久久久久久久久 | 亚洲图片欧美一区| 国产精品一区二区三区乱码| 欧美一区二区私人影院日本| 欧美一区2区三区4区公司二百| 国产在线拍揄自揄视频不卡99| 美女黄色成人网| 欧美成人一品| 亚洲欧美在线免费| 欧美在线高清视频| 亚洲激情国产精品| 99精品国产一区二区青青牛奶| 国产精品日韩在线| 美女日韩欧美| 欧美日韩免费一区二区三区视频| 亚洲欧美制服中文字幕| 久久久国产成人精品| 亚洲免费观看高清完整版在线观看| 中国成人在线视频| 激情综合自拍| 亚洲精品视频在线观看网站| 国产欧美日韩综合| 最新亚洲一区|