c++ 与 .net类型对照(大杂会)

看win api的时候一些参数类型让我这个从C#过来的人挺晕的,特别是字符,字符串相关的。现在备注一下:

eg:LPCTSTR;

LP:表示长指针(long pointer)

STR:字符串(char*)

C:表示常量(const)

T:TCHAR 在unicode方式编译时代表w_char,ansi方式编译时代表char

还有一个LPCTSTR中没有的:W,代表宽字符,占2个字节。如LPWSTR;

eg:BSTR 专有格式字符串,要专有函数来操作

_in:表示输入型参数。

_in_opt:输入输出

_opt:输出

 

windows api(Wtypes.h)和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#调用DLL文件时参数对应表  
Wtypes.h中的非托管类型  非托管 C语言类型        托管类名                说明    
HANDLE           void*                     System.IntPtr                 32 位    
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.StringBuilder   用 ANSI 修饰。    
LPCSTR            Const char*        System.String 或System.StringBuilder   用 ANSI 修饰。    
LPWSTR            wchar_t*           System.String 或System.StringBuilder   用 Unicode 修饰。    
LPCWSTR           Const wchar_t*     System.String 或System.StringBuilder   用 Unicode 修饰。    
FLOAT              Float             System.Single                       32 位    
DOUBLE             Double            System.Double                       64 位  
 
习惯用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 位

 

 

COM类型对应:
COM 值类型 COM 引用类型 系统类型 
bool bool * System.Int32 
char、smallchar *、small *System.SByte 
short short * System.Int16 
long、intlong *、int *System.Int32 
Hyper hyper * System.Int64 
unsigned char、byteunsigned char *、byte *System.Byte 
wchar_t、unsigned shortwchar_t *、unsigned short *System.UInt16 
unsigned long、unsigned intunsigned long *、unsigned int *System.UInt32 
unsigned hyper unsigned hyper * System.UInt64 
float float * System.Single 
double double * System.Double 
VARIANT_BOOL VARIANT_BOOL * System.Boolean 
void* void ** System.IntPtr 
HRESULT HRESULT * System.Int16 或 System.IntPtr
SCODE SCODE * System.Int32 
BSTR BSTR * System.String 
LPSTR 或 [string, ...] char *LPSTR * System.String 
LPWSTR 或 [string, …] wchar_t *LPWSTR * System.String 
VARIANT VARIANT * System.Object 
DECIMAL DECIMAL * System.Decimal 
DATE DATE * System.DateTime 
GUID GUID * System.Guid 
CURRENCY CURRENCY * System.Decimal 
IUnknown * IUnknown ** System.Object 
IDispatch * IDispatch ** System.Object 
SAFEARRAY( type ) SAFEARRAY( type ) *type [] 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值