2

外部プログラムから呼び出される C++ DLL を作成しています。

1.) このプログラムから文字列の配列 (char *var として) を引数として取得します。

2.) この配列を繰り返し処理し、文字列配列の各要素に対して COM 関数を呼び出したい。COM 関数は BSTR を受け取る必要があります。

DLL_EXPORT(void) runUnitModel(char *rateMaterialTypeNames) {

    HRESULT hr = CoInitialize(NULL);

    // Create the interface pointer.
    IUnitModelPtr pIUnit(__uuidof(BlastFurnaceUnitModel));

    pIUnit->initialiseUnitModel();

    int i;
    for(i=0; i < sizeOfPortRatesArray; i++)
            pIUnit->createPort(SysAllocString(BSTR((const char *)rateMaterialTypeNames[i])));

問題を引き起こしているのは SysAllocString(BSTR((const char *)rateMaterialTypeNames[i])) ビットだと思います。プログラムの実行時にアクセス違反が発生します。

これは、i で rateMaterialTypeName の値にアクセスする正しい方法ですか? i の値として、単一の文字ではなく、「IronOre」のようなものを期待していることに注意してください。

4

3 に答える 3

5

MicrosoftのATLを使用している場合は、 CComBSTRクラスを使用できます。char *を受け入れ、そこからBSTRを作成します。また、CComBSTRのdtorで発生するBSTRの削除について心配する必要はありません。

また、Matthew Xaviersの回答を参照してください。文字列の配列を、その関数に正しく渡していないようです。

お役に立てれば

于 2009-02-25T16:52:01.097 に答える
4

C文字列を保持する変数は、最初の要素(char *)への単なるポインターであるため、C文字列の配列を渡すには、関数へのパラメーターをchar**にする必要があります。

DLL_EXPORT(void) runUnitModel(char **rateMaterialTypeNames)

このように、rateMaterialTypeNames [i]を評価すると、結果はchar *になります。これは、SysAllocString()に渡す必要のあるパラメータータイプです。

注を追加:Tommy Huiの回答が指摘しているように、ある時点で文字列をワイド文字に変換する必要もあります。

于 2009-02-25T16:38:32.643 に答える
3

関数rateMaterialTypeNamesのパラメーターが文字列の場合、

rateMaterialTypeNames [i]

は文字であり、文字列ではありません。パラメータ名自体のみを使用する必要があります。

さらに、キャストは一般的に悪いです。BSTRへの変換は大きなフラグです。SysAllocStringのパラメータタイプは次のとおりです。

const OLECHAR *

32ビットコンパイラの場合、これはワイド文字です。したがって、実際のパラメーターはchar *であるため、これは間違いなく失敗します。

コードに必要なのは、狭い文字列を広い文字列に変換することです。

const OLECHAR* pOleChar = A2COLE( *pChar );
BSTR str = SysAllocString( pOleChar );
// do something with the 'str'
SysFreeString( str ); // need to cleanup the allocated BSTR
于 2009-02-25T16:38:29.117 に答える