|
|
#include "common.h"
HINSTANCE g_hGlobalDllInstance = NULL; PHANDLEMAP g_pGlobalHandleMap = NULL; LPCWSTR g_wszAdvPackDll = L"advpack.dll"; LPCSTR g_szInstallSection = "install"; LPCSTR g_szUninstallSection = "uninstall";
HRESULT RegisterServer(BOOL fMode); HRESULT RegisterTypeLibrary(BOOL fMode);
//-----------------------------------------------------------------------------
// DLL Entry Point
//-----------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID pvReserved) { BOOL bRet = TRUE;
DEBUG_TRACE( DLL, ("dllmain: %s", MapDllReasonToString(dwReason)) );
switch( dwReason ) { case DLL_PROCESS_ATTACH : { DEBUG_INITIALIZE(); g_hGlobalDllInstance = hInstance; g_pGlobalHandleMap = new HANDLEMAP;
if( g_pGlobalHandleMap ) { g_pGlobalHandleMap->SetClearFunction(ScriptCallbackKiller); } else { bRet = FALSE; } } break;
case DLL_PROCESS_DETACH: { SAFEDELETE(g_pGlobalHandleMap); _GetRootKey(FALSE); DEBUG_TERMINATE(); } break;
case DLL_THREAD_DETACH: break;
case DLL_THREAD_ATTACH: break; } return bRet; }
//-----------------------------------------------------------------------------
// COM Entry Points
//-----------------------------------------------------------------------------
STDAPI DllRegisterServer(void) { return RegisterServer(TRUE); }
STDAPI DllUnregisterServer(void) { return RegisterServer(FALSE); }
STDAPI DllGetClassObject(REFIID clsid, REFIID riid, void** ppv) { return CLSFACTORY::Create(clsid, riid, ppv); }
//-----------------------------------------------------------------------------
// SelfRegistration helper routines
//-----------------------------------------------------------------------------
HRESULT RegisterServer(BOOL fMode) { DEBUG_ENTER(( DBG_DLL, rt_hresult, "RegisterServer", "fMode=%s", fMode ? g_szInstallSection : g_szUninstallSection ));
HRESULT hr = S_OK; HINSTANCE advpack = NULL; REGINSTALL pfnri = NULL;
advpack = LoadLibrary(g_wszAdvPackDll);
if( !advpack ) { DEBUG_TRACE( DLL, ("couldn't load advpack.dll: %s", MapErrorToString(GetLastError())) );
hr = E_FAIL; goto quit; }
pfnri = (REGINSTALL) GetProcAddress(advpack, achREGINSTALL);
if( !pfnri ) { DEBUG_TRACE( DLL, ("couldn't get RegInstall pointer: %s", MapErrorToString(GetLastError())) );
hr = E_FAIL; goto quit; }
hr = pfnri( g_hGlobalDllInstance, fMode ? g_szInstallSection : g_szUninstallSection, NULL );
FreeLibrary(advpack);
hr = RegisterTypeLibrary(fMode);
quit:
DEBUG_LEAVE(hr); return hr; }
HRESULT RegisterTypeLibrary(BOOL fMode) { DEBUG_ENTER(( DBG_FACTORY, rt_hresult, "RegisterTypeLibrary", "fMode=%s", fMode ? g_szInstallSection : g_szUninstallSection ));
ITypeLib* ptl = NULL; TLIBATTR* pta = NULL; WCHAR* pbuf = NULL; HRESULT hr = S_OK;
if( (pbuf = new WCHAR[MAX_PATH]) ) { GetModuleFileName(g_hGlobalDllInstance, pbuf, MAX_PATH); } else { hr = E_OUTOFMEMORY; goto quit; }
hr = LoadTypeLib(pbuf, &ptl);
if( SUCCEEDED(hr) ) { if( fMode ) { hr = RegisterTypeLib(ptl, pbuf, NULL); } else { hr = ptl->GetLibAttr(&pta);
if( SUCCEEDED(hr) ) { hr = UnRegisterTypeLib( pta->guid, pta->wMajorVerNum, pta->wMinorVerNum, pta->lcid, pta->syskind );
ptl->ReleaseTLibAttr(pta); } else { goto quit; } } ptl->Release(); }
quit:
SAFEDELETEBUF(pbuf);
DEBUG_LEAVE(hr); return hr; }
|