C#引用C++ Dll 所有類型轉換的方式(转)

//C++中的DLL函數原型為

//extern "C" __declspec(dllexport) bool 方法名一(const char* 變量名1, unsigned char* 變量名2)

//extern "C" __declspec(dllexport) bool 方法名二(const unsigned char* 變量名1, char* 變量名2)

//C#調用C++的DLL搜集整理的所有數據類型轉換方式,可能會有重復或者多種方案,自己多測試

//c++:HANDLE(void   *)          ----    c#:System.IntPtr

//c++:Byte(unsigned   char)     ----    c#:System.Byte

//c++:SHORT(short)              ----    c#:System.Int16

//c++:WORD(unsigned   short)    ----    c#:System.UInt16

//c++:INT(int)                  ----    c#:System.Int16

//c++:INT(int)                  ----    c#:System.Int32

//c++:UINT(unsigned   int)      ----    c#:System.UInt16

//c++:UINT(unsigned   int)      ----    c#:System.UInt32

//c++:LONG(long)                ----    c#:System.Int32

//c++:ULONG(unsigned   long)    ----    c#:System.UInt32

//c++:DWORD(unsigned   long)    ----    c#:System.UInt32

//c++:DECIMAL                   ----    c#:System.Decimal

//c++:BOOL(long)                ----    c#:System.Boolean

//c++:CHAR(char)                ----    c#:System.Char

//c++:LPSTR(char   *)           ----    c#:System.String

//c++:LPWSTR(wchar_t   *)       ----    c#:System.String

//c++:LPCSTR(const   char   *)  ----    c#:System.String

//c++:LPCWSTR(const   wchar_t   *)      ----    c#:System.String

//c++:PCAHR(char   *)   ----    c#:System.String

//c++:BSTR              ----    c#:System.String

//c++:FLOAT(float)      ----    c#:System.Single

//c++:DOUBLE(double)    ----    c#:System.Double

//c++:VARIANT           ----    c#:System.Object

//c++:PBYTE(byte   *)   ----    c#:System.Byte[]

//c++:BSTR      ----    c#:StringBuilder

//c++:LPCTSTR   ----    c#:StringBuilder

//c++:LPCTSTR   ----    c#:string

//c++:LPTSTR    ----    c#:[MarshalAs(UnmanagedType.LPTStr)] string

//c++:LPTSTR 輸出變量名    ----    c#:StringBuilder 輸出變量名

//c++:LPCWSTR   ----    c#:IntPtr

//c++:BOOL      ----    c#:bool

//c++:HMODULE   ----    c#:IntPtr

//c++:HINSTANCE ----    c#:IntPtr

//c++:結構體    ----    c#:public struct 結構體{};

//c++:結構體 **變量名   ----    c#:out 變量名   //C#中提前申明一個結構體實例化後的變量名

//c++:結構體 &變量名    ----    c#:ref 結構體 變量名

//c++:WORD      ----    c#:ushort

//c++:DWORD     ----    c#:uint

//c++:DWORD     ----    c#:int

//c++:UCHAR     ----    c#:int

//c++:UCHAR     ----    c#:byte

//c++:UCHAR*    ----    c#:string

//c++:UCHAR*    ----    c#:IntPtr

//c++:GUID      ----    c#:Guid

//c++:Handle    ----    c#:IntPtr

//c++:HWND      ----    c#:IntPtr

//c++:DWORD     ----    c#:int

//c++:COLORREF  ----    c#:uint

//c++:unsigned char     ----    c#:byte

//c++:unsigned char *   ----    c#:ref byte

//c++:unsigned char *   ----    c#:[MarshalAs(UnmanagedType.LPArray)] byte[]

//c++:unsigned char *   ----    c#:[MarshalAs(UnmanagedType.LPArray)] Intptr

//c++:unsigned char &   ----    c#:ref byte

//c++:unsigned char 變量名      ----    c#:byte 變量名

//c++:unsigned short 變量名     ----    c#:ushort 變量名

//c++:unsigned int 變量名       ----    c#:uint 變量名

//c++:unsigned long 變量名      ----    c#:ulong 變量名

//c++:char 變量名       ----    c#:byte 變量名   //C++中一個字符用一個字節表示,C#中一個字符用兩個字節表示

//c++:char 數組名[數組大小]     ----    c#:MarshalAs(UnmanagedType.ByValTStr, SizeConst = 數組大小)]        public string 數組名; ushort

//c++:char *            ----    c#:string       //傳入參數

//c++:char *            ----    c#:StringBuilder//傳出參數

//c++:char *變量名      ----    c#:ref string 變量名

//c++:char *輸入變量名  ----    c#:string 輸入變量名

