|
|
/*****************************************************************/ /** Microsoft **/ /** Copyright (C) Microsoft Corp., 1991-1998 **/ /*****************************************************************/
//
// DLLENTRY.CPP -
//
// HISTORY:
//
// 05/14/98 donaldm created
//
#include "pre.h"
#include "registry.h"
#include "webvwids.h"
// We encapsulate the control of this COM server (eg, lock and object
// counting) in a server control C++ object. Here is it's pointer.
CServer* g_pServer = NULL;
const CLSID * aClassObjects[] = { &CLSID_ICWWEBVIEW, &CLSID_ICWWALKER, &CLSID_ICWGIFCONVERT, &CLSID_ICWISPDATA }; #define NUM_CLASS_OBJECTS sizeof(aClassObjects) / sizeof(aClassObjects[0])
#define MAX_ID_SIZE 100
const TCHAR acszFriendlyNames[][MAX_ID_SIZE] = { TEXT("CLSID_ICWWebView"), TEXT("CLSID_ICWWalker"), TEXT("CLSID_ICWGifConvert"), TEXT("CLSID_ICWISPData") };
const TCHAR acszIndProgIDs[][MAX_ID_SIZE] = { TEXT("ICWCONN.WebView"), TEXT("ICWCONN.Walker"), TEXT("ICWCONN.GifConvert"), TEXT("ICWCONN.ISPData") };
const TCHAR acszProgIDs[][MAX_ID_SIZE] = { TEXT("ICWCONN.WebView.1"), TEXT("ICWCONN.Walker.1"), TEXT("ICWCONN.GifConvert.1"), TEXT("ICWCONN.ISPData.1") };
// instance handle must be in per-instance data segment
HINSTANCE ghInstance=NULL; INT _convert; // For string conversion
const VARIANT c_vaEmpty = {0};
void RegWebOCClass();
typedef UINT RETERR;
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
BOOL _stdcall DllEntryPoint(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpReserved);
#ifdef __cplusplus
} #endif // __cplusplus
/*******************************************************************
NAME: DllEntryPoint
SYNOPSIS: Entry point for DLL.
NOTES: Initializes thunk layer to WIZ16.DLL
********************************************************************/ BOOL _stdcall DllEntryPoint(HINSTANCE hInstDll, DWORD fdwReason, LPVOID lpReserved) { BOOL bRet = TRUE; if(fdwReason == DLL_PROCESS_ATTACH) { bRet = FALSE; // Instantiate the CServer utility class.
g_pServer = new CServer; if (NULL != g_pServer) { // Remember the DLL Instance handle.
g_pServer->m_hDllInst = hInstDll; ghInstance = hInstDll; // Register the window class that will be used to embed web browser object into dialogs
RegWebOCClass(); bRet = TRUE; } } if (fdwReason == DLL_PROCESS_DETACH) { if(g_pServer) { // We return S_OK of there are no longer any living objects AND
// there are no outstanding client locks on this server.
HRESULT hr = (0L==g_pServer->m_cObjects && 0L==g_pServer->m_cLocks) ? S_OK : S_FALSE;
if(hr == S_OK) DELETE_POINTER(g_pServer); } } return bRet; }
#ifdef __cplusplus
extern "C" { #endif // __cplusplus
void __cdecl main() {};
#ifdef __cplusplus
} #endif // __cplusplus
///////////////////////////////////////////////////////////
//
// Exported functions
//
// These are the functions that COM expects to find
//
//
// Can DLL unload now?
//
STDAPI DllCanUnloadNow() { HRESULT hr = S_OK;
if(g_pServer) { // We return S_OK of there are no longer any living objects AND
// there are no outstanding client locks on this server.
hr = (0L==g_pServer->m_cObjects && 0L==g_pServer->m_cLocks) ? S_OK : S_FALSE;
if(hr == S_OK) DELETE_POINTER(g_pServer); } return hr; }
//
// Get class factory
//
STDAPI DllGetClassObject ( const CLSID& rclsid, const IID& riid, void** ppv ) { TraceMsg(TF_CLASSFACTORY, "DllGetClassObject:\tCreate class factory.") ;
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE; IUnknown* pCob = NULL;
hr = E_OUTOFMEMORY; pCob = new ClassFactory(g_pServer, &rclsid); if (NULL != pCob) { g_pServer->ObjectsUp(); hr = pCob->QueryInterface(riid, ppv); if (FAILED(hr)) { g_pServer->ObjectsDown(); DELETE_POINTER(pCob); } }
return hr; }
// The following two exported functions are what regsvr32 uses to
// self-register and unregister the dll. See REGISTRY.CPP for
// actual implementation
//
// Server registration
//
STDAPI DllRegisterServer() { BOOL bRet = TRUE; for (int i = 0; i < NUM_CLASS_OBJECTS; i++) { bRet = RegisterServer(ghInstance, *aClassObjects[i], (LPTSTR)acszFriendlyNames[i], (LPTSTR)acszIndProgIDs[i], (LPTSTR)acszProgIDs[i]); } return (bRet ? S_OK : E_FAIL); }
//
// Server unregistration
//
STDAPI DllUnregisterServer() { BOOL bRet = TRUE;
for (int i = 0; i < NUM_CLASS_OBJECTS; i++) { bRet = UnregisterServer(*aClassObjects[i], (LPTSTR)acszIndProgIDs[i], (LPTSTR)acszProgIDs[i]); } return (bRet ? S_OK : E_FAIL); }
//
|