Changed: Only call CoUninitialize if CoInitialize(Ex) succeeded

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

View file

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

View file

@ -80,6 +80,26 @@ bool copyInstallerFiles(const QStringList &files, const QString &destination)
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[])
{
#if defined(_MSC_VER) && defined(_DEBUG)
@ -87,8 +107,7 @@ int main(int argc, char *argv[])
#endif
#ifdef Q_OS_WIN
// to fix the bug with QFileDialog::getExistingDirectory hanging under Windows
CoInitialize(NULL);
CCOMHelper comHelper;
#endif
NLMISC::CApplicationContext appContext;