.NET 调用 Win32 API

来源:互联网 发布:花瓣软件下载 编辑:程序博客网 时间:2024/05/16 09:57

原文地址:http://www.codeproject.com/Articles/9714/Win32-API-C-to-NET

.NET 调用 API 声明格式

VB.NET

Declare Function <Name> Lib <dll name> <Optional fields> (<params>) As <return type>' Example:Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA"(_ ByVal dwFlags As Integer, ByRef lpSource As Object, _ ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, _ ByVal lpBuffer As String, ByVal nSize As Integer, _ ByRef Arguments As Integer) As Integer

C#

[DllImport("<dll name>", <optional fields>)]static extern <return type> <Method name>(<Params>)[DllImport("kernel32.dll", SetLastError=true)]// Example:static extern int FormatMessageA(int dwFlags,     ref object lpSource,    int dwMessageId,    int dwLanguageId,    string lpBuffer,    int nSize,    ref int Arguments)

Managed C++ .NET

[DllImport("<Dll name>",<optional fields>)] static <return type> <Function name>( <Params>);// Example:[DllImport("KERNEL32.DLL",EntryPoint="MoveFileW", SetLastError=true,CharSet=CharSet::Unicode,ExactSpelling=true, CallingConvention=CallingConvention::StdCall)]static bool MoveFile(String^ src, String^ dst);

数据类型转换表: C++ 到 .NET

类型.NET

C++

ATOM

ushorttypedef WORD ATOM;

BOOL

bool, inttypedef int BOOL;

BOOLEAN

bool, bytetypedef BYTE BOOLEAN;BYTEbytetypedef unsigned char BYTE;CALLBACKdelegate#define CALLBACK __stdcallCHARchartypedef char CHAR;COLORREFuinttypedef DWORD COLORREF;CONSTconst#define CONST constDWORDuinttypedef unsigned long DWORD;DWORDLONGulongtypedef ULONGLONG DWORDLONG;

DWORD_PTR
DWORD *

uint, IntPtrtypedef ULONG_PTR DWORD_PTR;DWORD32uinttypedef unsigned int DWORD32;DWORD64ulongtypedef unsigned __int64 DWORD64;FLOATsingletypedef float FLOAT;HACCELIntPtrtypedef HANDLE HACCEL;HANDLEIntPtrtypedef PVOID HANDLE;HBITMAPIntPtrtypedef HANDLE HBITMAP;HBRUSHIntPtrtypedef HANDLE HBRUSH;HCOLORSPACEIntPtrif(WINVER >= 0x0400)
typedef HANDLE HCOLORSPACE;HCONVIntPtrtypedef HANDLE HCONV;HCONVLISTIntPtrtypedef HANDLE HCONVLIST;HCURSORIntPtrtypedef HICON HCURSOR;HDCIntPtrtypedef HANDLE HDC;HDDEDATAIntPtrtypedef HANDLE HDDEDATA;HDESKIntPtrtypedef HANDLE HDESK;HDROPIntPtrtypedef HANDLE HDROP;HDWPIntPtrtypedef HANDLE HDWP;HENHMETAFILEIntPtrtypedef HANDLE HENHMETAFILE;HFILEinttypedef int HFILE;HFONTIntPtrtypedef HANDLE HFONT;HGDIOBJIntPtrtypedef HANDLE HGDIOBJ;HGLOBALIntPtrtypedef HANDLE HGLOBAL;HHOOKIntPtrtypedef HANDLE HHOOK;HICONIntPtrtypedef HANDLE HICON;HINSTANCEIntPtrtypedef HANDLE HINSTANCE;HKEYIntPtrtypedef HANDLE HKEY;HKLIntPtrtypedef HANDLE HKL;HLOCALIntPtrtypedef HANDLE HLOCAL;HMENUIntPtrtypedef HANDLE HMENU;HMETAFILEIntPtrtypedef HANDLE HMETAFILE;HMODULEIntPtrtypedef HINSTANCE HMODULE;HMONITORIntPtr

if(WINVER >= 0x0500)

typedef HANDLE HMONITOR;

HPALETTEIntPtrtypedef HANDLE HPALETTE;HPENIntPtrtypedef HANDLE HPEN;HRESULTint, uinttypedef LONG HRESULT;HRGNIntPtrtypedef HANDLE HRGN;HRSRCIntPtrtypedef HANDLE HRSRC;HSZIntPtrtypedef HANDLE HSZ;HWINSTAIntPtrtypedef HANDLE WINSTA;HWNDIntPtrtypedef HANDLE HWND;INTinttypedef int INT;INT_PTRIntPtr

#if defined(_WIN64)
typedef __int64 INT_PTR;
#else
typedef int INT_PTR;

INT32inttypedef signed int INT32;INT64longtypedef signed __int64 INT64;LANGIDushort, inttypedef WORD LANGID;LCIDuinttypedef DWORD LCID;LCTYPEuinttypedef DWORD LCTYPE;LGRPIDuinttypedef DWORD LGRPID;LONGinttypedef long LONG;LONGLONGlong

