Как я понял, перед началом работы, каждый поток работающий с COM должен вызывать CoInitialize, а при завершении CoUnitialize, но если у меня есть DLL, в которой две функции Init и ThreadProc, то родительский поток со своим CoInitialize вызывает Init(), и поток инициализирует SQL соединение, но потом родительский поток пораждает ещё один поток, ThreadProc из этой же DLL, который пользуется SQL, правильно ли так делать:
void ThreadProc()
{
CoInitialize();
...
что-то делаем
...
CoUnitialize();
}
Здравствуйте, INsideR, Вы писали:
[]
Вообще говоря, да. Главное не допустить использование СОМ после вызова CoUninitialize. Очень часто эта проблема возникает при вызове деструкторов локальных объектов, так как область видимости в которой они живут не полностью входит в область действия CoInit/CoUninit. Короче говоря, нужно писать так:
void ThreadProc()
{
CoInit();
{
//do some work
}
CoUninit();
}
Почитай это обсуждение —
http://www.rsdn.ru/forum/?mid=89803Автор:
Дата: 25.08.02
, очень интересно.
Posted via RSDN NNTP Server 1.6 RC1
Здравствуйте, 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
}
}