0

STA EXE に実装された COM オブジェクトがあります ( を呼び出します)。これを実装CoInitialize(NULL)するものと呼びましょう。擬似コードは次のようになります。CMyObjectIControl

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つだけが存在します。

4

0 に答える 0