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:
parent
ac54a2ed45
commit
5a87d814cf
|
@ -235,21 +235,10 @@ static char *query_wmi (QueryWmiType type)
|
|||
int i;
|
||||
gboolean atleast_one_appended = FALSE;
|
||||
|
||||
hr = CoInitializeEx (0, COINIT_APARTMENTTHREADED);
|
||||
if (FAILED (hr))
|
||||
{
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* If this is called after some other call to CoCreateInstance somewhere else in the process, this will fail with RPC_E_TOO_LATE.
|
||||
* However if not, it *is* required to be called, so call it here but ignore any error returned.
|
||||
*/
|
||||
CoInitializeSecurity (NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
|
||||
|
||||
hr = CoCreateInstance (&CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, &IID_IWbemLocator, (LPVOID *) &locator);
|
||||
if (FAILED (hr))
|
||||
{
|
||||
goto couninitialize;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
namespaceName = SysAllocString (L"root\\CIMV2");
|
||||
|
@ -369,9 +358,6 @@ release_locator:
|
|||
locator->lpVtbl->Release (locator);
|
||||
SysFreeString (namespaceName);
|
||||
|
||||
couninitialize:
|
||||
CoUninitialize ();
|
||||
|
||||
exit:
|
||||
if (result == NULL)
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue