STA EXE に実装された COM オブジェクトがあります ( を呼び出します)。これを実装CoInitialize(NULL)
するものと呼びましょう。擬似コードは次のようになります。CMyObject
IControl
IControl
{
Start();
Stop();
};
CMyClass : IControl
{
public:
Start()
{
//create an ISomething in the main thread
mSomething = CoCreate(ISomething);
//this thread will make a call through ISomething
mThread = std::thread(ThreadMain, this);
}
Stop()
{
kill(mThread);
mSomething->Release();
}
UseSomething() //called from another thread
{
mSomething->DoStuff();
}
private:
std::thread mThread;
ISomething *mSomething;
};
void ThreadMain(CMyClass *o)
{
for(;;)
{
if(<some condition>)
o->UseSomething();
}
}
私のテスト コードは基本的にこのパターンに従い、(今のところ) 問題なく動作しますが、STA で MSDN を読むと、次のようにする必要があることが示唆されます。
- コール
CoInitialize
/CoUninitialze
インThreadMain
- マーシャリングを使用してワーカー スレッドからインターフェイスを呼び出す
この質問 ( How to access COM objects from different apartment models? ) も、マーシャリングが必要であることを示唆しており、GIT の使用を提唱しています。
ただし、アパートメント モデルは COM の一部であり、実際に理解したことはありません。これが自分の状況で必要であることを確認したかったのです。特に、現在エラーが発生することなく正常に動作しているため、コードを追加したくありません」それが必要な場合に備えて、私にはわかりません」.
違いがある場合、問題の COMISomething
オブジェクトは、メイン スレッドではなく、ワーカー スレッドによってのみ呼び出されます。私の特定のケースでは、CMyObject
常に1つだけが存在します。