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

VB 與 VC 互通進階(二):字串參數跨語言傳遞的 BSTR 與 LPSTR 轉換實戰

     編輯:VC 教學

回顧與問題引入

上篇實現了基本的 DLL 調用與布爾值傳遞。本篇攻克字串跨語言傳遞難題:VB 使用 BSTR (長度前綴 + Unicode + 雙空終止),VC DLL 習慣 LPSTR (以空字元結尾的 ANSI),直接傳址會導致記憶體誤讀。關鍵在於 VB 必須用 `ByVal` 傳值,讓編譯器自動執行 BSTR→ANSI 轉換。

記憶體佈局對比

特性VB BSTRC/C++ LPSTR
長度資訊頭部 4 字節儲存長度無,靠結尾 `\0` 判斷
字元編碼通常 Unicode (2 bytes/char)ANSI (1 byte/char) 或 UTF-8
結尾標記雙空字元 (`\0\0`)單空字元 (`\0`)
指標指向指向資料區第一個字元指向字串第一個字元

方案一:VB → VC (單向輸入)

VC DLL (導出函數)

extern "C" __declspec(dllexport) bool ReadString(LPCSTR lpString) {
    char standard[] = "Hello World!";
    return strcmp(lpString, standard) == 0;
}

VB 客戶端聲明

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

Dim result As Boolean
Dim send As String
send = "Hello,World!"
result = ReadString(send)
' VB 自動將 BSTR 轉為 ANSI 字串指標傳入

方案二:雙向傳遞 (VC 返回字串給 VB)

VC 需分配 BSTR 記憶體並返回,VB 聲明為 `As String` 接收。

VC DLL

extern "C" __declspec(dllexport) BSTR ReadString(LPCSTR lpString) {
    char standard[] = "Hello ,World!";
    if (strcmp(lpString, standard) == 0)
        return SysAllocString(L"Match Success"); // 分配 BSTR
    else
        return SysAllocString((BSTR)lpString);    // 將輸入轉為 BSTR 返回
}

VB 客戶端

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

Dim result As String
Dim send As String
send = "Hello,World!"
result = ReadString(send)
MsgBox result  ' 顯示返回的字串

關鍵 API 深度解析

  • SysAllocString:分配 BSTR 記憶體,自動處理長度前綴與雙空終止,調用者負責 `SysFreeString` 釋放。
  • SysStringLen / SysStringByteLen:安全獲取 BSTR 長度。
  • WideCharToMultiByte / MultiByteToWideChar:Unicode ↔ ANSI 手動轉換,適用於非 VB 環境(如 C# P/Invoke、C++ 直接操作)。

常見陷阱與最佳實踐

進階:自定義結構體傳遞

若需傳遞複雜結構,建議:

  1. VC 定義 `#pragma pack(1)` 結構體,導出 `void Process(MyStruct* pIn, MyStruct* pOut)`
  2. VB 定義對應 `Type`,用 `ByRef` 傳遞(結構體無 BSTR 問題)
  3. 3. 注意對齊、指標欄位禁止跨邊界、字串欄位改用固定長度陣列 `Char name(50)`

結語

掌握 BSTR/LPSTR 轉換規則,是 VB/VC 混合開發的核心門檻。`ByVal` + `SysAllocString` 組合解決 90% 字串互通場景。現代專案建議改用 COM 介面 (`IDispatch`/`IUnknown`) 或 .NET Interop,獲得類型安全與跨語言除錯能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
陷阱後果正確做法
VB 用 `ByRef` 傳字串VC 讀到 BSTR 結構體而非字串內容必須用 `ByVal`
VC 直接返回 `char*` 或 `CString`VB 解析錯誤,甚至崩潰返回 `BSTR` 並用 `SysAllocString`
忘記 `SysFreeString`記憶體洩漏VB 端自動釋放;C++ 端手動釋放
字元集不匹配 (MBCS vs Unicode)中文亂碼專案統一用 Unicode,或显式轉換