Last Updated 2004/03/23
Visual C++ DLL
VC++から文字列を渡す方法
2004/03/23

VB で作成した ActiveXDLL に VC++ から文字列を渡す方法


VB ActiveXDLL
Function MOJI( mojimoji as String)
end Function


VC側
char aaa[] = "MOJIMOJI";
spMojiPtr -> MOJI((BSTR*)aaa);


上記の様に char[] を強引に BSTR* でキャストしても望む効果はない.
MFC や ATL のヘッダで定義されている A2OLE() などのマクロを使う.
(以下参考)

    const char aaa [] = "MOJIMOJI";
    spMojiPtr->MOJI (A2OLE(aaa));

    TCHAR ttt [] = TEXT("MOJIMOJI");
    spMojiPtr->MOJI (T2OLE(ttt));


だからと言って
    const char aaa [] = "MOJIMOJI";
    spMojiPtr->MOJI ((BSTR*)A2OLE(aaa));
こうするのは危険である.(上記でも VB ActiveXDLL には文字列は渡る)

引数が BSTR* ってことは、aaa に文字列が帰ってくることが期待される.


プロパティ/メソッドに文字列を指定する場合
        put_Hoge (BSTR bstrHoge);       // 文字列を渡す時
        get_Hoge (BSTR* pbstrHoge);     // 文字列を受け取る時
のようにする.

引数が BSTR* の時,つまり文字列を受け取る可能性がある場合は上記の様に
        char aaa [] = "MOJIMOJI";
        spMojiPtr->MOJI (A2OLE(aaa));
みたいにしてはいけない.
MOJI() の実行により、"MOJIMOJI" よりも長い文字列が帰ってきたらメモリを破壊する.

以下に,「文字列を渡す時」「文字列を受け取る時」の疑似コードを示す.

        // 文字列を渡す時
        const TCHAR aaa [] = TEXT("MOJIMOJI");
        spFoo->put_Hoge (T2OLE(aaa));

        // 文字列を受け取る時
        BSTR bbb = 0;
        spFoo->put_Hoge (bbb);

        LPTSTR paaa = OLE2T(bbb);

VB は言語中で OLE 文字列(BSTR)の存在を隠蔽している.

VC++ で BSTR を扱うためには
・VC コンパイラ COM サポートの _bstr_t を活用する
・MFC CString の BSTR サポートを活用する
・BSTR 系 API を駆使して自分でがんばる
などの方法がある.


参照
BSTR変換
前後のTips
VC++から文字列を渡す方法

DSS ProgrammingTipsCGI Ver1.02