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

VC++ 代碼轉 VB 代碼完全指南:常量、結構、API 函數聲明對照表

     編輯:VC 教學

前言

VB 開發者常需調用 Windows API 實現高級功能,而 MSDN 文檔多以 VC++ 為主。本文系統總結 VC++ → VB 的核心轉換規則:常量定義、數據類型映射、結構體聲明、函數原型轉換,附帶完整對照表與實戰示例。

一、常量定義轉換

VC++ 寫法VB 寫法關鍵點
#define CONST_NAME 100Public Const CONST_NAME = 100去掉 #define,用 Const,類型自動推斷
#define MSG_VAL 0x018CPublic 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 類型備註
shortInteger16 位有符號
int, long, LONGLong32 位有符號
UINT, ULONG, DWORD, WORDLongVB 無無符號,用 Long 接收,邏輯運算同樣有效
WPARAM, LPARAM, LRESULTLong32 位平台下均為 32 位
HANDLE, HWND, HDC, HBRUSH, HKEY, HINSTANCELong所有句柄本質是 32 位指針/索引
BOOLLong 或 BooleanAPI 多用 Long (0/非0);VB 邏輯判斷可用 Boolean
COLORREFLongRGB 值
LPSTR, LPCSTR, LPTSTRStringVB 自動將 String 轉為 ANSI 指針傳遞 (ByVal)
LPWSTR, OLECHAR, BSTRStringVB 內部 Unicode,自動轉換
VARIANT_BOOLBooleanCOM 專用 (-1/0)
BYTE, unsigned charByte8 位無符號
VARIANTVariant通用類型
所有指針類型 (* / **)Long傳遞地址值

三、結構體 (Struct) 轉換

VC++ 原始定義

typedef struct tagTBSAVEPARAMSA {
    HKEY hkr;
    LPCSTR pszSubKey;
    LPCSTR pszValueName;
} TBSAVEPARAMSA, *LPTBSAVEPARAMSA;

VB 聲明

Public Type TBSAVEPARAMSA
    hkr As Long              ' HKEY → Long
    pszSubKey As String      ' LPCSTR → String
    pszValueName As String   ' LPCSTR → String
End Type

規則:

  1. typedef struct tagNAME { ... } NAME, *PNAME; → Public Type NAME ... End Type (指針類型忽略,VB 用變量直接傳遞)。
  2. 成員類型按上表映射。
  3. 字符串成員聲明為 String,VB 調用 API 時自動轉為指針。
  4. 結構體傳遞給 API 時用 ByRef (默認) 或 ByVal 配合 VarPtr。

四、API 函數聲明轉換

VC++ 原型

WINCOMMCTRLAPI HWND WINAPI
CreateStatusWindowA(LONG style, LPCSTR lpszText, HWND hwndParent, UINT wID);

VB Declare 語句

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

轉換步驟

  1. 調用約定:WINAPI = __stdcall,VB 默認即 StdCall,無需聲明。
  2. 返回類型:HWND → As Long。
  3. DLL 名稱:從 WINCOMMCTRLAPI 推斷或查 MSDN「DLL」欄位 (此處 ComCtl32.dll)。
  4. 參數列表:逐個映射類型,字符串參數用 ByVal ... As String (VB 自動處理 ANSI 轉換),其餘數值類型用 ByVal ... As Long。
  5. 函數名:保留 A (ANSI) 或 W (Unicode) 後綴,VB 通常用 ANSI 版 (A)。

五、實戰綜合示例:調用 GetWindowRect

VC++ 文檔

BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);
// RECT 結構: long left, top, right, bottom;

VB 完整代碼

' 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)

七、工具推薦

  • API Viewer (VB6 內置加載項):預置海量常量/類型/Declare,可直接複製。
  • Pinvoke.net (網站):C#/VB.NET 簽名庫,VC++ 簽名可參考對照。
  • VC++ 類向導 → 類型庫導入:若有 COM 組件,VB 可直接 Project → References 引用,無需手寫 Declare。

結語

「類型映射表 + 結構體展平 + Declare 語法」是 VC++→VB 轉換的鐵三角。掌握 Long 統領句柄/指針/整數、String 自動封送、ByVal/ByRef 語義區別,即可將任意 Windows API 平滑遷移至 VB。隨著 VB6 退出歷史舞台,建議新項目直接采用 VB.NET (DllImport、Marshal、SafeHandle),享受類型安全與 64 位原生支持。

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