#if !defined(_M_IX86)
typedef __int64 LONGLONG;
#else
typedef double LONGLONG;

LONG_PTRIntPtr

#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;

LONG32inttypedef signed int LONG32;LONG64longtypedef __int64 LONG64;LPARAMIntPtrtypedef LONG_PTR LPARAM;

LPBOOL
Bool *

IntPtr, booltypedef BOOL *LPBOOL;

LPBYTE
Byte *

IntPtr, bytetypedef BYTE *LPBYTE;LPCOLORREFIntPtr, uinttypedef DWORD *LPCOLORREF;LPCSTRstring, IntPtr, StringBuildertypedef CONST CHAR *LPCSTR;LPCTSTRstring, IntPtr, StringBuilder

#ifdef UNICODE
typedef LPCWSTR LPCTSTR;
#else
typedef LPCSTR LPCTSTR;

LPCVOIDIntPtrtypedef CONST void *LPCVOID;LPCWSTRstring, IntPtr, StringBuildertypedef CONST WCHAR *LPCWSTR;LPDWORDIntPtr, uinttypedef DWORD *LPDWORD;LPHANDLEIntPtrtypedef HANDLE *LPHANDLE;LPINTIntPtr, inttypedef int *LPINT;LPLONGIntPtr, inttypedef long *LPLONG;LPSTRstring, IntPtr, StringBuildertypedef CHAR *LPSTR;LPTSTRstring, IntPtr, StringBuilder

#ifdef UNICODE
typedef LPWSTR LPTSTR;
#else
typedef LPSTR LPTSTR;

LPVOIDIntPtrtypedef void *LPVOID;LPWORDIntPtr, ushorttypedef WORD *LPWORD;LPWSTRstring, IntPtr, StringBuildertypedef WCHAR *LPWSTR;LRESULTIntPtr, inttypedef LONG_PTR LRESULT;PBOOLIntPtr, booltypedef BOOL *PBOOL;PBOOLEANIntPtr, booltypedef BOOLEAN *PBOOLEAN;PBYTEIntPtr, bytetypedef BYTE *PBYTE;PCHARIntPtr, chartypedef CHAR *PCHAR;PCSTRstring, IntPtr, StringBuildertypedef CONST CHAR *PCSTR;PCTSTRstring, IntPtr, StringBuilder

#ifdef UNICODE
typedef LPCWSTR PCTSTR;
#else
typedef LPCSTR PCTSTR;

PCWSTRstring, IntPtr, StringBuildertypedef CONST WCHAR *PCWSTR;PDWORDIntPtr, uinttypedef DWORD *PDWORD;PDWORDLONGIntPtr, ulongtypedef DWORDLONG *PDWORDLONG;PDWORD_PTRIntPtr, uinttypedef DWORD_PTR *PDWORD_PTR;PDWORD32IntPtr, uinttypedef DWORD32 *PDWORD32;PDWORD64IntPtr, ulongtypedef DWORD64 *PDWORD64;PFLOATIntPtr, singletypedef FLOAT *PFLOAT;PHANDLEIntPtrtypedef HANDLE *PHANDLE;PHKEYIntPtrtypedef HKEY *PHKEY;PINTIntPtr, inttypedef int *PINT;PINT_PTRIntPtrtypedef INT_PTR *PINT_PTR;PINT32IntPtr, inttypedef INT32 *PINT32;PINT64IntPtr, longtypedef INT64 *PINT64;PLCIDIntPtr, uinttypedef PDWORD PLCID;PLONGIntPtr, inttypedef LONG *PLONG;PLONGLONGIntPtr, longtypedef LONGLONG *PLONGLONG;PLONG_PTRIntPtr, inttypedef LONG_PTR *PLONG_PTR;PLONG32IntPtr, inttypedef LONG32 *PLONG32;PLONG64IntPtr, longtypedef LONG64 *PLONG64;POINTER_32IntPtr, int

#if defined(_WIN64)
#define POINTER_32 __ptr32
#else
#define POINTER32

POINTER_64IntPtr, long#define POINTER_64 __ptr64PSHORTIntPtr, shorttypedef SHORT *PSHORT;PSIZE_TIntPtrtypedef SIZE_T *PSIZE_T;PSSIZE_TIntPtrtypedef SSIZE_T *PSSIZE_T;PSTRIntPtr, string, StringBuildertypedef CHAR *PSTR;PTBYTEIntPtr, chartypedef TBYTE *PTBYTE;PTCHARIntPtr, string, StringBuildertypedef TCHAR *PTCHAR;PTSTRIntPtr, string, StringBuilder

#ifdef UNICODE
typedef LPWSTR PTSTR;
#else
typedef LPSTR PTSTR;