//c++:char *輸出變量名  ----    c#:[MarshalAs(UnmanagedType.LPStr)] StringBuilder 輸出變量名

//c++:char **           ----    c#:string

//c++:char **變量名     ----    c#:ref string 變量名

//c++:const char *      ----    c#:string

//c++:char[]            ----    c#:string

//c++:char 變量名[數組大小]     ----    c#:[MarshalAs(UnmanagedType.ByValTStr,SizeConst=數組大小)] public string 變量名;

//c++:struct 結構體名 *變量名   ----    c#:ref 結構體名 變量名

//c++:委托 變量名   ----    c#:委托 變量名

//c++:int       ----    c#:int

//c++:int       ----    c#:ref int

//c++:int &     ----    c#:ref int

//c++:int *     ----    c#:ref int      //C#中調用前需定義int 變量名 = 0;

//c++:*int      ----    c#:IntPtr

//c++:int32 PIPTR *     ----    c#:int32[]

//c++:float PIPTR *     ----    c#:float[]

//c++:double** 數組名          ----    c#:ref double 數組名

//c++:double*[] 數組名          ----    c#:ref double 數組名

//c++:long          ----    c#:int

//c++:ulong         ----    c#:int

//c++:UINT8 *       ----    c#:ref byte       //C#中調用前需定義byte 變量名 = new byte();

//c++:handle    ----    c#:IntPtr

//c++:hwnd      ----    c#:IntPtr

//c++:void *    ----    c#:IntPtr

//c++:void * user_obj_param    ----    c#:IntPtr user_obj_param

//c++:void * 對象名稱    ----    c#:([MarshalAs(UnmanagedType.AsAny)]Object 對象名稱

//c++:char, INT8, SBYTE, CHAR                               ----    c#:System.SByte

//c++:short, short int, INT16, SHORT                        ----    c#:System.Int16

//c++:int, long, long int, INT32, LONG32, BOOL , INT        ----    c#:System.Int32

//c++:__int64, INT64, LONGLONG                              ----    c#:System.Int64

//c++:unsigned char, UINT8, UCHAR , BYTE                    ----    c#:System.Byte

//c++:unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t             ----    c#:System.UInt16

//c++:unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT      ----    c#:System.UInt32

//c++:unsigned __int64, UINT64, DWORDLONG, ULONGLONG                            ----    c#:System.UInt64

//c++:float, FLOAT                                                              ----    c#:System.Single

//c++:double, long double, DOUBLE                                               ----    c#:System.Double

//Win32 Types        ----  CLR Type

//Struct需要在C#裏重新定義一個Struct

//CallBack回調函數需要封裝在一個委托裏,delegate static extern int FunCallBack(string str);

//unsigned char** ppImage替換成IntPtr ppImage

//int& nWidth替換成ref int nWidth

//int*, int&, 則都可用 ref int 對應

//雙針指類型參數,可以用 ref IntPtr

//函數指針使用c++: typedef double (*fun_type1)(double); 對應 c#:public delegate double  fun_type1(double);

//char* 的操作c++: char*; 對應 c#:StringBuilder;

//c#中使用指針:在需要使用指針的地方 加 unsafe

//unsigned   char對應public   byte

/*

* typedef void (*CALLBACKFUN1W)(wchar_t*, void* pArg);

* typedef void (*CALLBACKFUN1A)(char*, void* pArg);

* bool BIOPRINT_SENSOR_API dllFun1(CALLBACKFUN1 pCallbackFun1, void* pArg);

* 調用方式為

* [UnmanagedFunctionPointer(CallingConvention.Cdecl)]

* public delegate void CallbackFunc1([MarshalAs(UnmanagedType.LPWStr)] StringBuilder strName, IntPtr pArg);

*

*

*/

时间: 2024-11-05 14:08:47

C#引用C++ Dll 所有類型轉換的方式(转)的相关文章

【WIN10】移植opencc到WIN10-UWP,實現自己的繁簡轉換工具

花了週末兩天時間,將opencc移植成WIN10-UWP可用的庫,並完成自己的繁簡轉換工具. 我的繁簡轉換工具下載地址為:https://www.microsoft.com/store/apps/9nblggh68g62 移植後的代碼下載地址:http://yunpan.cn/cFiYYCxwTLdfX  访问密码 0533 因為今天(2015-11-1 20:18)才上傳,所以如果你在今天或接下來的兩到三天,是找不到這款軟件的,因為微軟商店在審核.. 來個GIF圖來瞅瞅: 台灣的“軟體”可以轉

02.C#可空類型、默認參數、LINQ(一章1.3-1.4)

