在使用 ADO 進行資料庫開發時,常會遇到 _bstr_t 這類智慧指標包裝類別。開發者可能會困惑:為什麼可以直接將 _bstr_t 物件傳給 printf 就能正確列印字串內容?
_bstr_t 內部封裝了 BSTR(基本字串)類型,並提供了隱含轉換運算子。當直接用於 printf 等 C 風格函式時,編譯器會自動呼叫其轉換函式,將內部的 Unicode 字串轉換為 ANSI 字串(或根據專案設定保持 Unicode),從而實現直接列印。
// 取得欄位名稱並直接列印
printf((_bstr_t)(m_pRec->Fields->GetItem((long)i)->GetName()));
_bstr_t 繼承自 _com_util::ConvertBSTRToString 相關邏輯,支援隱含轉換為 char* 或 wchar_t*。WideCharToMultiByte。_bstr_t::GetBSTR() 並自行轉換。理解這層機制,有助於在混合使用 COM 與 C 基礎庫時避免字串編碼錯誤。