http://www.sosuo8.com/article-2012/dllleixingzhuanhuan.htm
在合作开发时,C#时常需要调用C++DLL,当传递参数时时常遇到问题,尤其是传递和返回字符串是,现总结一下,分享给大家:
VC++中主要字符串类型为:LPSTR,LPCSTR, LPCTSTR, string, CString, LPCWSTR, LPWSTR等
但转为C#类型却不完全相同。
主要有如下几种转换:
将string转为IntPtr:IntPtr System.Runtime.InteropServices.Marshal.StringToCoTaskMemAuto(string)
将IntPtr转为string:string System.Runtime.InteropServices.MarshalPtrToStringAuto(IntPtr)
类型对照:
BSTR --------- StringBuilder
LPCTSTR --------- StringBuilder
LPCWSTR --------- IntPtr
handle---------IntPtr
hwnd-----------IntPtr
char *----------string
int * -----------ref int
int &-----------ref int
void *----------IntPtr
unsigned char *-----ref byte
Struct需要在C#里重新定义一个Struct
CallBack回调函数需要封装在一个委托里,delegate static extern int FunCallBack(string str);
注意在每个函数的前面加上public static extern +返回的数据类型,如果不加public ,函数默认为私有函数,调用就会出错。
API数据类型 | 类型描述 | C#类型 |
WORD | 16位无符号整数 | ushort |
LONG | 32位无符号整数 | int |
DWORD | 32位无符号整数 | uint |
HANDLE | 句柄,32位整数 | int |
UINT | 32位无符号整数 | uint |
BOOL | 32位布尔型整数 | bool |
LPSTR | 指向字符的32位指针 | string |
LPCSTR | 指向常字符的32位指针 | String |
BYTE | 字节 | byte |
CHAR | 字符 | char |
DWORDLONG | 64位长整数 | long |
HDC | 设备描述表句柄 | int |
HGDIOBJ | GDI对象句柄 | int |
HINSTANCE | 实例句柄 | int |
HWM | 窗口句柄 | int |
HPARAM | 32位消息参数 | int |
LPARAM | 32位消息参数 | int |
WPARAM | 32位消息参数 | int |
API | C#数据类型 |
BOOL | System.Int32 |
BOOLEAN | System.Int32 |
BYTE | System.UInt16 |
CHAR | System.Int16 |
COLORREF | System.UInt32 |
|
|
DWORD | System.UInt32 |
DWORD32 | System.UInt32 |
DWORD64 | System.UInt64 |
FLOAT | System.Float |
HACCEL | System.IntPtr |
|
|
HANDLE | System.IntPtr |
HBITMAP | System.IntPtr |
HBRUSH | System.IntPtr |
HCONV | System.IntPtr |
HCONVLIST | System.IntPtr |
|
|
HCURSOR | System.IntPtr |
HDC | System.IntPtr |
HDDEDATA | System.IntPtr |
HDESK | System.IntPtr |
HDROP | System.IntPtr |
|
|
HDWP | System.IntPtr |
HENHMETAFILE | System.IntPtr |
HFILE | System.IntPtr |
HFONT | System.IntPtr |
HGDIOBJ | System.IntPtr |
|
|
HGLOBAL | System.IntPtr |
HHOOK | System.IntPtr |
HICON | System.IntPtr |
HIMAGELIST | System.IntPtr |
HIMC | System.IntPtr |
|
|
HINSTANCE | System.IntPtr |
HKEY | System.IntPtr |
HLOCAL | System.IntPtr |
HMENU | System.IntPtr |
HMETAFILE | System.IntPtr |
|
|
HMODULE | System.IntPtr |
HMONITOR | System.IntPtr |
HPALETTE | System.IntPtr |
HPEN | System.IntPtr |
HRGN | System.IntPtr |
|
|
HRSRC | System.IntPtr |
HSZ | System.IntPtr |
HWINSTA | System.IntPtr |
HWND | System.IntPtr |
INT | System.Int32 |
|
|
INT32 | System.Int32 |
INT64 | System.Int64 |
LONG | System.Int32 |
LONG32 | System.Int32 |
LONG64 | System.Int64 |
|
|
LONGLONG | System.Int64 |
LPARAM | System.IntPtr |
LPBOOL | System.Int16[] |
LPBYTE | System.UInt16[] |
LPCOLORREF | System.UInt32[] |
|
|
LPCSTR | System.String |
LPCTSTR | System.String |
LPCVOID | System.UInt32 |
LPCWSTR | System.String |
LPDWORD | System.UInt32[] |
|
|
LPHANDLE | System.UInt32 |
LPINT | System.Int32[] |
LPLONG | System.Int32[] |
LPSTR | System.String |
LPTSTR | System.String |
|
|
LPVOID | System.UInt32 |
LPWORD | System.Int32[] |
LPWSTR | System.String |
LRESULT | System.IntPtr |
PBOOL | System.Int16[] |
|
|
PBOOLEAN | System.Int16[] |
PBYTE | System.UInt16[] |
PCHAR | System.Char[] |
PCSTR | System.String |
PCTSTR | System.String |
|
|
PCWCH | System.UInt32 |
PCWSTR | System.UInt32 |
PDWORD | System.Int32[] |
PFLOAT | System.Float[] |
PHANDLE | System.UInt32 |
|
|
PHKEY | System.UInt32 |
PINT | System.Int32[] |
PLCID | System.UInt32 |
PLONG | System.Int32[] |
PLUID | System.UInt32 |
|
|
PSHORT | System.Int16[] |
PSTR | System.String |
PTBYTE | System.Char[] |
PTCHAR | System.Char[] |
PTSTR | System.String |
|
|
PUCHAR | System.Char[] |
PUINT | System.UInt32[] |
PULONG | System.UInt32[] |
PUSHORT | System.UInt16[] |
PVOID | System.UInt32 |
|
|
PWCHAR | System.Char[] |
PWORD | System.Int16[] |
PWSTR | System.String |
REGSAM | System.UInt32 |
SC_HANDLE | System.IntPtr |
|
|
SC_LOCK | System.IntPtr |
SHORT | System.Int16 |
SIZE_T | System.UInt32 |
SSIZE_ | System.UInt32 |
TBYTE | System.Char |
|
|
TCHAR | System.Char |
UCHAR | System.Byte |
UINT | System.UInt32 |
UINT32 | System.UInt32 |
UINT64 | System.UInt64 |
|
|
ULONG | System.UInt32 |
ULONG32 | System.UInt32 |
ULONG64 | System.UInt64 |
ULONGLONG | System.UInt64 |
USHORT | System.UInt16 |
|
|
WORD | System.Short |
WPARAM | System.IntPtr |