私は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 オブジェクトはすべての関数呼び出しでインスタンス化され、このバリアントは期待どおりに動作します (すべてのスレッドが独自のアパートメントとオブジェクトのインスタンスを持つようになりました)。
これはどうにかしてうまくできるでしょうか?