(轉)C#與C++之間類型的對應


C#與C++之間類型的對應

Windows Data Type

.NET Data Type

BOOL, BOOLEAN

Boolean or Int32

BSTR

String

BYTE

Byte

CHAR

Char

DOUBLE

Double

DWORD

Int32 or UInt32

FLOAT

Single

HANDLE (and all other handle types, such as HFONT and HMENU)

IntPtr, UintPtr or HandleRef

HRESULT

Int32 or UInt32

INT

Int32

LANGID

Int16 or UInt16

LCID

Int32 or UInt32

LONG

Int32

LPARAM

IntPtr, UintPtr or Object

LPCSTR

String

LPCTSTR

String

LPCWSTR

String

LPSTR

String or StringBuilder*

LPTSTR

String or StringBuilder

LPWSTR

String or StringBuilder

LPVOID

IntPtr, UintPtr or Object

LRESULT

IntPtr

SAFEARRAY

.NET array type

SHORT

Int16

TCHAR

Char

UCHAR

SByte

UINT

Int32 or UInt32

ULONG

Int32 or UInt32

VARIANT

Object

VARIANT_BOOL

Boolean

WCHAR

Char

WORD

Int16 or UInt16

WPARAM

IntPtr, UintPtr or Object

另: 在進行string轉換時,需要加入前綴[MarshalAs(UnmanagedType.LPStr)]lpdword 對應於 ref int

  

C/C++

C#

HANDLE, LPDWORD, LPVOID, void*

IntPtr

LPCTSTR, LPCTSTR, LPSTR, char*, const char*, Wchar_t*, LPWSTR

String [in], StringBuilder [in, out]

DWORD, unsigned long, Ulong

UInt32, [MarshalAs(UnmanagedType.U4)]

bool

bool

LP<struct>

[In] ref <struct>

SIZE_T

uint

LPDWORD

out uint

LPTSTR

[Out] StringBuilder

PULARGE_INTEGER

out ulong

WORD

uInt16

Byte, unsigned char

byte

Short

Int16

Long, int

Int32

float

single

double

double

NULL pointer

IntPtr.Zero

Uint

Uint32

 習慣用C#寫東西,但平時又會碰到很多要用win32 API的地方,所以經常要用DllImport,但win32函數的類型寫法是很龐雜的,相信為之困擾的不止我一個,現在我整理一份我個人的理解如下,希望高人不吝賜教。

我的基本原則有如下幾點:
1、下面都是針對32位系統的,所以int是32位.long也是32位;
2、各種句柄類的(H開頭),我認為一律是System.IntPtr,到目前為止沒發現出錯;如果哪位在使用中出錯,請指出;
3、LP和P,我實在不懂(對C 不太了解),對於LP和P開頭的函數,如果是和STR有關的,一律寫為System.String,像PLCID這樣指向什么東西的,寫為System.UInt32(因為指向另一個地址,那就是指針,指針是32位吧),int之類的數值型,那我就寫為int[],以方便.net程序引用(寫成System.UInt32的話,給API調用應該也不會出錯,但.net程序就不好引用了)

如有意見,歡迎指教。謝謝

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.

Wtypes.h 中的非托管類型

非托管 C 語言類型

托管類名

說明

HANDLE

void*

System.IntPtr

在 32 位 Windows 操作系統上為 32 位,在 64 位 Windows 操作系統上為 64 位。

BYTE

unsigned char

System.Byte

8 位

SHORT

short

System.Int16

16 位

WORD

unsigned short

System.UInt16

16 位

INT

int

System.Int32

32 位

UINT

unsigned int

System.UInt32

32 位

LONG

long

System.Int32

32 位

BOOL

long

System.Int32

32 位

DWORD

unsigned long

System.UInt32

32 位

ULONG

unsigned long

System.UInt32

32 位

CHAR

char

System.Char

用 ANSI 修飾。

LPSTR

char*

System.String 或   System.Text.StringBuilder

用 ANSI 修飾。