PUCHARIntPtr, string, StringBuildertypedef UCHAR *PUCHAR;PUINTIntPtr, uinttypedef UINT *PUINT;PUINT_PTRIntPtr, uinttypedef UINT_PTR *PUINT_PTR;PUINT32IntPtr, uinttypedef UINT32 *PUINT32;PUINT64IntPtr, ulongtypedef UINT64 *PUINT64;PULONGIntPtr, uinttypedef ULONG *PULONG;PULONGLONGIntPtr, ulongtypedef ULONGLONG *PULONGLONG;PULONG_PTRIntPtr, uint:typedef ULONG_PTR *PULONG_PTR;PULONG32IntPtr, uinttypedef ULONG32 *PULONG32;PULONG64IntPtr, ulongtypedef ULONG64 *PULONG64;PUSHORTIntPtr, ushorttypedef USHORT *PUSHORT;PVOIDIntPtrtypedef void *PVOID;PWCHARIntPtr, stringtypedef WCHAR *PWCHAR;PWORDIntPtr, ushorttypedef WORD *PWORD;PWSTRIntPtr, string, StringBuildertypedef WCHAR *PWSTR;SC_HANDLEIntPtrtypedef HANDLE SC_HANDLE;SC_LOCKIntPtrtypedef LPVOID SC_LOCK;SERVICE_STATUS_HANDLEIntPtrtypedef HANDLE SERVICE_STATUS_HANDLE;SHORTshorttypedef short SHORT;SIZE_Tuint, IntPtrtypedef ULONG_PTR SIZE_T;SSIZE_Tint, IntPtrtypedef LONG_PTR SSIZE_T;TBYTEchar

#ifdef UNICODE
typedef WCHAR TBYTE;
#else
typedef unsigned char TBYTE;

TCHARchar

#ifdef UNICODE
typedef WCHAR TCHAR;
#else
typedef char TCHAR;

UCHARchartypedef unsigned char UCHAR;UINTuinttypedef unsigned int UINT;UINT_PTRUIntPtr, uint

#if defined(_WIN64)
typedef unsigned __int64 UINT_PTR;
#else
typedef unsigned int UINT_PTR;

UINT32uint

typedef unsigned int UINT32;

UINT64ulong

typedef usigned __int64 UINT64;

ULONGuinttypedef unsigned long ULONG;ULONGLONGulong

#if !defined(_M_IX86)
typedef unsigned __int64 ULONGLONG;
#else
typedef double ULONGLONG

ULONG_PTRIntPtr, uint

#if defined(_WIN64)
typedef unsigned __int64 ULONG_PTR;
#else
typedef unsigned long ULONG_PTR;

ULONG32uinttypedef unsigned int ULONG32;ULONG64ulongtypedef unsigned __int64 ULONG64;USHORTushorttypedef unsigned short USHORT;USNlongtypedef LONGLONG USN;VOIDvoid#define VOID voidWCHARchartypedef wchar_t WCHAR;WINAPI参见 CallingConvention 枚举#define WINAPI __stdcallWORDushorttypedef unsigned short WORD;WPARAMIntPtr, uinttypedef UINT_PTR WPARAM;

 

提示

  1. 列表中指向某一类型的指针使用前缀表示,例如: DWORD* = PDWORD
  2. 某些类型(例如: UIntPtr)不兼容 CLS,所以使用了 IntPtr,你可以根据你实际的情况进行选择
  3. 通常在 IDE 中输入“=”号后Intellisense自动弹出的类型是最好的选择
  4. 在 COM Interop 中使用字符串时,应当总是使用 WCHAR*,TCHAR* 等等来作为输入;使用 string StringBuilder 作为输出。当你用一个 IntPtr 通过 Marshal.PtrToStructure() 方法来提取所有字符时会需要递增指针,可以使用 pointer +=Marshal.SizeOf(<last object you got back>);
  5. 有时数据类型并不需要完全一致,譬如 int 可以用来替换 uint
  6. 需要把 IntPtr 转换为 int 或其他类的时候,应使用 Marshal.PtrToStructure() 或IntPtr 的成员方法
  7. 如果你使用的 API 建立在 ANSI 或 Unicode 的基础上,首先应确保选择了正确的API。参见: CharSet 枚举
  8. 大多数的 API 可以写成托管类型的声明,但某些需要指针,在 C# 中使用 unsafe 关键字你就能使用指针,另外编译时记得带上 /unsafe 开关
  9. 如果想确保 gc 不回收API 调用时使用的 IntPtr,你可以使用 HandleRef 类型
  10. 当需要为API定义一个结构时,确保他们带上 StructLayout.Sequential 属性
  11. 使用 API 方法传入/传出数组时,先确认是一个指向数组的指针还是一个数组对象,如果是指针你需要先把它转成 IntPtr
  12. 列表中多使用 IntPtr 来提取某个类型,有时你可以直接用 ref <datatype> 或 out <datatype>的形式,但是对于char*  你还是要用IntPr 作为输入,用 ref IntPtr 作为输出
  13. 当你定义的函数无法正常工作,并不一定是你的函数定义写错了,这有可能是传入了错误的数据或其他原因
  14. 仅在必要时使用 Marshal MarshalAs,某些场合下他们消耗较多的处理时间