CoUninitialize & ntvdm.exe
От: vvmyx  
Дата: 14.02.08 15:45
Оценка:
Привет!
Прикручиваю ком-обьект к дос-сессии.
Проблема в том, что тред, который работает с комом виснет на 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, к сожалению, плохо разбираюсь. Буду благодарен за любые подсказки куда копать и каким инструментом.
Есть обходное решение — клиент-сервер, но его хочется применять в крайнем случае, а тут интерестно, почему все так.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.