CStringにBSTRの代入は正常?

[戻る]
ナオーバ 2003/10/07(火) 10:30:07
いつもお世話になります。

以下のようなソースを書きました。
 
 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桁の文字が入っています。

よろしくお願いします

επιστημη [HomePage] 2003/10/07(火) 10:41:08
適切なoperator=が定義されていれば問題ないと思う。
# マニュアル/ソースを読めばいい。

dot 2003/10/07(火) 13:02:38
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

古いスレッドには追加発言できません。