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

VB 與 VC 互通入門(一):從零建立 DLL 調用與基本類型對照表

     編輯:VC 教學

為什麼要 VB 調用 VC DLL?

VB 開發介面快,但底層運算、硬體操作、高效能演算法受限。VC 擅長系統級編程、複雜資料結構、高速運算。將核心邏輯封裝為 VC DLL,VB 負責 UI 與業務流程,發揮雙方優勢。

第一步:最簡 DLL 專案 (無參數、無返回)

VC 代碼 (編譯為 `commication.dll`)

extern "C" __declspec(dllexport) void ReadString(void) {
    // 核心功能實現
}

VB 聲明與調用

Private Declare Function ReadString Lib "commication.dll" () As Long
Call ReadString  ' 僅觸發執行,無資料交換

第二步:基本類型雙向傳遞 (以 Boolean 為例)

VC

extern "C" __declspec(dllexport) bool ReadString(bool receive) {
    return receive;  // 原樣返回
}

VB

Private Declare Function ReadString Lib "commication.dll" _
    (ByVal send As Boolean) As Boolean

Dim send As Boolean, result As Boolean
send = False
result = ReadString(send)
' result 為 False

核心知識:VC ↔ VB 資料類型完整對照表

原則:VB 端統一用 `ByVal` 傳值 (字串除外),類型大小需嚴格對應。

VC 類型VB 聲明備註
ATOM, WORD, SHORTByVal var As Integer16 位有號/無號
BOOLByVal var As BooleanVC 4 字節,VB 2 字節,慎用,建議改用 Long
BYTE, CHARByVal var As Byte8 位
COLORREF, DWORD, LONG, HANDLE*, LPARAM, WPARAM, LRESULTByVal var As Long32 位,VB Long 為有號,注意無號邊界
INT, UINTByVal var As LongVC 通常 32 位
LPSTR, LPCSTRByVal var As StringVB 自動 BSTR→ANSI 轉換
LPVOIDByVal var As Any任意指標,字串時需 ByVal
LPRECT, 自定義結構體ByRef var As UserType傳址,結構體需對齊一致
VOIDSub 程序無返回值

關鍵陷阱提醒

  • BOOL ≠ Boolean:VC `BOOL` 是 4 字節 `int`,VB `Boolean` 是 2 字節。跨語言請用 `LONG`/`Long` 代替。
  • 呼叫慣例:VC 預設 `__cdecl`,VB 要求 `__stdcall`。導出函數必須加 `WINAPI` 或 `__stdcall`,或在 `.def` 檔指定。
  • 名稱修飾:`extern "C"` 禁止 C++ 名稱修飾,配合 `__declspec(dllexport)` 確保導出名稱純淨。
  • 執行緒安全:DLL 全域變數在多線程 VB 應用中需加鎖保護。

專案設定清單

  1. VC 專案:Configuration Properties → General → Configuration Type = Dynamic Library (.dll)
  2. VC 專案:C/C++ → Code Generation → Runtime Library = Multithreaded DLL (/MD) 或 /MT (靜態連結,避免 VC 版本不匹配)
  3. VB 專案:專案屬性 → Components → 勾選 DLL 或用 `Declare` 動態載入
  4. 部署:DLL 放置於 VB 專案目錄、System32 或 PATH 環境變數路徑

結語

本文建立了 VB/VC 互通的最小知識集:導出函數規範、類型對照表、呼叫慣例、部署要點。下一篇將深入字串、陣列、結構體、回調函數等進階場景,敬請期待。

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