|
|
/******************************************************************************
Copyright (c) 2000 Microsoft Corporation
Module Name: FrmMars.cpp
Abstract: This file contains the implementation of the CSRFrameMars class, which implements SR UI using MARS / IE.
Revision History: Seong Kook Khang (SKKhang) 04/04/2000 created
******************************************************************************/
#include "stdwin.h"
#include "stdatl.h"
#include <MarsHost.h>
#include "resource.h"
#include "rstrpriv.h"
#include <initguid.h>
#include "srui_htm.h"
#include "rstrmgr.h"
#include "rstrprog.h"
#include "rstrshl.h"
#include "FrmBase.h"
#include "srui_htm_i.c"
/////////////////////////////////////////////////////////////////////////////
//
// ATL Module for UI Frame
//
/////////////////////////////////////////////////////////////////////////////
CComModule _Module;
BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_RstrProgress, CRstrProgress) //OBJECT_ENTRY(CLSID_RstrEdit, CRstrEdit)
OBJECT_ENTRY(CLSID_RestoreShellExternal, CRestoreShell) END_OBJECT_MAP()
/////////////////////////////////////////////////////////////////////////////
//
// CSRFrameMars
//
/////////////////////////////////////////////////////////////////////////////
class CSRFrameMars : public ISRFrameBase { public: CSRFrameMars(); ~CSRFrameMars();
// ISRUI_Base methods
public: DWORD RegisterServer(); DWORD UnregisterServer(); BOOL InitInstance( HINSTANCE hInst ); BOOL ExitInstance(); void Release(); int RunUI( LPCWSTR szTitle, int nStart );
// Operations
protected: BOOL CleanUp(); DWORD InvokeMARS( LPCWSTR szTitle );
// Attributes
protected: HWND m_hWnd; };
/////////////////////////////////////////////////////////////////////////////
// CSRFrameMars create instance
BOOL CreateSRFrameInstance( ISRFrameBase **pUI ) { TraceFunctEnter("CreateSRFrameInstance"); BOOL fRet = TRUE; LPCWSTR cszErr;
*pUI = new CSRFrameMars; if ( *pUI == NULL ) { cszErr = ::GetSysErrStr(); ErrorTrace(TRACE_ID, "Creating SRUI Instance failed - %s", cszErr); fRet = FALSE; goto Exit; }
Exit: TraceFunctLeave(); return( fRet ); }
/////////////////////////////////////////////////////////////////////////////
// CSRFrameMars construction/destruction
CSRFrameMars::CSRFrameMars() { m_hWnd = NULL; }
CSRFrameMars::~CSRFrameMars() { }
/////////////////////////////////////////////////////////////////////////////
// CSRFrameMars - ISRFrameBase methods
DWORD CSRFrameMars::RegisterServer() { TraceFunctEnter("CSRFrameMars::RegisterServer"); DWORD dwRet = 0; HRESULT hr;
hr = _Module.UpdateRegistryFromResource(IDR_RSTRUI, TRUE); if ( FAILED(hr) ) { ErrorTrace(TRACE_ID, "CComModule::UpdateRegistryFromResource failed, err=%l", hr); dwRet = hr; goto Exit; } hr = _Module.RegisterServer(TRUE); if ( FAILED(hr) ) { ErrorTrace(TRACE_ID, "CComModule::RegisterServer failed, err=%l", hr); dwRet = hr; goto Exit; }
Exit: TraceFunctLeave(); return( dwRet ); }
DWORD CSRFrameMars::UnregisterServer() { TraceFunctEnter("CSRFrameMars::UnregisterServer"); DWORD dwRet = 0; HRESULT hr;
hr = _Module.UpdateRegistryFromResource(IDR_RSTRUI, FALSE); if ( FAILED(hr) ) { ErrorTrace(TRACE_ID, "CComModule::UpdateRegistryFromResource failed, err=%l", hr); dwRet = hr; goto Exit; } hr = _Module.UnregisterServer(TRUE); if ( FAILED(hr) ) { ErrorTrace(TRACE_ID, "CComModule::UnregisterServer failed, err=%l", hr); dwRet = hr; goto Exit; }
Exit: TraceFunctLeave(); return( dwRet ); }
BOOL CSRFrameMars::InitInstance( HINSTANCE hInst ) { TraceFunctEnter("CSRFrameMars::InitInstance"); BOOL fRet = TRUE; HRESULT hr;
//BUGBUG - Is this necessary???
g_hInst = hInst;
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); #else
// we're using apartment threading model
hr = ::CoInitialize(NULL); #endif
if (FAILED(hr)) { FatalTrace(TRACE_ID, "Cannot initialize COM, hr=%l", hr); fRet = FALSE; goto Exit; }
_Module.Init(ObjectMap, hInst, &LIBID_RestoreUILib);
Exit: TraceFunctLeave(); return( fRet ); }
BOOL CSRFrameMars::ExitInstance() { TraceFunctEnter("CSRFrameMars::ExitInstance");
_Module.Term(); ::CoUninitialize();
TraceFunctLeave(); return( TRUE ); }
void CSRFrameMars::Release() { TraceFunctEnter("CSRFrameMars::Release");
// clean up...
delete this;
TraceFunctLeave(); }
int CSRFrameMars::RunUI( LPCWSTR szTitle, int nStart ) { TraceFunctEnter("CSRFrameMars::RunUI"); int nRet = 0; HRESULT hr; RECT rc = { 0, 0, 0, 0 };
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED); _ASSERTE(SUCCEEDED(hRes)); hr = CoResumeClassObjects(); #else
// we're using apartment threading model
hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE); #endif
_ASSERTE(SUCCEEDED(hr));
if ( !g_pRstrMgr->SetStartMode( nStart ) ) { nRet = E_FAIL; goto Exit; }
//if ( g_cRestoreShell.Create( NULL, rc ) == NULL )
//{
// nRet = E_FAIL;
// goto Exit;
//}
nRet = InvokeMARS( szTitle ); if ( nRet != 0 ) goto Exit;
_Module.RevokeClassObjects();
Exit: TraceFunctLeave(); return( nRet ); }
/////////////////////////////////////////////////////////////////////////////
// CSRFrameMars operations - internal
BOOL CSRFrameMars::CleanUp() { return( TRUE ); }
DWORD CSRFrameMars::InvokeMARS( LPCWSTR szTitle ) { TraceFunctEnter("CSRFrameMars::InvokeMARS"); DWORD dwRet = 0; LPCWSTR cszErr; WCHAR szMarsPath[MAX_PATH+1]; WCHAR szSRPath[MAX_PATH+1]; HMODULE hMars; PFNMARSTHREADPROC pfnMarsThreadProc; MARSTHREADPARAM sMTP; WCHAR szMainWndTitle[MAX_PATH+1]; CComBSTR bstrTitle, bstrSRPath; CSRMarsHost_Object *pMH = NULL; HRESULT hr;
::GetWindowsDirectory( szMarsPath, MAX_PATH ); ::lstrcat( szMarsPath, L"\\pchealth\\helpctr\\binaries\\pchshell.dll" ); hMars = ::LoadLibrary( szMarsPath );
if ( hMars == NULL ) { #ifdef DEBUG
MessageBox( NULL, szMarsPath, L"LoadLibrary failed", MB_OK ); #endif
dwRet = ::GetLastError(); cszErr = ::GetSysErrStr( dwRet ); ErrorTrace(TRACE_ID, "::LoadLibrary('marscore.dll') failed - %s", cszErr); goto Exit; }
pfnMarsThreadProc = (PFNMARSTHREADPROC)::GetProcAddress( hMars, (LPCSTR)MAKEINTRESOURCE(ORD_MARSTHREADPROC) ); if ( pfnMarsThreadProc == NULL ) { #ifdef DEBUG
MessageBox( NULL, L"Unknown", L"GetProcAddress failed", MB_OK ); #endif
dwRet = ::GetLastError(); cszErr = ::GetSysErrStr( dwRet ); ErrorTrace(TRACE_ID, "::GetProcAddress failed - %s", cszErr); goto Exit; }
bstrTitle = szTitle; ::GetModuleFileName( NULL, szSRPath, MAX_PATH ); ::PathRemoveFileSpec( szSRPath ); ::PathAppend( szSRPath, L"srframe.mmf" ); bstrSRPath = szSRPath;
::ZeroMemory( &sMTP, sizeof(sMTP) ); sMTP.cbSize = sizeof(sMTP); sMTP.hIcon = NULL; sMTP.nCmdShow = SW_HIDE; sMTP.dwFlags = MTF_MANAGE_WINDOW_SIZE; sMTP.pwszTitle = bstrTitle; sMTP.pwszPanelURL = bstrSRPath;
// Create an UI Instance.
hr = CSRMarsHost_Object::CreateInstance( &pMH ); if ( FAILED(hr) ) { #ifdef DEBUG
MessageBox( NULL, szMarsPath, L"CreateInstance of MarsHost failed", MB_OK ); #endif
dwRet = hr; ErrorTrace(TRACE_ID, "CHCPMarsHost_Object::CreateInstance failed, hr=%u", hr); goto Exit; }
//
// Add a reference count
//
pMH->AddRef();
dwRet = pfnMarsThreadProc( pMH, &sMTP );
if ( pMH ) pMH->Release();
if ( hMars ) ::FreeLibrary( hMars );
Exit: TraceFunctLeave(); return( dwRet ); }
// end of file
|