COM
VBからATL(COM)に文字列を渡す
(2009. 10. 18)
ATL(COM)にVB側から文字列を渡すにはBSTRを使います。BSTR型の本体を辿って行くと、
typedef wchar_t WCHAR;
typedef WCHAR OLECHAR;
typedef OLECHAR *BSTR;
ということで、BSTR型はwchar_t*(2バイト文字ポインタ)、つまりUnicodeです。これは、COMでの文字列のやり取りはUnicodeで行うという事を暗に示しています。
ATLをマルチバイト文字列で作っている場合は文字コードの変更を要します。これ、典型的な書き方がありますので変換関数を備忘録として示します:
Wide -> マルチバイト文字 std::string WideToMB(const BSTR& text) {
int sz = WideCharToMultiByte( CP_ACP, 0, (OLECHAR*)text, -1, 0, 0, 0, 0);
char *buf = new char[ sz ];
WideCharToMultiByte( CP_ACP, 0, (OLECHAR*)text, -1, buf, sz, 0, 0);
std::string str = buf;
delete[] buf;
return str;
}
std::stringを用いなくても良いのですが、バッファの処理等を呼び出し側で処理する必要があって面倒なのでこうしました。後はATL側で公開するインターフェイスの引数にBSTR型を追加し、上の関数を通してstd::stringを得れば文字列の引渡しは完了。