/****************************************************** ICWEXT.CPP Contains definitions for global variables and functions used for including wizard pages from ICWCONN.DLL * Microsoft Confidential * Copyright (c) Microsoft Corporation 1992-1996 * All rights reserved 5/14/98 donaldm created ******************************************************/ #include "pre.h" #include "initguid.h" // Make DEFINE_GUID declare an instance of each GUID #include "icwacct.h" #include "icwconn.h" #include "webvwids.h" // GUIDS for the ICW WEBVIEW class #include "icwextsn.h" #include "icwcfg.h" extern BOOL g_bManualPath; extern BOOL g_bLanPath; IICW50Apprentice *gpICWCONNApprentice = NULL; // ICWCONN apprentice object IICWApprenticeEx *gpINETCFGApprentice = NULL; // ICWCONN apprentice object //+---------------------------------------------------------------------------- // // Function LoadICWCONNUI // // Synopsis Loads in the ICWCONN's apprentice pages // // If the UI has previously been loaded, the function will simply // update the Next and Back pages for the apprentice. // // Uses global variable g_fICWCONNUILoaded. // // // Arguments hWizHWND -- HWND of main property sheet // uPrevDlgID -- Dialog ID apprentice should go to when user leaves // apprentice by clicking Back // uNextDlgID -- Dialog ID apprentice should go to when user leaves // apprentice by clicking Next // dwFlags -- Flags variable that should be passed to // IICWApprentice::AddWizardPages // // // Returns TRUE if all went well // FALSE otherwise // // History 5/13/98 donaldm adapted from INETCFG code // //----------------------------------------------------------------------------- BOOL LoadICWCONNUI( HWND hWizHWND, UINT uPrevDlgID, UINT uNextDlgID, DWORD dwFlags ) { HRESULT hResult = E_NOTIMPL; if( g_fICWCONNUILoaded ) { ASSERT( g_pCICWExtension ); ASSERT( gpICWCONNApprentice ); TraceMsg(TF_ICWEXTSN, TEXT("LoadICWCONNUI: UI already loaded, just reset first (%d) and last (%d) pages"), uPrevDlgID, uNextDlgID); // Set the State data for the external pages hResult = gpICWCONNApprentice->SetStateDataFromExeToDll( &gpWizardState->cmnStateData); hResult = gpICWCONNApprentice->ProcessCustomFlags(dwFlags); hResult = gpICWCONNApprentice->SetPrevNextPage( uPrevDlgID, uNextDlgID ); goto LoadICWCONNUIExit; } if( !hWizHWND ) { TraceMsg(TF_ICWEXTSN, TEXT("LoadICWCONNUI got a NULL hWizHWND!")); return FALSE; } // Demand load the ICWCONN apprentice DLL, so we can dynamically update it if (!gpICWCONNApprentice) { HRESULT hr; // Load the ICWCONN OLE in-proc server hr = CoCreateInstance(CLSID_ApprenticeICWCONN,NULL,CLSCTX_INPROC_SERVER, IID_IICW50Apprentice,(LPVOID *)&gpICWCONNApprentice); if ( (!SUCCEEDED(hr) || !gpICWCONNApprentice) ) { g_fICWCONNUILoaded = FALSE; TraceMsg(TF_ICWEXTSN, TEXT("Unable to CoCreateInstance on IID_IICW50Apprentice! hr = %x"), hr); return FALSE; } } ASSERT(gpICWCONNApprentice); if( NULL == g_pCICWExtension ) { TraceMsg(TF_ICWEXTSN, TEXT("Instantiating ICWExtension and using it to initialize ICWCONN's IICW50Apprentice")); g_pCICWExtension = new( CICWExtension ); g_pCICWExtension->AddRef(); g_pCICWExtension->m_hWizardHWND = hWizHWND; gpICWCONNApprentice->Initialize( g_pCICWExtension ); // Initialize the DLL's state data before adding the pages. gpICWCONNApprentice->SetStateDataFromExeToDll( &gpWizardState->cmnStateData); } // Add the DLL's wizard pages hResult = gpICWCONNApprentice->AddWizardPages(dwFlags); if( !SUCCEEDED(hResult) ) { goto LoadICWCONNUIExit; } hResult = gpICWCONNApprentice->SetPrevNextPage( uPrevDlgID, uNextDlgID ); LoadICWCONNUIExit: if( SUCCEEDED(hResult) ) { g_fICWCONNUILoaded = TRUE; return TRUE; } else { TraceMsg(TF_ICWEXTSN, TEXT("LoadICWCONNUI failed with (hex) hresult %x"), hResult); return FALSE; } } //+---------------------------------------------------------------------------- // // Function LoadInetCfgUI // // Synopsis Loads in the InetCfg's apprentice pages // // If the UI has previously been loaded, the function will simply // update the Next and Back pages for the apprentice. // // Uses global variable g_fICWCONNUILoaded. // // // Arguments hWizHWND -- HWND of main property sheet // uPrevDlgID -- Dialog ID apprentice should go to when user leaves // apprentice by clicking Back // uNextDlgID -- Dialog ID apprentice should go to when user leaves // apprentice by clicking Next // dwFlags -- Flags variable that should be passed to // IICWApprentice::AddWizardPages // // // Returns TRUE if all went well // FALSE otherwise // // History 5/13/98 donaldm adapted from INETCFG code // 10/5/00 seanch No longer want to see the Mail & News stuff // //----------------------------------------------------------------------------- BOOL LoadInetCfgUI( HWND hWizHWND, UINT uPrevDlgID, UINT uNextDlgID, DWORD dwFlags ) { HRESULT hResult = E_NOTIMPL; dwFlags |= (WIZ_USE_WIZARD97 | WIZ_NO_MAIL_ACCT | WIZ_NO_NEWS_ACCT); if( g_fINETCFGLoaded ) { ASSERT( g_pCINETCFGExtension ); ASSERT( gpINETCFGApprentice ); TraceMsg(TF_ICWEXTSN, TEXT("LoadICWCONNUI: UI already loaded, just reset first (%d) and last (%d) pages"), uPrevDlgID, uNextDlgID); hResult = gpINETCFGApprentice->ProcessCustomFlags(dwFlags); //need to watch the retrun here since user may cancel out of installing files //and we don't want to hide the failure if the do. if( !SUCCEEDED(hResult) ) goto LoadInetCfgUIExit; hResult = gpINETCFGApprentice->SetPrevNextPage( uPrevDlgID, uNextDlgID ); goto LoadInetCfgUIExit; } if( !hWizHWND ) { TraceMsg(TF_ICWEXTSN, TEXT("LoadICWCONNUI got a NULL hWizHWND!")); return FALSE; } // Demand load the ICWCONN apprentice DLL, so we can dynamically update it if (!gpINETCFGApprentice) { HRESULT hr; // Load the ICWCONN OLE in-proc server hr = CoCreateInstance(/*CLSID_ApprenticeAcctMgr*/ CLSID_ApprenticeICW,NULL,CLSCTX_INPROC_SERVER, IID_IICWApprenticeEx,(LPVOID *)&gpINETCFGApprentice); if ( (!SUCCEEDED(hr) || !gpINETCFGApprentice) ) { g_fICWCONNUILoaded = FALSE; TraceMsg(TF_ICWEXTSN, TEXT("Unable to CoCreateInstance on IID_IICW50Apprentice! hr = %x"), hr); return FALSE; } } ASSERT(gpINETCFGApprentice); if( NULL == g_pCINETCFGExtension ) { TraceMsg(TF_ICWEXTSN, TEXT("Instantiating ICWExtension and using it to initialize ICWCONN's IICW50Apprentice")); g_pCINETCFGExtension = new( CICWExtension ); g_pCINETCFGExtension->AddRef(); g_pCINETCFGExtension->m_hWizardHWND = GetParent(hWizHWND); gpINETCFGApprentice->SetDlgHwnd(hWizHWND); gpINETCFGApprentice->Initialize((struct IICWExtension *)g_pCINETCFGExtension); } hResult = gpINETCFGApprentice->AddWizardPages(dwFlags | WIZ_USE_WIZARD97); if( !SUCCEEDED(hResult) ) { goto LoadInetCfgUIExit; } hResult = gpINETCFGApprentice->SetPrevNextPage( uPrevDlgID, uNextDlgID ); LoadInetCfgUIExit: if( SUCCEEDED(hResult) ) { g_fINETCFGLoaded = TRUE; return TRUE; } else { // Check if we are in /smartreboot mode, if so, don't add icw to runonce // to avoid infinite reboot. if (gpINETCFGApprentice && !g_bManualPath && !g_bLanPath) { HKEY hkey; // Verify that we really changed the desktop if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, ICWSETTINGSPATH, 0, KEY_ALL_ACCESS, &hkey)) { DWORD dwICWErr = 0; DWORD dwTmp = sizeof(DWORD); DWORD dwType = 0; RegQueryValueEx(hkey, ICW_REGKEYERROR, NULL, &dwType, (LPBYTE)&dwICWErr, &dwTmp); RegDeleteValue(hkey, ICW_REGKEYERROR); RegCloseKey(hkey); // Bail if the desktop was not changed by us if(dwICWErr & ICW_CFGFLAG_SMARTREBOOT_MANUAL) { ShowWindow(GetParent(hWizHWND), FALSE); Reboot(GetParent(hWizHWND)); gfQuitWizard = TRUE; } } } TraceMsg(TF_ICWEXTSN, TEXT("LoadInetCfgUIExit failed with (hex) hresult %x"), hResult); return FALSE; } }