首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# P/Invoke 參數類型對照表 (一) - Wtypes.h 核心類型速查

     編輯:關於C語言

撰寫 C# DllImport 互操作時,Win32 API 的龐雜類型 (HANDLE、LPSTR、DWORD、WPARAM...) 讓人頭痛。本文整理 `Wtypes.h` 定義的核心非托管類型與 .NET 托管類型的標準對照,作為速查表。

核心類型對照表 (Wtypes.h 節錄)

非托管類型 (Wtypes.h)C 語言類型.NET 托管類型大小 / 備註
HANDLEvoid*IntPtr / nint32/64 位元自適應,所有句柄通用
BYTEunsigned charbyte8 位元
SHORTshortshort16 位元
WORD / USHORTunsigned shortushort16 位元
INT / LONGint / longint32 位元 (Win32 long 為 32 位)
UINT / ULONG / DWORDunsigned int / longuint32 位元
BOOLlongint / bool32 位元,非零為真;建議用 int 並自行轉換
FLOATfloatfloat32 位元 IEEE 754
DOUBLEdoubledouble64 位元 IEEE 754
CHARcharsbyte / byteANSI 字元,8 位元
WCHAR / OLECHARwchar_tcharUnicode 字元,16 位元
LPSTR / LPCSTRchar* / const char*string / StringBuilder[MarshalAs(UnmanagedType.LPStr)]
LPWSTR / LPCWSTRwchar_t* / const wchar_t*string / StringBuilder[MarshalAs(UnmanagedType.LPWStr)] 預設
BSTRwchar_t* (長度前綴)string[MarshalAs(UnmanagedType.BStr)] COM 專用

筆者實戰原則

  1. 32 位元基準:本表假設 32 位元進程;64 位元下 `IntPtr`、`HANDLE`、`WPARAM`、`LPARAM`、`LRESULT` 為 64 位,其餘基本型別不變。
  2. 句柄統一用 IntPtr:`HWND`、`HDC`、`HKEY`、`HMODULE`... 所有 `H*` 類型一律對應 `IntPtr`,迄今未遇反例。
  3. 指標類型策略:
    • 字串指標 (`LP*STR`, `LPC*STR`, `P*STR`) → `string` / `StringBuilder`。
    • 資料指標 (`LP*DWORD`, `PINT` 等) → 陣列型別 (`uint[]`, `int[]`) 方便 .NET 存取;或 `IntPtr` 配合 `Marshal.Copy`。
    • 不透明指標 (`LPVOID`, `PVOID`) → `IntPtr`。
  4. CharSet 設定:`[DllImport("dll", CharSet = CharSet.Auto)]` 讓執行期依平台自動選 ANSI/Unicode 版本 (如 `MessageBox` → `MessageBoxA`/`MessageBoxW`)。

常見錯誤與除錯

現象可能原因修正
呼叫後參數值亂碼/錯誤CharSet 不匹配導致 ANSI/Unicode 字串解碼錯誤明確指定 CharSet.Ansi 或 Unicode
AccessViolationException結構體大小/對齊錯誤、陣列長度不足、傳遞 null 給非可空指標檢查 StructLayout.Pack、確保陣列預分配、使用 SafeHandle
64 位元下 Crash句柄/指標用 int 而非 IntPtr全部改為 IntPtr / nint
回呼不被觸發委派被 GC 回收靜態欄位或 GCHandle.Alloc 持有委派

下一篇

提供更完整的 Win32 API 常見類型對照 (含 `RECT`、`POINT`、`GUID`、`FILETIME`、`VARIANT`、回呼委派等) 及進階封送技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved