102 lines
2.1 KiB
C++
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();
|
|
}
|