У меня есть COM-объект, реализованный в STA EXE (звонки 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();
}
}
Мой тестовый код в основном следует этому шаблону и работает без проблем (пока) но чтение MSDN на STA предполагает, что мне нужно:
CoInitialize
/CoUninitialze
в ThreadMain
Этот вопрос (Как получить доступ к COM-объектам из разных моделей квартир?) также предполагает, что необходима сортировка и выступает за использование GIT.
Однако модели квартир — это одна из частей COM, которую мне никогда не удавалось, и я хотел это проверить. является необходимо в моей ситуации — особенно потому, что в настоящее время он работает нормально, без ошибок — я не хочу добавлять код просто «на случай, если он нужен, я не могу сказать».
Если это имеет какое-либо значение, COM ISomething
рассматриваемый объект только вызывается рабочим потоком, а не основным потоком. В моем конкретном случае только один CMyObject
будет существовать в любое время.
Задача ещё не решена.
Других решений пока нет …