.NET 调用 Win32 API

原文地址: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 __stdcall
CHARchartypedef char CHAR;
COLORREFuinttypedef DWORD COLORREF;
CONSTconst#define CONST const
DWORDuinttypedef 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 __ptr64
PSHORTIntPtr, 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 void
WCHARchartypedef wchar_t WCHAR;
WINAPI参见 CallingConvention 枚举#define WINAPI __stdcall
WORDushorttypedef 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,某些场合下他们消耗较多的处理时间
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值