695 lines
19 KiB
C++
695 lines
19 KiB
C++
|
// MainFrm.cpp : implementation of the CMainFrame class
|
||
|
//
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include <winsvc.h>
|
||
|
#include "resource.h"
|
||
|
#include <pwsdata.hxx>
|
||
|
#include "Sink.h"
|
||
|
|
||
|
#include "pwsdoc.h"
|
||
|
|
||
|
#include "Title.h"
|
||
|
#include "HotLink.h"
|
||
|
#include "PWSChart.h"
|
||
|
|
||
|
#include "pwsform.h"
|
||
|
|
||
|
#include "EdDir.h"
|
||
|
#include "FormAdv.h"
|
||
|
#include "FormIE.h"
|
||
|
#include "FormMain.h"
|
||
|
#include "SelBarFm.h"
|
||
|
|
||
|
#include "MainFrm.h"
|
||
|
|
||
|
#include "ServCntr.h"
|
||
|
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
#define new DEBUG_NEW
|
||
|
#undef THIS_FILE
|
||
|
static char THIS_FILE[] = __FILE__;
|
||
|
#endif
|
||
|
|
||
|
CMainFrame* g_frame = NULL;
|
||
|
CPWSForm* g_pCurrentForm = NULL;
|
||
|
|
||
|
extern WORD g_InitialPane;
|
||
|
extern CPwsDoc* g_p_Doc;
|
||
|
extern CFormMain* g_FormMain;
|
||
|
|
||
|
// this flag indicates that we have gotten a server shutdown notification
|
||
|
// and we have entered shutdown mode. In this mode, the only features that
|
||
|
// are available anywhere include the start button, and the troubleshooting.
|
||
|
// I suppose the tour would be OK too since that isn't served.
|
||
|
BOOL g_fShutdownMode = FALSE;
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMainFrame
|
||
|
|
||
|
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
|
||
|
//{{AFX_MSG_MAP(CMainFrame)
|
||
|
ON_WM_CREATE()
|
||
|
ON_COMMAND(ID_PGE_MAIN, OnPgeMain)
|
||
|
ON_COMMAND(ID_PGE_ADVANCED, OnPgeAdvanced)
|
||
|
ON_COMMAND(ID_PGE_TOUR, OnPgeTour)
|
||
|
ON_UPDATE_COMMAND_UI(ID_PGE_TOUR, OnUpdatePgeTour)
|
||
|
ON_UPDATE_COMMAND_UI(ID_PGE_MAIN, OnUpdatePgeMain)
|
||
|
ON_UPDATE_COMMAND_UI(ID_PGE_ADVANCED, OnUpdatePgeAdvanced)
|
||
|
//}}AFX_MSG_MAP
|
||
|
// Global help commands
|
||
|
ON_COMMAND(ID_HELP_FINDER, CFrameWnd::OnHelpFinder)
|
||
|
ON_COMMAND(ID_HELP, CFrameWnd::OnHelp)
|
||
|
ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
|
||
|
ON_COMMAND(ID_DEFAULT_HELP, CFrameWnd::OnHelpFinder)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMainFrame construction/destruction
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
CMainFrame::CMainFrame():
|
||
|
m_pIEView( NULL )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
CMainFrame::~CMainFrame()
|
||
|
{
|
||
|
g_frame = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||
|
{
|
||
|
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
|
||
|
return -1;
|
||
|
|
||
|
// DISABLE TOOL BAR
|
||
|
/*
|
||
|
if (!m_wndToolBar.Create(this) ||
|
||
|
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
|
||
|
{
|
||
|
TRACE0("Failed to create toolbar\n");
|
||
|
return -1; // fail to create
|
||
|
}
|
||
|
|
||
|
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
|
||
|
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);
|
||
|
|
||
|
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
|
||
|
EnableDocking(CBRS_ALIGN_ANY);
|
||
|
DockControlBar(&m_wndToolBar);
|
||
|
*/
|
||
|
|
||
|
g_frame = this;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
|
||
|
{
|
||
|
cs.style = WS_OVERLAPPED | WS_CAPTION | WS_BORDER | FWS_ADDTOTITLE
|
||
|
| WS_SYSMENU | WS_MINIMIZEBOX;
|
||
|
|
||
|
cs.cx = 78;
|
||
|
cs.cy = 50;
|
||
|
|
||
|
LONG base = GetDialogBaseUnits();
|
||
|
WORD baseX = LOWORD(base);
|
||
|
WORD baseY = LOWORD(base);
|
||
|
|
||
|
cs.cx *= baseX;
|
||
|
cs.cy *= baseY;
|
||
|
|
||
|
// account for user-defined window size changes
|
||
|
cs.cy += GetSystemMetrics( SM_CYMENU );
|
||
|
cs.cy += GetSystemMetrics( SM_CYCAPTION );
|
||
|
|
||
|
// do the normal thing
|
||
|
return CFrameWnd::PreCreateWindow(cs);
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMainFrame diagnostics
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
//-----------------------------------------------------------------
|
||
|
void CMainFrame::AssertValid() const
|
||
|
{
|
||
|
CFrameWnd::AssertValid();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------
|
||
|
void CMainFrame::Dump(CDumpContext& dc) const
|
||
|
{
|
||
|
CFrameWnd::Dump(dc);
|
||
|
}
|
||
|
|
||
|
#endif //_DEBUG
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMainFrame message handlers
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|
||
|
// CMainFrame message handlers
|
||
|
//--------------------------------------------------------------
|
||
|
// we just want the title of the app in the title bar
|
||
|
void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle)
|
||
|
{
|
||
|
CFrameWnd::OnUpdateFrameTitle(FALSE);
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
|
||
|
{
|
||
|
// create the static splitter window
|
||
|
if ( !m_wndSplitter.CreateStatic( this, 1, 2 ) )
|
||
|
{
|
||
|
TRACE0("Failed to CreateStaticSplitter\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// calculate the width of the first splitter window
|
||
|
DWORD cpWidth = 11;
|
||
|
cpWidth *= LOWORD(GetDialogBaseUnits());
|
||
|
|
||
|
// the initial size of the first pane should be a function of the width of the view
|
||
|
// add the first splitter pane - The machine tree view
|
||
|
if (!m_wndSplitter.CreateView(0, 0,
|
||
|
pContext->m_pNewViewClass, CSize(cpWidth, 500), pContext))
|
||
|
{
|
||
|
TRACE0("Failed to create machine tree pane\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
switch( g_InitialPane )
|
||
|
{
|
||
|
case PANE_MAIN:
|
||
|
if (!m_wndSplitter.CreateView(0, 1,
|
||
|
RUNTIME_CLASS(CFormMain), CSize(0, 0), pContext))
|
||
|
{
|
||
|
TRACE0("Failed to create main form pane\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
break;
|
||
|
case PANE_IE:
|
||
|
if (!m_wndSplitter.CreateView(0, 1,
|
||
|
RUNTIME_CLASS(CFormIE), CSize(0, 0), pContext))
|
||
|
{
|
||
|
TRACE0("Failed to create main form pane\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
// get the new ie view
|
||
|
m_pIEView = (CFormIE *)m_wndSplitter.GetPane(0, 1);
|
||
|
break;
|
||
|
case PANE_ADVANCED:
|
||
|
if (!m_wndSplitter.CreateView(0, 1,
|
||
|
RUNTIME_CLASS(CFormAdvanced), CSize(0, 0), pContext))
|
||
|
{
|
||
|
TRACE0("Failed to create main form pane\n");
|
||
|
return FALSE;
|
||
|
}
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
// Replace the specified pane in the splitter window, with the
|
||
|
// new view window
|
||
|
void
|
||
|
CMainFrame::ReplaceView(
|
||
|
int nRow,
|
||
|
int nCol,
|
||
|
CRuntimeClass * pNewView,
|
||
|
CSize & size
|
||
|
)
|
||
|
{
|
||
|
g_pCurrentForm = NULL;
|
||
|
CView * pCurrentView = (CView *)m_wndSplitter.GetPane(nRow, nCol);
|
||
|
|
||
|
CRect rc;
|
||
|
pCurrentView->GetClientRect(rc);
|
||
|
size = CSize(rc.Width(), rc.Height());
|
||
|
|
||
|
BOOL fActiveView = (pCurrentView == GetActiveView());
|
||
|
CDocument * pDoc= pCurrentView->GetDocument();
|
||
|
|
||
|
//
|
||
|
// set flag so that document will not be deleted when
|
||
|
// view is destroyed
|
||
|
//
|
||
|
pDoc->m_bAutoDelete = FALSE;
|
||
|
//
|
||
|
// Delete existing view
|
||
|
//
|
||
|
pCurrentView->DestroyWindow();
|
||
|
//
|
||
|
// set flag back to default
|
||
|
//
|
||
|
pDoc->m_bAutoDelete = TRUE;
|
||
|
|
||
|
//
|
||
|
// Create new view
|
||
|
//
|
||
|
CCreateContext context;
|
||
|
context.m_pNewViewClass = pNewView;
|
||
|
context.m_pCurrentDoc = pDoc;
|
||
|
context.m_pNewDocTemplate = NULL;
|
||
|
context.m_pLastView = NULL;
|
||
|
context.m_pCurrentFrame = NULL;
|
||
|
|
||
|
m_wndSplitter.CreateView(nRow, nCol, pNewView, size, &context);
|
||
|
|
||
|
pCurrentView = (CView *)m_wndSplitter.GetPane(nRow, nCol);
|
||
|
|
||
|
pCurrentView->OnInitialUpdate();
|
||
|
m_wndSplitter.RecalcLayout();
|
||
|
|
||
|
if (fActiveView)
|
||
|
{
|
||
|
SetActiveView(pCurrentView);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnPgeMain()
|
||
|
{
|
||
|
m_pIEView = NULL;
|
||
|
ReplaceView( 0, 1, RUNTIME_CLASS(CFormMain), CSize(0, 0) );
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnPgeAdvanced()
|
||
|
{
|
||
|
if ( g_fShutdownMode )
|
||
|
{
|
||
|
AfxMessageBox( IDS_ERR_SERV_ADVANCED );
|
||
|
return;
|
||
|
}
|
||
|
m_pIEView = NULL;
|
||
|
ReplaceView( 0, 1, RUNTIME_CLASS(CFormAdvanced), CSize(0, 0) );
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
BOOL CMainFrame::OnPgeIE()
|
||
|
{
|
||
|
// if we are already on the IE page, then we don't have to do anything
|
||
|
if ( m_pIEView )
|
||
|
return TRUE;
|
||
|
|
||
|
// we have to swap in theIE pane
|
||
|
CWaitCursor wait;
|
||
|
ReplaceView( 0, 1, RUNTIME_CLASS(CFormIE), CSize(0, 0) );
|
||
|
// get the new ie view
|
||
|
m_pIEView = (CFormIE *)m_wndSplitter.GetPane(0, 1);
|
||
|
if ( !m_pIEView ) return FALSE;
|
||
|
|
||
|
// tell the user to sit tight
|
||
|
m_pIEView->SetTitle( IDS_PLEASE_WAIT_IE_LOADING );
|
||
|
m_pIEView->UpdateWindow( );
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnPgeTour()
|
||
|
{
|
||
|
// go to the IE page
|
||
|
if ( !OnPgeIE() )
|
||
|
return;
|
||
|
|
||
|
// go to the URL
|
||
|
m_pIEView->GoToTour();
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnPgeAboutMe()
|
||
|
{
|
||
|
// first, make sure the server is running
|
||
|
CW3ServerControl serverController;
|
||
|
if ( g_fShutdownMode || (serverController.GetServerState() != MD_SERVER_STATE_STARTED) )
|
||
|
{
|
||
|
AfxMessageBox( IDS_ERR_SERV_ABOUT );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// go to the IE page
|
||
|
if ( !OnPgeIE() )
|
||
|
return;
|
||
|
|
||
|
// go to the correct URL
|
||
|
m_pIEView->GoToPubWizard();
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnPgeWebSite()
|
||
|
{
|
||
|
// first, make sure the server is running
|
||
|
CW3ServerControl serverController;
|
||
|
if ( g_fShutdownMode || (serverController.GetServerState() != MD_SERVER_STATE_STARTED) )
|
||
|
{
|
||
|
AfxMessageBox( IDS_ERR_SERV_WEB );
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// go to the IE page
|
||
|
if ( !OnPgeIE() )
|
||
|
return;
|
||
|
|
||
|
// go to the correct URL
|
||
|
m_pIEView->GoToWebsite();
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnUpdatePgeTour(CCmdUI* pCmdUI)
|
||
|
{
|
||
|
pCmdUI->Enable( TRUE );
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnUpdatePgeMain(CCmdUI* pCmdUI)
|
||
|
{
|
||
|
pCmdUI->Enable( TRUE );
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnUpdatePgeAdvanced(CCmdUI* pCmdUI)
|
||
|
{
|
||
|
pCmdUI->Enable( !g_fShutdownMode );
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnUpdatePgeAboutMe(CCmdUI* pCmdUI)
|
||
|
{
|
||
|
BOOL fEnable = FALSE;
|
||
|
|
||
|
// if we are not in shutdown mode, check the state of the server
|
||
|
if ( !g_fShutdownMode )
|
||
|
{
|
||
|
CW3ServerControl serverController;
|
||
|
DWORD dwState = serverController.GetServerState();
|
||
|
fEnable = (dwState == MD_SERVER_STATE_STARTED);
|
||
|
}
|
||
|
|
||
|
// enable the item
|
||
|
pCmdUI->Enable( fEnable );
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::OnUpdatePgeWebSite(CCmdUI* pCmdUI)
|
||
|
{
|
||
|
BOOL fEnable = FALSE;
|
||
|
|
||
|
// if we are not in shutdown mode, check the state of the server
|
||
|
if ( !g_fShutdownMode )
|
||
|
{
|
||
|
CW3ServerControl serverController;
|
||
|
DWORD dwState = serverController.GetServerState();
|
||
|
fEnable = (dwState == MD_SERVER_STATE_STARTED);
|
||
|
}
|
||
|
|
||
|
// enable the item
|
||
|
pCmdUI->Enable( fEnable );
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::WinHelp(DWORD dwData, UINT nCmd)
|
||
|
{
|
||
|
// if this is the context help for the main frame, get the context help for the
|
||
|
// appropriate sub-dialog
|
||
|
if ( g_pCurrentForm )
|
||
|
{
|
||
|
switch( LOWORD(dwData) )
|
||
|
{
|
||
|
case IDR_MAINFRAME:
|
||
|
case IDD_DIRECTORY: // let the adv pane decide
|
||
|
// clear out the lower word
|
||
|
dwData &= 0xFFFF0000;
|
||
|
// get the appropriate pane help id
|
||
|
dwData |= g_pCurrentForm->GetContextHelpID();
|
||
|
break;
|
||
|
};
|
||
|
}
|
||
|
CFrameWnd::WinHelp(dwData, nCmd);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
CFormSelectionBar* pSelView;
|
||
|
|
||
|
// look for the server shutdown notification message
|
||
|
switch( message )
|
||
|
{
|
||
|
case WM_PROCESS_REMOTE_COMMAND_INFO:
|
||
|
ProcessRemoteCommand();
|
||
|
break;
|
||
|
case WM_UPDATE_SERVER_STATE:
|
||
|
pSelView = (CFormSelectionBar*)m_wndSplitter.GetPane(0, 0);
|
||
|
if ( pSelView )
|
||
|
pSelView->ReflectAvailability();
|
||
|
break;
|
||
|
case WM_MAJOR_SERVER_SHUTDOWN_ALERT:
|
||
|
if ( !g_fShutdownMode )
|
||
|
EnterShutdownMode();
|
||
|
break;
|
||
|
case WM_TIMER: // only arrives if shutdown notify has happened
|
||
|
CheckIfServerIsRunningAgain();
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
// do the inherited function
|
||
|
return CFrameWnd::WindowProc(message, wParam, lParam);
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
void CMainFrame::EnterShutdownMode( void )
|
||
|
{
|
||
|
// first, shutdown the sink attached to the document
|
||
|
if ( g_p_Doc )
|
||
|
g_p_Doc->TerminateSink();
|
||
|
|
||
|
// close the link to the metabase - it is going away after all
|
||
|
FCloseMetabaseWrapper();
|
||
|
|
||
|
// record that we are in shutdown mode
|
||
|
g_fShutdownMode = TRUE;
|
||
|
|
||
|
// go to the main page
|
||
|
OnPgeMain();
|
||
|
|
||
|
// reflect this in the selection bar
|
||
|
CFormSelectionBar* pSelView = (CFormSelectionBar*)m_wndSplitter.GetPane(0, 0);
|
||
|
if ( pSelView )
|
||
|
pSelView->ReflectAvailability();
|
||
|
|
||
|
// start the timer mechanism
|
||
|
SetTimer( PWS_TIMER_CHECKFORSERVERRESTART, TIMER_RESTART, NULL );
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------
|
||
|
// This routine is called on a timer event. The timer events only come if we
|
||
|
// have received a shutdown notify callback from the metabase. So the server
|
||
|
// is down. We need to wait around until it comes back up, then show ourselves.
|
||
|
void CMainFrame::CheckIfServerIsRunningAgain()
|
||
|
{
|
||
|
// see if the server is running. If it is, show the icon and stop the timer.
|
||
|
if ( FIsW3Running() && g_p_Doc )
|
||
|
{
|
||
|
// if we can't use the metabase, there is no point in this
|
||
|
if ( !FInitMetabaseWrapper(NULL) )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// if we can't use the sink, there is no point in this
|
||
|
if ( !g_p_Doc->InitializeSink() )
|
||
|
{
|
||
|
FCloseMetabaseWrapper();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// clear the shutdown mode flag
|
||
|
g_fShutdownMode = FALSE;
|
||
|
|
||
|
// stop the timer mechanism
|
||
|
KillTimer( PWS_TIMER_CHECKFORSERVERRESTART );
|
||
|
|
||
|
// reflect this in the selection bar
|
||
|
CFormSelectionBar* pSelView = (CFormSelectionBar*)m_wndSplitter.GetPane(0, 0);
|
||
|
if ( pSelView )
|
||
|
pSelView->ReflectAvailability();
|
||
|
|
||
|
// tell the main page to update itself
|
||
|
if ( g_FormMain )
|
||
|
g_FormMain->PostMessage( WM_UPDATE_SERVER_STATE );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// routine to see if w3svc is running
|
||
|
//--------------------------------------------------------------------
|
||
|
// the method we use to see if the service is running is different on
|
||
|
// windows NT from win95
|
||
|
BOOL CMainFrame::FIsW3Running()
|
||
|
{
|
||
|
OSVERSIONINFO info_os;
|
||
|
info_os.dwOSVersionInfoSize = sizeof(info_os);
|
||
|
|
||
|
if ( !GetVersionEx( &info_os ) )
|
||
|
return FALSE;
|
||
|
|
||
|
// if the platform is NT, query the service control manager
|
||
|
if ( info_os.dwPlatformId == VER_PLATFORM_WIN32_NT )
|
||
|
{
|
||
|
BOOL fRunning = FALSE;
|
||
|
|
||
|
// open the service manager
|
||
|
SC_HANDLE sch = OpenSCManager(NULL, NULL, GENERIC_READ );
|
||
|
if ( sch == NULL ) return FALSE;
|
||
|
|
||
|
// get the service
|
||
|
SC_HANDLE schW3 = OpenService(sch, _T("W3SVC"), SERVICE_QUERY_STATUS );
|
||
|
if ( sch == NULL )
|
||
|
{
|
||
|
CloseServiceHandle( sch );
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// query the service status
|
||
|
SERVICE_STATUS status;
|
||
|
ZeroMemory( &status, sizeof(status) );
|
||
|
if ( QueryServiceStatus(schW3, &status) )
|
||
|
{
|
||
|
fRunning = (status.dwCurrentState == SERVICE_RUNNING);
|
||
|
}
|
||
|
|
||
|
CloseServiceHandle( schW3 );
|
||
|
CloseServiceHandle( sch );
|
||
|
|
||
|
// return the answer
|
||
|
return fRunning;
|
||
|
}
|
||
|
|
||
|
// if the platform is Windows95, see if the object exists
|
||
|
if ( info_os.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS )
|
||
|
{
|
||
|
HANDLE hEvent;
|
||
|
BOOL fFound = FALSE;
|
||
|
hEvent = CreateEvent(NULL, TRUE, FALSE, _T(PWS_SHUTDOWN_EVENT));
|
||
|
if ( hEvent != NULL )
|
||
|
{
|
||
|
fFound = (GetLastError() == ERROR_ALREADY_EXISTS);
|
||
|
CloseHandle(hEvent);
|
||
|
}
|
||
|
return(fFound);
|
||
|
}
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
//--------------------------------------------------------------
|
||
|
// method only gets called when another instance of the application
|
||
|
// as been invoked. Since we are only supposed to have one instance
|
||
|
// of the apoplication running at a time, and also sine that other
|
||
|
// instance may have been invoked with a command line, we should do
|
||
|
// that that command line requested. The other instance has already
|
||
|
// parsed the command and marshaled the parameters into a shared
|
||
|
// memory space object. All we have to do is get it and act on the
|
||
|
// commands
|
||
|
void CMainFrame::ProcessRemoteCommand()
|
||
|
{
|
||
|
HANDLE hMap;
|
||
|
PPWS_INSTANCE_TRANSFER pData;
|
||
|
CString sz;
|
||
|
CView *pView;
|
||
|
|
||
|
// get the shared memory space object
|
||
|
hMap = OpenFileMapping(
|
||
|
FILE_MAP_READ,
|
||
|
FALSE,
|
||
|
PWS_INSTANCE_TRANSFER_SPACE_NAME
|
||
|
);
|
||
|
if ( hMap == NULL )
|
||
|
return;
|
||
|
pData = (PPWS_INSTANCE_TRANSFER)MapViewOfFile(
|
||
|
hMap,
|
||
|
FILE_MAP_READ,
|
||
|
0,
|
||
|
0,
|
||
|
0
|
||
|
);
|
||
|
if ( !pData )
|
||
|
{
|
||
|
CloseHandle(hMap);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
// act on the command data we have just gotten
|
||
|
switch( pData->iTargetPane )
|
||
|
{
|
||
|
case PANE_MAIN:
|
||
|
OnPgeMain();
|
||
|
// force the pane to update
|
||
|
pView = (CView *)m_wndSplitter.GetPane(0, 1);
|
||
|
if ( pView )
|
||
|
{
|
||
|
pView->PostMessage(WM_UPDATE_SERVER_STATE);
|
||
|
pView->PostMessage(WM_UPDATE_LOCATIONS);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PANE_IE:
|
||
|
// go to the IE page
|
||
|
if ( !OnPgeIE() )
|
||
|
break;
|
||
|
// go to the right IE page
|
||
|
switch( pData->iTargetIELocation )
|
||
|
{
|
||
|
case INIT_IE_TOUR:
|
||
|
m_pIEView->GoToTour();
|
||
|
break;
|
||
|
case INIT_IE_WEBSITE:
|
||
|
m_pIEView->GoToWebsite();
|
||
|
break;
|
||
|
case INIT_IE_PUBWIZ:
|
||
|
sz = &pData->tchIEURL;
|
||
|
m_pIEView->GoToPubWizard( sz );
|
||
|
break;
|
||
|
};
|
||
|
break;
|
||
|
|
||
|
case PANE_ADVANCED:
|
||
|
OnPgeAdvanced();
|
||
|
// force the pane to update
|
||
|
pView = (CView *)m_wndSplitter.GetPane(0, 1);
|
||
|
if ( pView )
|
||
|
{
|
||
|
pView->PostMessage(WM_UPDATE_BROWSEINFO);
|
||
|
pView->PostMessage(WM_UPDATE_LOGINFO);
|
||
|
pView->PostMessage(WM_UPDATE_TREEINFO);
|
||
|
}
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
|
||
|
// clean up the shared memory space
|
||
|
UnmapViewOfFile(pData);
|
||
|
CloseHandle(hMap);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|