利用上班時間發個隨筆,不知領導會不會看到,可能會有同事看到也說不定啊:) 關于可空類型,在C#1中沒有這個概念,在C#3中引入的.那比如我們要實現一個表示人的類,人有名字和年齡兩個屬性,如何表示一個沒有年齡的人呢? 一般作法會將一人int類型封裝成一個引用類型,有人的類中使用成員屬性,該屬性的類型為剛封裝的引用類型,如下 1 public class Person 2 { 3 private string name; 4 private PersonAge age; 5 6 public Per

GO語言基礎教程:數據類型,變量,常量

GO類似PHP,每行的結尾要加分號來結束,不同點在於GO對此並不強制,這一點又像javascript,另外GO的語句塊是用一對大括號來包裹的,但是go要求左大括號必須要在語句的結尾處,不能在行首出現左大括號,這是一個新的特性,至少在我接觸的編程語言中第一次遇到這種狀況.還有就是GO對大小寫敏感,這一點相信大家不會有什麽爭議.    GO語言的註釋方法和PHP是相同的,單行註釋用//,而多行註釋用/*註釋內容*/,這一點是沒差別的. Go有眾所周知的數據類型int,這個類型很特殊,他會自動根據您的

實現樹樁類型結構及其相應的操作【增刪查改和移動】

<h1>一.創建樹樁結構對應的表</h1><p>1.創建樹樁層次結構表</p><p>樹狀結構表採用鏈結構的設計方式,每個節點包含一個當前節點指針ID.下一節點指針ID,以及當前節點的相關信息:節點名稱.順序.有效性.是否為葉子.層次,以下為創建表結構的SQL語句</p><pre class="code" name="pre-TypeConfig">    CREATE TABLE [

C#中用ILMerge将所有引用的DLL打成一个DLL文件

C#中用ILMerge将所有引用的DLL打成一个DLL文件 有些文件是必须一起使用的,如果能把多个DLL打包成一个DLL文件,那么引用文件的时候就不需要一个个地去引用,而且每次移动文件的时候也不至于少了哪个必须的DLL文件. 多个DLL文件打包成一个DLL文件的方法如下:1.先到下面的网址下载ILMerge安装 http://www.microsoft.com/en-us/download/details.aspx?id=17630 2.安装完之后,执行cmd命令,进入ILMerge目录, 把t

日志秘密 Windows登錄類型知多少

如果你留意Windows系統的安全日志,在那些事件描述中你將會發現裡面的"登錄類型"並非全部相同,難道除了在鍵盤上進行交互式登錄(登錄類型1)之外還有其它類型嗎? 不錯,Windows為了讓你從日志中獲得更多有價值的信息,它細分了很多種登錄類型,以便讓你區分登錄者到底是從本地登錄,還是從網絡登錄,以及其它更多的登錄方式.因為了解了這些登錄方式,將有助於你從事件日志中發現可疑的黑客行為,並能夠判斷其攻擊方式.下面我們就來詳細地看看Windows的登錄類型. 登錄類型2:交互式登錄(Int

Asp.Net数据控件引用AspNetPager.dll分页

今天与大家分享一下"Asp.Net数据控件引用AspNetPager.dll分页"首先声明以下几点: 1.也许讲解有点初级,希望高手不要"喷"我,因为我知道并不是每一个人都是高手,我也怕高手们说我装13,小生不才: 2.如有什么不对的地方,还希望大家指出,一定虚心学习: 3.本文属于作者原创,尊重他人劳动成果,转载请注明作者,谢谢. 下面开讲: 第一步:首先是下载一个AspNetPager.dll 下载地址 http://files.cnblogs.com/tand

WPF - 如何引用external dll中图片

前几天一直想引用别的DLL里面的一个图片.总是出现各种各样问题,一气之下将图片拷贝到当前Project中,运行良好.虽然知道引用图片,就1.2.列出来的2点就够了. 1. The Build Action should be Resource instead of Embedded Resource. 2. In the WPF application with the following XAML: <Image Source="/ClassLibraryName;Component/i

作業系統的類型

依處理方式而分 整批處理作業系統(Batch processing OS) 處理方式:將欲處理的資料或程式整批集中,置於如卡片.紙帶.磁帶.磁碟等儲存在媒體內,當要處理時,CPU才會到媒體中讀取資料後加以處理. 優點:整批處理作業系統是第一代作業系統,比起沒有作業系統時,更有效地改進了電腦的作業效率,減少大部份人工操作的比率. 缺點:因為CPU速度遠較存取資料的I/O為快,所以此方式CPU常被閒置,效率低. 分時作業系統(Time-sharing OS) 處理方式:CPU每次分配給各程序式(pr