VC++のATLを使って、COMを書くときのTips
COMのプログラムをする際に、一番問題になるのが BSTRを使った文字列の処理です*1。一つ扱いを間違えるとすぐにメモリーリークを引き起こす原因にもなるため、細心の注意が必要です。
基本的には、[in] BSTR、[out] BSTR*、と受け取る際には BSTR型で、値を返す際には BSTR*型を使うことになります。その際に以下のクラスを使い、インターフェイス上でBSTRをstd::stringに変換をして、あとはSTLの世界に移ってしまえば気楽になれます。
備忘録代わりにコードを張っておきます。ATLを使用することを前提としているので、CComBSTRをincludeなしに書いてます。
#pragma once #include <string> namespace ComStringUtil { inline void StringToBSTR(const std::string& str, BSTR* p_bstr) { *p_bstr = CComBSTR(str.c_str()).Detach(); } inline void BSTRToString(const BSTR& bstr, std::string& out_str) { out_str = CW2A(bstr); } }
VC++に詳しい方、これじゃまずいよなど問題があればツッコミお願いします。
*1:自分基準で