VB6.0 專案需透過 Declare 呼叫 C++ 編寫的 DLL,傳入包含 BSTR 字串的結構體。開發者不確定如何在 VB 端正確宣告與讀取該欄位。
wchar_t*),前 4 位元組儲存長度,資料以雙位元組 null 結尾。ByVal str As String 會自動轉為 ANSI(依系統代碼頁),非 BSTR。需用 ByVal str As Long 接收指標,或改用型別庫。#pragma pack 與 VB Type 宣告必須位元組對齊一致,否則欄位偏移錯誤。.idl 定義介面與結構,編譯產生 .tlb。BSTR ↔ String)。' 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 並嚴格對齊結構體記憶體佈局。