Call CoInitialize, CoInitializeSecurity and CoUninitialize from the main process, not from a DLL.

They're process-level functions and aren't meant to be called from DLLs. CoInitSecurity in particular fails with RPC_E_TOO_LATE even if no other call to CoCreateInstance has been made yet.

Fixes sysinfo's WMI calls on Windows 8.1 and above.
This commit is contained in:
Arnavion
2015-02-10 22:14:22 -08:00
parent ac54a2ed45
commit 5a87d814cf
2 changed files with 20 additions and 15 deletions

View File

@@ -996,6 +996,10 @@ main (int argc, char *argv[])
int i;
int ret;
#ifdef WIN32
HRESULT coinit_result;
#endif
srand ((unsigned int) time (NULL)); /* CL: do this only once! */
/* We must check for the config dir parameter, otherwise load_config() will behave incorrectly.
@@ -1058,6 +1062,14 @@ main (int argc, char *argv[])
libproxy_factory = px_proxy_factory_new();
#endif
#ifdef WIN32
coinit_result = CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);
if (SUCCEEDED (coinit_result))
{
CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
}
#endif
fe_init ();
/* This is done here because cfgfiles.c is too early in
@@ -1085,6 +1097,13 @@ main (int argc, char *argv[])
fe_main ();
#ifdef WIN32
if (SUCCEEDED (coinit_result))
{
CoUninitialize ();
}
#endif
#ifdef USE_LIBPROXY
px_proxy_factory_free(libproxy_factory);
#endif