/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);
         *
         *
         */

C#——调用C++的DLL 数据类型转换的更多相关文章

  1. C#调用C++的DLL 数据类型转换

    /C++中的DLL函数原型为        //extern "C" __declspec(dllexport) bool 方法名一(const char* 变量名1, unsig ...

  2. C#调用C++的DLL搜集整理的所有数据类型转换方式

    //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byt ...

  3. C# 调用C++ DLL 的类型转换

    //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byt ...

  4. [转载] C# 调用C++ DLL 的类型转换

    //C#调用C++的DLL搜集整理的所有数据类型转换方式,可能会有重复或者多种方案,自己多测试 //c++:HANDLE(void *) ---- c#:System.IntPtr //c++:Byt ...

  5. C# 调用C++ DLL 的类型转换(转载版)

    最近在做视频监控相关的demo开发,实现语言是C#,但视频监控的SDK是C++开发的,所以涉及到C#调用C++的dll库.很多结构体.参数在使用时都要先进行转换,由非托管类型转换成托管类型后才能使用. ...

  6. C#调用C++动态库时类型转换

    因为本人主要从事c#开发,但是在工作中经常需要用到c++编写的DLL,因此需要知道c++中的类型与c#中的类型是如何转换的.搜集整理如下. //C++中的DLL函数原型为   //extern &qu ...

  7. 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考

    最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...

  8. C#调用非托管dll

    以C#开发周立功CAN举例,在官网下载了周立功的demo 一.C++头文件样子 //接口卡类型定义#define VCI_PCI5121 1 //一些结构体定义 typedef struct tagR ...

  9. JS 数据类型转换

    JS 数据类型转换 方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...

随机推荐

  1. subprocess 粘包问题

    1.执行命令: 在py代码中去如何调用操作系统的命令 新模块:subprocess r = subprocess.Popen('ls',shell=True,stdout=subprocess.PIP ...

  2. 未能加载文件或程序集“AjaxControlToolkit”或它的某一个依赖项

    对于这个问题,网上的解答都大同小异,最多的就是Bin文件夹下没有dll文件,引用路径问题.但我碰到的问题偏偏不是这个,而是没有一个人给出方法的问题.其实问题很简单,也很低级:IIS上发布网站的时候把整 ...

  3. 转)Ubuntu14安装wireshark进行抓包

    转自:http://jingyan.baidu.com/article/c74d60009d992f0f6a595de6.html 背景: ubuntu14.04/64位 为了抓包和分析包 安装过程: ...

  4. iOS 处理cell选中时背景颜色消息问题

    在cell上添加子控件,在我们点击或者长按的时候,如果子控件有背景颜色,这时候背景颜色就会没有了,这个时候产品经理过来一顿怼,

  5. TZOJ 2755 国际象棋(广搜+哈希)

    描述 在n*n的国际象棋棋盘中,给定一“马(Knight)”和一“后(Queen)”的位置,问“马”能否在m步之内(包括m步)到达“后”的位置?马的走法是:每步棋先横走或直走一格,然后再斜走一格,即走 ...

  6. 11-st跳舞消耗体力最少

    /*                                                   炫舞家 ST 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述   ...

  7. java的PDF纵横向打印

    PDF默认是纵向打印的,通过rotate()来让其改变为横向打印,一般在打印A4 12*21纸以及发票的时候会用横向打印.横向打印时页面会出现行转列以及列转行的情况,因此在设置页面大小的时候一定要宽度 ...

  8. Linux indent命令

    一.简介 indent可辨识C的原始代码文件,并加以格式化,以方便程序设计师阅读. 二.选项 http://www.cnblogs.com/xuxm2007/archive/2011/11/03/22 ...

  9. super限定,子类中系统查找变量的顺序:

    示例代码如下: import static java.lang.System.*; //-父类: class BaseClass{ public int a=7; } //-子类: public cl ...

  10. 理解OAuth 2.0 (摘自阮一峰网络日志)

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释,主要参考材料为R ...