いつもお世話になります。
以下のようなソースを書きました。
STDMETHODIMP CTestCom::Func(BSTR bstrVS, VARIANT_BOOL *ret)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
*ret = VARIANT_FALSE;
char strVS[4 + 1];
memset(strVS, 0x00, sizeof(strVS));
CString szVS = bstrVS; <--- ここ
strcpy(strVS, szVS);
m_ctrl.CheckFunc(strVS);
return S_OK;
}
問題なく動いているのですが、<--- ここ の行の
CStringにBSTRの代入の部分が気になります。
いろいろなサイトを見たり既存のソースを見たりすると違う方法がとられています。
なので、もしかすると欠点がある or 致命的な間違いなのかと思い投稿しました。
補足:
引数のBSTRには常に4桁の文字が入っています。
よろしくお願いします
適切なoperator=が定義されていれば問題ないと思う。
# マニュアル/ソースを読めばいい。
BSTRは文字列の前に4バイトの文字列長(単位はバイトで終端文字を含まない)を
持っています。なので文字列のなかにバイナリの0を含むことが出来ます。
そのため、呼び出し側が0を埋め込む可能性があるなら
単純にCString型に代入するだけではうまくいかないでしょう。
0が含まれないことが確実ならCString型に代入できます。
しかし、ATLとMFCのバージョンによっては以下のコードはエラーになるそうです。
CString szVS = bstrVS;
詳しくはここを見てください。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vccore/html/vclrfatlcompatibilityissues.asp