2025-04-27 07:49:33 -04:00

102 lines
2.1 KiB
C++

// Copyright (c) 1999-2001 Microsoft Corporation, All Rights Reserved
#include "precomp.h"
#include "ComInit.h"
HRESULT (STDAPICALLTYPE *g_pfnCoInitializeEx)(void*, DWORD);
static BOOL g_bInitialized = FALSE;
static HINSTANCE g_hOle32 = NULL;
BOOL InitComInit()
{
UINT uSize;
BOOL bRetCode = FALSE;
HANDLE hMut;
if(g_bInitialized) {
return TRUE;
}
do {
hMut = CreateMutex(NULL, TRUE, "COMINIT_INITIALING");
if(hMut == INVALID_HANDLE_VALUE) {
Sleep(50);
}
} while(hMut == INVALID_HANDLE_VALUE);
if(g_bInitialized) {
CloseHandle(hMut);
return TRUE;
}
LPTSTR pszSysDir = new char[ MAX_PATH+10 ];
if(pszSysDir == NULL)
return FALSE;
uSize = GetSystemDirectory(pszSysDir, MAX_PATH);
if(uSize > MAX_PATH) {
delete[] pszSysDir;
pszSysDir = new char[ uSize +10 ];
if(pszSysDir == NULL)
return FALSE;
uSize = GetSystemDirectory(pszSysDir, uSize);
}
lstrcat(pszSysDir, "\\ole32.dll");
g_hOle32 = LoadLibraryEx(pszSysDir, NULL, 0);
delete pszSysDir;
if(g_hOle32 != NULL)
{
bRetCode = TRUE;
(FARPROC&)g_pfnCoInitializeEx = GetProcAddress(g_hOle32, "CoInitializeEx");
if(!g_pfnCoInitializeEx) {
FreeLibrary(g_hOle32);
g_hOle32 = NULL;
bRetCode = FALSE;
}
}
g_bInitialized = TRUE;
CloseHandle(hMut);
return bRetCode;
}
BOOL IsDcomEnabled()
{
InitComInit();
if(g_hOle32) {
// DCOM has been detected.
// =======================
return TRUE;
} else {
// DCOM was not detected.
// ======================
return FALSE;
}
}
HRESULT InitializeCom()
{
if(IsDcomEnabled()) {
return g_pfnCoInitializeEx(0, COINIT_MULTITHREADED);
}
return CoInitialize(0);
}
void CloseStuff()
{
if(g_hOle32)
{
FreeLibrary(g_hOle32);
g_hOle32 = NULL;
g_bInitialized = FALSE;
}
}
void UninitializeCom()
{
CoUninitialize();
CloseStuff();
}