VB6 中 字符串本質是指向字符數據的指針(BSTR 結構),這是為了 COM/ActiveX 跨語言互操作而設計的。
VB 字符串變量 (4/8 字節指針)
│
▼
┌─────────────────────────────────────┐
│ BSTR 結構 (OLE Automation 標準) │
├─────────────────────────────────────┤
│ 長度前綴 (4 字節, 有符號長整型) │ ← 存儲字符數(不含結束符)
├─────────────────────────────────────┤
│ 字符數據 (UTF-16 編碼, 雙字節字符) │
│ 'H' 'e' 'l' 'l' 'o' 0x0000 │ ← 雙字節結束符
└─────────────────────────────────────┘
Len() 直接讀取長度前綴,O(1) 獲取長度。VB 字符串是內置類型,而非類實例。編譯器自動處理:
"Hello" → 編譯期創建 BSTR,存入數據段。s = "Hello" → 指針指向該 BSTR,引用計數 +1。' VB 端
Declare Sub MyFunc Lib "MyDll.dll" (ByVal str As String)
' C++ 端 (stdcall)
void __stdcall MyFunc(BSTR str) {
// str 直接指向 BSTR 數據區
UINT len = SysStringLen(str); // 獲取長度
wchar_t* data = str; // 直接訪問字符數據
// 需 SysFreeString(str) 釋放?否,VB 管理生命周期
}
BSTR 或 LPWSTR。BSTR*),C++ 可修改字符串內容或重新分配。| 特性 | VB String (BSTR) | C++ std::string | C++ std::wstring |
|---|---|---|---|
| 長度存儲 | 前綴 4 字節 | size() 成員變量 | size() 成員變量 |
| 編碼 | UTF-16 固定 | 通常 ANSI/UTF-8 | UTF-16/UTF-32 |
| 結束符 | 雙字節 0x0000 | 單字節 '\0' | 雙字節 L'\0' |
| 內存管理 | 引用計數自動 | RAII 自動 | RAII 自動 |
| 跨語言 | COM 標準原生支持 | 需轉換 | 需轉換 |
VB6 字符串無需 New 是因為它是編譯器內置的引用計數指針類型 (BSTR)。其設計目標是COM 互操作標準,自帶長度、雙字節編碼、自動內存管理。這使得 VB 字符串能直接作為指針傳遞給 C++ DLL,實現零拷貝跨語言調用。理解 BSTR 結構,是掌握 VB6 與 C++/COM 互操作的關鍵。