VB 開發者常需調用 Windows API 實現高級功能,而 MSDN 文檔多以 VC++ 為主。本文系統總結 VC++ → VB 的核心轉換規則:常量定義、數據類型映射、結構體聲明、函數原型轉換,附帶完整對照表與實戰示例。
| VC++ 寫法 | VB 寫法 | 關鍵點 |
|---|---|---|
#define CONST_NAME 100 | Public Const CONST_NAME = 100 | 去掉 #define,用 Const,類型自動推斷 |
#define MSG_VAL 0x018C | Public Const MSG_VAL = &H18C | 十六進制:0x → &H |
#define FLAG (0U - 550U) | Public Const FLAG = (0 - 550) | 去掉 U/L 後綴,VB 無無符號類型,Long 足夠容納 |
#define COMBINE (A | B) | Public Const COMBINE = (A Or B) | 位或運算:| → Or |
| VC++ 類型 | VB 類型 | 備註 |
|---|---|---|
| short | Integer | 16 位有符號 |
| int, long, LONG | Long | 32 位有符號 |
| UINT, ULONG, DWORD, WORD | Long | VB 無無符號,用 Long 接收,邏輯運算同樣有效 |
| WPARAM, LPARAM, LRESULT | Long | 32 位平台下均為 32 位 |
| HANDLE, HWND, HDC, HBRUSH, HKEY, HINSTANCE | Long | 所有句柄本質是 32 位指針/索引 |
| BOOL | Long 或 Boolean | API 多用 Long (0/非0);VB 邏輯判斷可用 Boolean |
| COLORREF | Long | RGB 值 |
| LPSTR, LPCSTR, LPTSTR | String | VB 自動將 String 轉為 ANSI 指針傳遞 (ByVal) |
| LPWSTR, OLECHAR, BSTR | String | VB 內部 Unicode,自動轉換 |
| VARIANT_BOOL | Boolean | COM 專用 (-1/0) |
| BYTE, unsigned char | Byte | 8 位無符號 |
| VARIANT | Variant | 通用類型 |
| 所有指針類型 (* / **) | Long | 傳遞地址值 |
typedef struct tagTBSAVEPARAMSA {
HKEY hkr;
LPCSTR pszSubKey;
LPCSTR pszValueName;
} TBSAVEPARAMSA, *LPTBSAVEPARAMSA;
Public Type TBSAVEPARAMSA
hkr As Long ' HKEY → Long
pszSubKey As String ' LPCSTR → String
pszValueName As String ' LPCSTR → String
End Type
規則:
typedef struct tagNAME { ... } NAME, *PNAME; → Public Type NAME ... End Type (指針類型忽略,VB 用變量直接傳遞)。String,VB 調用 API 時自動轉為指針。ByRef (默認) 或 ByVal 配合 VarPtr。WINCOMMCTRLAPI HWND WINAPI
CreateStatusWindowA(LONG style, LPCSTR lpszText, HWND hwndParent, UINT wID);
Public Declare Function CreateStatusWindowA Lib "ComCtl32.dll" _
(ByVal style As Long, _
ByVal lpszText As String, _
ByVal hwndParent As Long, _
ByVal wID As Long) As Long
WINAPI = __stdcall,VB 默認即 StdCall,無需聲明。HWND → As Long。WINCOMMCTRLAPI 推斷或查 MSDN「DLL」欄位 (此處 ComCtl32.dll)。ByVal ... As String (VB 自動處理 ANSI 轉換),其餘數值類型用 ByVal ... As Long。A (ANSI) 或 W (Unicode) 後綴,VB 通常用 ANSI 版 (A)。BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);
// RECT 結構: long left, top, right, bottom;
' 1. 常量 (若有)
' 2. 結構體
Public Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
' 3. API 聲明
Public Declare Function GetWindowRect Lib "user32.dll" _
(ByVal hWnd As Long, _
ByRef lpRect As RECT) As Long ' BOOL → Long
' 4. 調用示例
Private Sub Command1_Click()
Dim hWnd As Long
hWnd = FindWindow(vbNullString, "計算器") ' 另一 API
If hWnd <> 0 Then
Dim rc As RECT
Dim ret As Long
ret = GetWindowRect(hWnd, rc)
If ret <> 0 Then
MsgBox "Left:" & rc.Left & " Top:" & rc.Top & _
" Right:" & rc.Right & " Bottom:" & rc.Bottom
End If
End If
End Sub
| 場景 | 問題 | 解決方案 |
|---|---|---|
| 回調函數 | VB 不支持函數指針直接傳遞 | 使用 AddressOf 獲取函數指針 (VB6/IDE 限制);或改用類模塊實現介面 |
| 可變參數 (...) | VB 不支持 | 封裝為多個重載 Declare,或用 Variant 數組模擬 |
| 結構體嵌套指針 | String 成員指針生命週期 | 確保 String 變量在 API 調用期間不被釋放/移動 (用模塊級變量) |
| Unicode API (xxxW) | VB 內部 Unicode,但 Declare 默認 ANSI | 用 Declare Function ... Alias "FuncW" ... 並傳 ByVal StrPtr(str) (指針) 或升級 VB.NET |
| 64 位兼容 | Long 為 32 位,指針截斷 | VB6 無原生 64 位支持;遷移至 VB.NET (LongPtr / IntPtr) |
Project → References 引用,無需手寫 Declare。「類型映射表 + 結構體展平 + Declare 語法」是 VC++→VB 轉換的鐵三角。掌握 Long 統領句柄/指針/整數、String 自動封送、ByVal/ByRef 語義區別,即可將任意 Windows API 平滑遷移至 VB。隨著 VB6 退出歷史舞台,建議新項目直接采用 VB.NET (DllImport、Marshal、SafeHandle),享受類型安全與 64 位原生支持。