CoInitialize и CoUninitialize
От: INsideR Латвия  
Дата: 28.06.03 09:32
Оценка:
Как я понял, перед началом работы, каждый поток работающий с COM должен вызывать CoInitialize, а при завершении CoUnitialize, но если у меня есть DLL, в которой две функции Init и ThreadProc, то родительский поток со своим CoInitialize вызывает Init(), и поток инициализирует SQL соединение, но потом родительский поток пораждает ещё один поток, ThreadProc из этой же DLL, который пользуется SQL, правильно ли так делать:

void ThreadProc()
{
  CoInitialize();
  ...
  что-то делаем 
  ...
  CoUnitialize();
}
Мудр тот, кто знает не многое, а нужное
Re: CoInitialize и CoUninitialize
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 28.06.03 10:03
Оценка:
Здравствуйте, INsideR, Вы писали:

[]

Вообще говоря, да. Главное не допустить использование СОМ после вызова CoUninitialize. Очень часто эта проблема возникает при вызове деструкторов локальных объектов, так как область видимости в которой они живут не полностью входит в область действия CoInit/CoUninit. Короче говоря, нужно писать так:
void ThreadProc()
{
   CoInit();
   {
      //do some work
   }
   CoUninit();
}
Re: CoInitialize и CoUninitialize
От: Admiral Украина  
Дата: 28.06.03 10:04
Оценка:
Почитай это обсуждение — http://www.rsdn.ru/forum/?mid=89803
Автор:
Дата: 25.08.02
, очень интересно.
Posted via RSDN NNTP Server 1.6 RC1
Re[2]: CoInitialize и CoUninitialize
От: MaximE Великобритания  
Дата: 29.06.03 14:34
Оценка:
Здравствуйте, Alexey Shirshov, Вы писали:

[]

Более безопасно в плане исключений:

struct initialize_com
{
    initialize_com(DWORD dwCoInit = COINIT_MULTITHREADED)
    {
        if (!SUCCEEDED(::CoInitializeEx(0, dwCoInit)))
            throw std::runtime_error("CoInitializeEx() failed.");
    }

    ~initialize_com()
    {
        ::CoUninitialize();
    }
};


void thread_fun
{
    initialize_com com__;
    {
        // some code
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.