首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

VB6.0 呼叫 C++ DLL:BSTR 字串在 Type 結構體中的正確取值方式

     編輯:程式設計疑難解答

問題背景

VB6.0 專案需透過 Declare 呼叫 C++ 編寫的 DLL,傳入包含 BSTR 字串的結構體。開發者不確定如何在 VB 端正確宣告與讀取該欄位。

核心知識點

  • BSTR 本質:長度前綴的寬字元字串(wchar_t*),前 4 位元組儲存長度,資料以雙位元組 null 結尾。
  • VB6 字串傳遞:ByVal str As String 會自動轉為 ANSI(依系統代碼頁),非 BSTR。需用 ByVal str As Long 接收指標,或改用型別庫。
  • 結構體對齊:C++ #pragma pack 與 VB Type 宣告必須位元組對齊一致,否則欄位偏移錯誤。

推薦作法:建立型別庫

  1. C++ 專案加入 .idl 定義介面與結構,編譯產生 .tlb。
  2. VB6 專案 參考 該 TLB,直接使用早期繫結,型別自動對應(BSTR ↔ String)。
  3. 呼叫時無需手動轉換,Marshalling 由 COM 自動處理。

若必須用 Declare(晚期繫結)

' C++ 端
struct MyStruct {
    BSTR bstrField;
};
extern "C" __declspec(dllexport) void Process(MyStruct* p);

' VB6 端
Private Declare Sub Process Lib "MyDll.dll" (ByRef udt As MyStructUDT)

Private Type MyStructUDT
    bstrPtr As Long  ' 接收 BSTR 指標
End Type

' 使用時
Dim udt As MyStructUDT
udt.bstrPtr = SysAllocString("測試字串")  ' 需自行配置/釋放 BSTR
Process udt
SysFreeString udt.bstrPtr

缺點:需手動管理 BSTR 生命週期,易漏釋放或重複釋放導致崩潰。

參考資源

CSDN 詳細範例:VB6.0 呼叫 C++ DLL BSTR 字串處理

總結

跨語言傳遞 BSTR 最穩健的路徑是COM 型別庫 + 早期繫結,讓系統自動處理字串轉換與記憶體管理。若受限於舊架構必須用 Declare,務必成對呼叫 SysAllocString/SysFreeString 並嚴格對齊結構體記憶體佈局。

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