1

私は1つのソフトウェアのプラグインを書いています。このソフトウェアが呼び出す

 void Init() {...}

ロード時にマルチスレッド機能を備えています。プログラムは複数のスレッドを実行でき、プラグインから同時にカスタム関数を呼び出すことができます。

私のプラグインでは、次の方法で初期化する COM オブジェクトを使用しています。

void Init() { // "Global" initializaton
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    position.CreateInstance(__uuidof(Position));
    order.CreateInstance(__uuidof(Order));
}

次に、プラグインベースの関数を実装します (例):

int SendOrder(....) {
    return order.SendOrder(...); // invoke COM object's method
}

問題は、このバリアントが期待どおりに機能しないことです。そのため、COM オブジェクトのインスタンス化を関数の本体に直接移動しました。

int SendOrder(....) {
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    order.CreateInstance(__uuidof(Order));

    int ret = order.SendOrder(...);

    CoUnitialize();

    return ret;
}

これで、COM オブジェクトはすべての関数呼び出しでインスタンス化され、このバリアントは期待どおりに動作します (すべてのスレッドが独自のアパートメントとオブジェクトのインスタンスを持つようになりました)。

これはどうにかしてうまくできるでしょうか?

4

1 に答える 1