原文地址: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 | ushort | typedef WORD ATOM; |
| BOOL | bool, int | typedef int BOOL; |
| BOOLEAN | bool, byte | typedef BYTE BOOLEAN; |
| BYTE | byte | typedef unsigned char BYTE; |
| CALLBACK | delegate | #define CALLBACK __stdcall |
| CHAR | char | typedef char CHAR; |
| COLORREF | uint | typedef DWORD COLORREF; |
| CONST | const | #define CONST const |
| DWORD | uint | typedef unsigned long DWORD; |
| DWORDLONG | ulong | typedef ULONGLONG DWORDLONG; |
| DWORD_PTR | uint, IntPtr | typedef ULONG_PTR DWORD_PTR; |
| DWORD32 | uint | typedef unsigned int DWORD32; |
| DWORD64 | ulong | typedef unsigned __int64 DWORD64; |
| FLOAT | single | typedef float FLOAT; |
| HACCEL | IntPtr | typedef HANDLE HACCEL; |
| HANDLE | IntPtr | typedef PVOID HANDLE; |
| HBITMAP | IntPtr | typedef HANDLE HBITMAP; |
| HBRUSH | IntPtr | typedef HANDLE HBRUSH; |
| HCOLORSPACE | IntPtr | if(WINVER >= 0x0400) typedef HANDLE HCOLORSPACE; |
| HCONV | IntPtr | typedef HANDLE HCONV; |
| HCONVLIST | IntPtr | typedef HANDLE HCONVLIST; |
| HCURSOR | IntPtr | typedef HICON HCURSOR; |
| HDC | IntPtr | typedef HANDLE HDC; |
| HDDEDATA | IntPtr | typedef HANDLE HDDEDATA; |
| HDESK | IntPtr | typedef HANDLE HDESK; |
| HDROP | IntPtr | typedef HANDLE HDROP; |
| HDWP | IntPtr | typedef HANDLE HDWP; |
| HENHMETAFILE | IntPtr | typedef HANDLE HENHMETAFILE; |
| HFILE | int | typedef int HFILE; |
| HFONT | IntPtr | typedef HANDLE HFONT; |
| HGDIOBJ | IntPtr | typedef HANDLE HGDIOBJ; |
| HGLOBAL | IntPtr | typedef HANDLE HGLOBAL; |
| HHOOK | IntPtr | typedef HANDLE HHOOK; |
| HICON | IntPtr | typedef HANDLE HICON; |
| HINSTANCE | IntPtr | typedef HANDLE HINSTANCE; |
| HKEY | IntPtr | typedef HANDLE HKEY; |
| HKL | IntPtr | typedef HANDLE HKL; |
| HLOCAL | IntPtr | typedef HANDLE HLOCAL; |
| HMENU | IntPtr | typedef HANDLE HMENU; |
| HMETAFILE | IntPtr | typedef HANDLE HMETAFILE; |
| HMODULE | IntPtr | typedef HINSTANCE HMODULE; |
| HMONITOR | IntPtr | if(WINVER >= 0x0500) typedef HANDLE HMONITOR; |
| HPALETTE | IntPtr | typedef HANDLE HPALETTE; |
| HPEN | IntPtr | typedef HANDLE HPEN; |
| HRESULT | int, uint | typedef LONG HRESULT; |
| HRGN | IntPtr | typedef HANDLE HRGN; |
| HRSRC | IntPtr | typedef HANDLE HRSRC; |
| HSZ | IntPtr | typedef HANDLE HSZ; |
| HWINSTA | IntPtr | typedef HANDLE WINSTA; |
| HWND | IntPtr | typedef HANDLE HWND; |
| INT | int | typedef int INT; |
| INT_PTR | IntPtr | #if defined(_WIN64) |
| INT32 | int | typedef signed int INT32; |
| INT64 | long | typedef signed __int64 INT64; |
| LANGID | ushort, int | typedef WORD LANGID; |
| LCID | uint | typedef DWORD LCID; |
| LCTYPE | uint | typedef DWORD LCTYPE; |
| LGRPID | uint | typedef DWORD LGRPID; |
| LONG | int | typedef long LONG; |
| LONGLONG | long | #if !defined(_M_IX86) |
| LONG_PTR | IntPtr | #if defined(_WIN64) |
| LONG32 | int | typedef signed int LONG32; |
| LONG64 | long | typedef __int64 LONG64; |
| LPARAM | IntPtr | typedef LONG_PTR LPARAM; |
| LPBOOL | IntPtr, bool | typedef BOOL *LPBOOL; |
| LPBYTE | IntPtr, byte | typedef BYTE *LPBYTE; |
| LPCOLORREF | IntPtr, uint | typedef DWORD *LPCOLORREF; |
| LPCSTR | string, IntPtr, StringBuilder | typedef CONST CHAR *LPCSTR; |
| LPCTSTR | string, IntPtr, StringBuilder | #ifdef UNICODE |
| LPCVOID | IntPtr | typedef CONST void *LPCVOID; |
| LPCWSTR | string, IntPtr, StringBuilder | typedef CONST WCHAR *LPCWSTR; |
| LPDWORD | IntPtr, uint | typedef DWORD *LPDWORD; |
| LPHANDLE | IntPtr | typedef HANDLE *LPHANDLE; |
| LPINT | IntPtr, int | typedef int *LPINT; |
| LPLONG | IntPtr, int | typedef long *LPLONG; |
| LPSTR | string, IntPtr, StringBuilder | typedef CHAR *LPSTR; |
| LPTSTR | string, IntPtr, StringBuilder | #ifdef UNICODE |
| LPVOID | IntPtr | typedef void *LPVOID; |
| LPWORD | IntPtr, ushort | typedef WORD *LPWORD; |
| LPWSTR | string, IntPtr, StringBuilder | typedef WCHAR *LPWSTR; |
| LRESULT | IntPtr, int | typedef LONG_PTR LRESULT; |
| PBOOL | IntPtr, bool | typedef BOOL *PBOOL; |
| PBOOLEAN | IntPtr, bool | typedef BOOLEAN *PBOOLEAN; |
| PBYTE | IntPtr, byte | typedef BYTE *PBYTE; |
| PCHAR | IntPtr, char | typedef CHAR *PCHAR; |
| PCSTR | string, IntPtr, StringBuilder | typedef CONST CHAR *PCSTR; |
| PCTSTR | string, IntPtr, StringBuilder | #ifdef UNICODE |
| PCWSTR | string, IntPtr, StringBuilder | typedef CONST WCHAR *PCWSTR; |
| PDWORD | IntPtr, uint | typedef DWORD *PDWORD; |
| PDWORDLONG | IntPtr, ulong | typedef DWORDLONG *PDWORDLONG; |
| PDWORD_PTR | IntPtr, uint | typedef DWORD_PTR *PDWORD_PTR; |
| PDWORD32 | IntPtr, uint | typedef DWORD32 *PDWORD32; |
| PDWORD64 | IntPtr, ulong | typedef DWORD64 *PDWORD64; |
| PFLOAT | IntPtr, single | typedef FLOAT *PFLOAT; |
| PHANDLE | IntPtr | typedef HANDLE *PHANDLE; |
| PHKEY | IntPtr | typedef HKEY *PHKEY; |
| PINT | IntPtr, int | typedef int *PINT; |
| PINT_PTR | IntPtr | typedef INT_PTR *PINT_PTR; |
| PINT32 | IntPtr, int | typedef INT32 *PINT32; |
| PINT64 | IntPtr, long | typedef INT64 *PINT64; |
| PLCID | IntPtr, uint | typedef PDWORD PLCID; |
| PLONG | IntPtr, int | typedef LONG *PLONG; |
| PLONGLONG | IntPtr, long | typedef LONGLONG *PLONGLONG; |
| PLONG_PTR | IntPtr, int | typedef LONG_PTR *PLONG_PTR; |
| PLONG32 | IntPtr, int | typedef LONG32 *PLONG32; |
| PLONG64 | IntPtr, long | typedef LONG64 *PLONG64; |
| POINTER_32 | IntPtr, int | #if defined(_WIN64) |
| POINTER_64 | IntPtr, long | #define POINTER_64 __ptr64 |
| PSHORT | IntPtr, short | typedef SHORT *PSHORT; |
| PSIZE_T | IntPtr | typedef SIZE_T *PSIZE_T; |
| PSSIZE_T | IntPtr | typedef SSIZE_T *PSSIZE_T; |
| PSTR | IntPtr, string, StringBuilder | typedef CHAR *PSTR; |
| PTBYTE | IntPtr, char | typedef TBYTE *PTBYTE; |
| PTCHAR | IntPtr, string, StringBuilder | typedef TCHAR *PTCHAR; |
| PTSTR | IntPtr, string, StringBuilder | #ifdef UNICODE |
| PUCHAR | IntPtr, string, StringBuilder | typedef UCHAR *PUCHAR; |
| PUINT | IntPtr, uint | typedef UINT *PUINT; |
| PUINT_PTR | IntPtr, uint | typedef UINT_PTR *PUINT_PTR; |
| PUINT32 | IntPtr, uint | typedef UINT32 *PUINT32; |
| PUINT64 | IntPtr, ulong | typedef UINT64 *PUINT64; |
| PULONG | IntPtr, uint | typedef ULONG *PULONG; |
| PULONGLONG | IntPtr, ulong | typedef ULONGLONG *PULONGLONG; |
| PULONG_PTR | IntPtr, uint: | typedef ULONG_PTR *PULONG_PTR; |
| PULONG32 | IntPtr, uint | typedef ULONG32 *PULONG32; |
| PULONG64 | IntPtr, ulong | typedef ULONG64 *PULONG64; |
| PUSHORT | IntPtr, ushort | typedef USHORT *PUSHORT; |
| PVOID | IntPtr | typedef void *PVOID; |
| PWCHAR | IntPtr, string | typedef WCHAR *PWCHAR; |
| PWORD | IntPtr, ushort | typedef WORD *PWORD; |
| PWSTR | IntPtr, string, StringBuilder | typedef WCHAR *PWSTR; |
| SC_HANDLE | IntPtr | typedef HANDLE SC_HANDLE; |
| SC_LOCK | IntPtr | typedef LPVOID SC_LOCK; |
| SERVICE_STATUS_HANDLE | IntPtr | typedef HANDLE SERVICE_STATUS_HANDLE; |
| SHORT | short | typedef short SHORT; |
| SIZE_T | uint, IntPtr | typedef ULONG_PTR SIZE_T; |
| SSIZE_T | int, IntPtr | typedef LONG_PTR SSIZE_T; |
| TBYTE | char | #ifdef UNICODE |
| TCHAR | char | #ifdef UNICODE |
| UCHAR | char | typedef unsigned char UCHAR; |
| UINT | uint | typedef unsigned int UINT; |
| UINT_PTR | UIntPtr, uint | #if defined(_WIN64) |
| UINT32 | uint | typedef unsigned int UINT32; |
| UINT64 | ulong | typedef usigned __int64 UINT64; |
| ULONG | uint | typedef unsigned long ULONG; |
| ULONGLONG | ulong | #if !defined(_M_IX86) |
| ULONG_PTR | IntPtr, uint | #if defined(_WIN64) |
| ULONG32 | uint | typedef unsigned int ULONG32; |
| ULONG64 | ulong | typedef unsigned __int64 ULONG64; |
| USHORT | ushort | typedef unsigned short USHORT; |
| USN | long | typedef LONGLONG USN; |
| VOID | void | #define VOID void |
| WCHAR | char | typedef wchar_t WCHAR; |
| WINAPI | 参见 CallingConvention 枚举 | #define WINAPI __stdcall |
| WORD | ushort | typedef unsigned short WORD; |
| WPARAM | IntPtr, uint | typedef UINT_PTR WPARAM; |
提示
- 列表中指向某一类型的指针使用前缀表示,例如: DWORD* = PDWORD
- 某些类型(例如: UIntPtr)不兼容 CLS,所以使用了 IntPtr,你可以根据你实际的情况进行选择
- 通常在 IDE 中输入“=”号后Intellisense自动弹出的类型是最好的选择
- 在 COM Interop 中使用字符串时,应当总是使用 WCHAR*,TCHAR* 等等来作为输入;使用 string 或 StringBuilder 作为输出。当你用一个 IntPtr 通过 Marshal.PtrToStructure() 方法来提取所有字符时会需要递增指针,可以使用 pointer +=Marshal.SizeOf(<last object you got back>);
- 有时数据类型并不需要完全一致,譬如 int 可以用来替换 uint
- 需要把 IntPtr 转换为 int 或其他类的时候,应使用 Marshal.PtrToStructure() 或 IntPtr 的成员方法
- 如果你使用的 API 建立在 ANSI 或 Unicode 的基础上,首先应确保选择了正确的API。参见: CharSet 枚举
- 大多数的 API 可以写成托管类型的声明,但某些需要指针,在 C# 中使用 unsafe 关键字你就能使用指针,另外编译时记得带上 /unsafe 开关
- 如果想确保 gc 不回收API 调用时使用的 IntPtr,你可以使用 HandleRef 类型
- 当需要为API定义一个结构时,确保他们带上 StructLayout.Sequential 属性
- 使用 API 方法传入/传出数组时,先确认是一个指向数组的指针还是一个数组对象,如果是指针你需要先把它转成 IntPtr
- 列表中多使用 IntPtr 来提取某个类型,有时你可以直接用 ref <datatype> 或 out <datatype>的形式,但是对于char* 你还是要用 IntPr 作为输入,用 ref IntPtr 作为输出
- 当你定义的函数无法正常工作,并不一定是你的函数定义写错了,这有可能是传入了错误的数据或其他原因
- 仅在必要时使用 Marshal 及 MarshalAs,某些场合下他们消耗较多的处理时间
本文详细介绍了如何将C++ API调用转换为.NET API声明,包括VB.NET、C#和Managed C++的示例代码。文章还提供了数据类型转换表,帮助开发者在跨平台开发中实现无缝集成。
2841

被折叠的 条评论
为什么被折叠?