LPCSTR

Const char*

System.String 或   System.Text.StringBuilder

用 ANSI 修飾。

LPWSTR

wchar_t*

System.String 或   System.Text.StringBuilder

用 Unicode 修飾。

LPCWSTR

Const wchar_t*

System.String 或   System.Text.StringBuilder

用 Unicode 修飾。

FLOAT

Float

System.Single

32 位

DOUBLE

Double

System.Double

64 位

 

C++ dll 類型與 C#類型對應關系

        //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  
 
4、C#調用C++dll的幾種傳參方式
refer: http://www.camnpr.com/archives/293.html
C#調用非托管DLL中的API:
 
LONG APIENTRY devwdm_GetImageBuffer(BYTE *pImageMem);
  函數功能: 采集一幀RGB24圖像到內存
  pImageMem: 圖像緩沖區指針
 
C#調用:
 
C# code
 
[DllImport("devwdm.dll")]
public static extern int devwdm_GetImageBuffer(IntPtr pImageMem);

於是報錯:嘗試讀取或寫入受保護的內存。這通常指示其他內存已損壞。

求助於大家,根據大家的意見,把API中的 BYTE* 轉換到C#中,分別用 byte[] 、IntPtr 、ref byte[]、 ...甚至用unsafe了,可是還是報錯,有人說內存不夠大,於是我非配了很大的內存,扔報錯...
 
萬般無奈,去C++的示例程序中看,示例程序中調用該函數沒有任何問題。
pImageMem是用來存放圖象數據的緩沖區 字節數組(長*寬*3)
lpsz是文件名(用於保存圖象) 字符數組(Unicode/ANSI)
devwdm_GetImageBuffer(pImageMem); 對字節數組賦值
CT_SaveBmp(lpsz,pImageMem,m_strWideth,m_strHeight,0);以BMP格式保存
CT_SaveJpeg(lpsz,pImageMem,m_strWideth,m_strHeight,0);以JPG格式保存
 
以C#重寫上述功能,要注意的幾點:
1,獲取正確的m_strWideth和m_strHeight ,據此申請內存塊:  
IntPtr ptrImage = Marshal.AllocHGlobal(m_strWideth*m_strHeight*3);

2,構建文件名,szFile是用戶輸入的字符串?  

string filename = "XXX";
  IntPtr ptrFileName = Marshal.AllocHGlobal(filename.Length+1);
  Marshal.Copy(s.ToCharArray(), 0, ptrFileName, s.Length);

3,獲取圖像數據:  

devwdm_GetImageBuffer(ptrImage);

4,保存BMP  

CT_SaveBmp(ptrFileName,ptrImage,m_strWideth,m_strHeight,0);

托管數組向非托管代碼封送: 

試試這樣:
如果有byte[] data字節數組,如下調用:
devwdm_GetImageBuffer([In, MarshalAs( UnmanagedType.LPArray)] data); 

或者手工轉換成非托管數組:

IntPtr ptr = Marshal.AllocHGlobal(data.Length);//申請非托管內存塊(與data大小一樣)
Marshal.Copy(data,0,ptr,data.Length);//將托管數據復制到非托管數據
devwdm_GetImageBuffer(ptr);//直接以非托管內存塊地址為參數
Marshal.FreeHGlobal(ptr);//處理完后記得釋放內存

發生錯誤的原因是devwdm_GetImageBuffer的參數的指針沒有正確指到數據內存塊,當指向受保護的系統內存塊並且發生讀寫時,就會提示上述錯誤,與內存大小一點關系沒有

byte[] UUID2 = new byte[37];
UUID2 = System.Text.Encoding.ASCII.GetBytes(Request["uid"].Trim());
char& 和 int&  ,&是取地址,在c#中byte型的數組就是表示地址的,所以,對應的類型就是byte,如果是指定長度的char的話,要用byte[]  ,一定要指定長度,只可大不可小。具體咨詢本站站長。
 
本文轉自網絡


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM