Привет!
Прикручиваю ком-обьект к дос-сессии.
Проблема в том, что тред, который работает с комом виснет на CoUninitialize.
Вот полный код треда:
unsigned __stdcall TDevicesManager::DeviceThread(void* arg)
{
TDevicesManager* pdm = static_cast<TDevicesManager*> (arg);
HRESULT res;
res = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if ( res == S_OK ) {
THiddenWindow dlg(pdm); <--- нужно для синхронизации внешних запросов и событий от обьекта, Create в конструкторе. pdm->m_pHiddenWindow = &dlg; pdm->BeforeStart();
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
pdm->BeforeStop(); pdm->CloseAllDevices();
CoUninitialize(); <----- Здесь в дос-сессии виснет.
} pdm->m_hEvent.Set();
return 0;
}
Создается всего 1 невизуальный обьект (.... CreateInstance(........ )). Он наверняка за собой тащит еще n-е кол-во обьектов.
Этот код нормально завершается в оконном приложении, но помещенный в dll, которая подгружается к ntvdm, виснет при окончании работы, виснет и дос-сессия.
Что делать, просто не понимаю. В COM, к сожалению, плохо разбираюсь. Буду благодарен за любые подсказки куда копать и каким инструментом.
Есть обходное решение — клиент-сервер, но его хочется применять в крайнем случае, а тут интерестно, почему все так.