Changed: Only call CoUninitialize if CoInitialize(Ex) succeeded

This commit is contained in:
kervala 2016-09-16 19:24:43 +02:00
parent cfaceffe9e
commit 97634f2157
2 changed files with 38 additions and 5 deletions

View file

@ -76,12 +76,21 @@ namespace NLMISC {
nlWindow CSystemUtils::s_window = EmptyWindow; nlWindow CSystemUtils::s_window = EmptyWindow;
#ifdef NL_OS_WINDOWS
static bool s_mustUninit = false;
#endif
bool CSystemUtils::init() bool CSystemUtils::init()
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
// initialize COM // initialize COM
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (!s_mustUninit)
if (FAILED(hr)) return false; {
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr)) return false;
s_mustUninit = true;
}
#endif #endif
return true; return true;
@ -91,7 +100,12 @@ bool CSystemUtils::uninit()
{ {
#ifdef NL_OS_WINDOWS #ifdef NL_OS_WINDOWS
// uninitialize COM // uninitialize COM
CoUninitialize(); if (s_mustUninit)
{
CoUninitialize();
s_mustUninit = false;
}
#endif #endif
return true; return true;

View file

@ -80,6 +80,26 @@ bool copyInstallerFiles(const QStringList &files, const QString &destination)
return true; return true;
} }
#ifdef Q_OS_WIN
class CCOMHelper
{
bool m_mustUninit;
public:
CCOMHelper()
{
// to fix the bug with QFileDialog::getExistingDirectory hanging under Windows
m_mustUninit = SUCCEEDED(CoInitialize(NULL));
}
~CCOMHelper()
{
// only call CoUninitialize if CoInitialize succeeded
if (m_mustUninit) CoUninitialize();
}
};
#endif
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
#if defined(_MSC_VER) && defined(_DEBUG) #if defined(_MSC_VER) && defined(_DEBUG)
@ -87,8 +107,7 @@ int main(int argc, char *argv[])
#endif #endif
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
// to fix the bug with QFileDialog::getExistingDirectory hanging under Windows CCOMHelper comHelper;
CoInitialize(NULL);
#endif #endif
NLMISC::CApplicationContext appContext; NLMISC::CApplicationContext appContext;