// TestContainer98.cpp : Defines the class behaviors for the application. // #include "StdAfx.H" #include "TestCon.H" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif CTCOptions::CTCOptions() : m_iLogType( TCLOG_OUTPUTWINDOW ), m_tUserMode( FALSE ), m_tAllowWindowless( TRUE ), m_tQuickActivation( TRUE ), m_tTwoPassDrawing( TRUE ), m_tUseIPointerInactive( TRUE ), m_tHonorIgnoreActivateWhenVisible( TRUE ), m_tIOleInPlaceSiteEx( TRUE ), m_tIOleInPlaceSiteWindowless( TRUE ), m_tIAdviseSinkEx( TRUE ), m_tSBindHost( TRUE ) { } CTCCommandLineInfo::CTCCommandLineInfo( CTCOptions* pOptions ) : m_pOptions( pOptions ), m_tExpectingLogFileName( FALSE ), m_tExpectingProgID( FALSE ) { ASSERT( m_pOptions != NULL ); } /* TestContainer98 command line switches: -C ProgID of control to initially load -Ln No logging -Lo Log to output window -Ld Log to debugger -Lf Log to file -IOleInPlaceSiteEx+ Support IOleInPlaceSiteEx -IOleInPlaceSiteEx- Don't support IOleInPlaceSiteEx -IOleInPlaceSiteWindowless+ Support IOleInPlaceSiteWindowless -IOleInPlaceSiteWindowless- Don't support IOleInPlaceSiteWindowless -IAdviseSinkEx+ Support IAdviseSinkEx -IAdviseSinkEx- Don't support IAdviseSinkEx -SBindHost+ Support SBindHost -SBindHost- Don't support SBindHost -OQ+ Use quick activation -OQ- Do not use quick activation -OT+ Use two-pass drawing -OT- Do not use two-pass drawing -OI+ Support inactive controls -OI- Do not support inactive controls -OH+ Honor OLEMISC_IGNOREACTIVATEWHENVISIBLE -OH- Don't honor OLEMISC_IGNOREACTIVATEWHENVISIBLE -OW+ Allow windowless activation -OW- Disallow windowless activation -U+ User mode -U- Design mode */ void CTCCommandLineInfo::ParseServiceFlag( LPCTSTR pszParam ) { BOOL* ptService; const TCHAR* pcFlag; ASSERT( pszParam != NULL ); ASSERT( pszParam[0] == 'S' ); ptService = NULL; pcFlag = NULL; if( strncmp( pszParam, _T( "SBindHost" ), strlen( _T( "SBindHost" ) ) ) == 0 ) { ptService = &m_pOptions->m_tSBindHost; pcFlag = &pszParam[strlen( _T( "SBindHost" ) )]; } if( ptService == NULL ) { TCTrace( TRACELEVEL_NORMAL, "Unrecognized command line parameter %s\n", pszParam ); } else { if( *pcFlag == _T( '+' ) ) { *ptService = TRUE; } else if( *pcFlag == _T( '-' ) ) { *ptService = FALSE; } else { TCTrace( TRACELEVEL_NORMAL, "Command line option %s: Expected + or -\n", pszParam ); } } } void CTCCommandLineInfo::ParseInterfaceFlag( LPCTSTR pszParam ) { ASSERT( pszParam != NULL ); ASSERT( pszParam[0] == 'I' ); if( strncmp( pszParam, _T( "IOleInPlaceSiteEx" ), strlen( _T( "IOleInPlaceSiteEx" ) ) ) == 0 ) { switch( pszParam[strlen( _T( "IOleInPlaceSiteEx" ) )] ) { case _T( '+' ): m_pOptions->m_tIOleInPlaceSiteEx = TRUE; break; case _T( '-' ): m_pOptions->m_tIOleInPlaceSiteEx = FALSE; break; default: TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); break; } } else if( strncmp( pszParam, _T( "IOleInPlaceSiteWindowless" ), strlen( _T( "IOleInPlaceSiteWindowless" ) ) ) == 0 ) { switch( pszParam[strlen( _T( "IOleInPlaceSiteWindowless" ) )] ) { case _T( '+' ): m_pOptions->m_tIOleInPlaceSiteWindowless = TRUE; break; case _T( '-' ): m_pOptions->m_tIOleInPlaceSiteWindowless = FALSE; break; default: TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); break; } } else if( strncmp( pszParam, _T( "IAdviseSinkEx" ), strlen( _T( "IAdviseSinkEx" ) ) ) == 0 ) { switch( pszParam[strlen( _T( "IAdviseSinkEx" ) )] ) { case _T( '+' ): m_pOptions->m_tIAdviseSinkEx = TRUE; break; case _T( '-' ): m_pOptions->m_tIAdviseSinkEx = FALSE; break; default: TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); break; } } else { TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); } } void CTCCommandLineInfo::ParseOptionFlag( LPCTSTR pszParam ) { BOOL* ptOption; ASSERT( pszParam != NULL ); ASSERT( pszParam[0] == 'O' ); ptOption = NULL; switch( pszParam[1] ) { case _T( 'Q' ): ptOption = &m_pOptions->m_tQuickActivation; break; case _T( 'T' ): ptOption = &m_pOptions->m_tTwoPassDrawing; break; case _T( 'W' ): ptOption = &m_pOptions->m_tAllowWindowless; break; case _T( 'H' ): ptOption = &m_pOptions->m_tHonorIgnoreActivateWhenVisible; break; case _T( 'I' ): ptOption = &m_pOptions->m_tUseIPointerInactive; break; default: TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); break; } if( ptOption != NULL ) { if( pszParam[2] == _T( '+' ) ) { *ptOption = TRUE; } else if( pszParam[2] == _T( '-' ) ) { *ptOption = FALSE; } else { TCTrace( TRACELEVEL_NORMAL, "Command line option %s: expected + or -\n", pszParam ); } } } void CTCCommandLineInfo::ParseParam( LPCTSTR pszParam, BOOL tFlag, BOOL tLast ) { BOOL tHandled; TRACE( "%s\n", pszParam ); tHandled = FALSE; if( m_tExpectingLogFileName ) { tHandled = TRUE; m_tExpectingLogFileName = FALSE; if( tFlag ) { TCTrace( TRACELEVEL_NORMAL, "Bogus log filename\n" ); } else { m_pOptions->m_strLogFileName = pszParam; } } else if( m_tExpectingProgID ) { tHandled = TRUE; m_tExpectingProgID = FALSE; if( tFlag ) { TCTrace( TRACELEVEL_NORMAL, "Bogus ProgID\n" ); } else { m_pOptions->m_strProgID = pszParam; } } else { if( tFlag ) { tHandled = TRUE; switch( pszParam[0] ) { case _T( 'C' ): if( tLast ) { TCTrace( TRACELEVEL_NORMAL, "No ProgID given for /C parameter\n" ); } else { m_tExpectingProgID = TRUE; } break; case _T( 'I' ): ParseInterfaceFlag( pszParam ); break; case _T( 'S' ): ParseServiceFlag( pszParam ); break; case _T( 'L' ): switch( pszParam[1] ) { case _T( 'n' ): m_pOptions->m_iLogType = TCLOG_NULL; break; case _T( 'o' ): m_pOptions->m_iLogType = TCLOG_OUTPUTWINDOW; break; case _T( 'd' ): m_pOptions->m_iLogType = TCLOG_DEBUG; break; case _T( 'f' ): if( tLast ) { TCTrace( 1, "No filename given for /Lf parameter\n" ); } else { m_tExpectingLogFileName = TRUE; } break; default: TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); break; } break; case _T( 'O' ): ParseOptionFlag( pszParam ); break; case _T( 'U' ): switch( pszParam[1] ) { case _T( '-' ): m_pOptions->m_tUserMode = FALSE; break; case _T( '+' ): m_pOptions->m_tUserMode = TRUE; break; default: TCTrace( 1, "Unrecognized command line parameter %s\n", pszParam ); break; } break; default: tHandled = FALSE; break; } } } if( !tHandled ) { CCommandLineInfo::ParseParam( pszParam, tFlag, tLast ); } } ///////////////////////////////////////////////////////////////////////////// // CTestContainer98App BEGIN_MESSAGE_MAP(CTestContainer98App, CWinApp) //{{AFX_MSG_MAP(CTestContainer98App) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) ON_COMMAND(ID_OPTIONS_TRACELEVEL_NONE, OnOptionsTraceLevelNone) ON_COMMAND(ID_OPTIONS_TRACELEVEL_NORMAL, OnOptionsTraceLevelNormal) ON_COMMAND(ID_OPTIONS_TRACELEVEL_VERBOSE, OnOptionsTraceLevelVerbose) ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRACELEVEL_NONE, OnUpdateOptionsTraceLevelNone) ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRACELEVEL_NORMAL, OnUpdateOptionsTraceLevelNormal) ON_UPDATE_COMMAND_UI(ID_OPTIONS_TRACELEVEL_VERBOSE, OnUpdateOptionsTraceLevelVerbose) ON_COMMAND(ID_FILE_REGISTERCONTROLS, OnFileRegisterControls) //}}AFX_MSG_MAP // Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CTestContainer98App construction CTestContainer98App::CTestContainer98App() { // TODO: add construction code here, // Place all significant initialization in InitInstance } ///////////////////////////////////////////////////////////////////////////// // The one and only CTestContainer98App object CTestContainer98App theApp; // This identifier was generated to be statistically unique for your app. // You may change it if you prefer to choose a specific identifier. // {198184FA-B837-11D0-8DF1-00C04FB68D60} static const CLSID clsid = { 0x198184fa, 0xb837, 0x11d0, { 0x8d, 0xf1, 0x0, 0xc0, 0x4f, 0xb6, 0x8d, 0x60 } }; ///////////////////////////////////////////////////////////////////////////// // CTestContainer98App initialization static const LPCTSTR SETTINGS_KEY = _T( "Settings" ); void CTestContainer98App::LoadRegistrySettings() { m_options.m_tUserMode = GetProfileInt( SETTINGS_KEY, _T( "UserMode" ), FALSE ); m_options.m_tAllowWindowless = GetProfileInt( SETTINGS_KEY, _T( "AllowWindowless" ), TRUE ); m_options.m_tQuickActivation = GetProfileInt( SETTINGS_KEY, _T( "QuickActivation" ), TRUE ); m_options.m_tTwoPassDrawing = GetProfileInt( SETTINGS_KEY, _T( "TwoPassDrawing" ), TRUE ); m_options.m_tHonorIgnoreActivateWhenVisible = GetProfileInt( SETTINGS_KEY, _T( "HonorIgnoreActivateWhenVisible" ), TRUE ); m_options.m_tUseIPointerInactive = GetProfileInt( SETTINGS_KEY, _T( "UseIPointerInactive" ), TRUE ); m_options.m_tIOleInPlaceSiteEx = GetProfileInt( SETTINGS_KEY, _T( "IOleInPlaceSiteEx" ), TRUE ); m_options.m_tIOleInPlaceSiteWindowless = GetProfileInt( SETTINGS_KEY, _T( "IOleInPlaceSiteWindowless" ), TRUE ); m_options.m_tIAdviseSinkEx = GetProfileInt( SETTINGS_KEY, _T( "IAdviseSinkEx" ), TRUE ); m_options.m_tSBindHost = GetProfileInt( SETTINGS_KEY, _T( "SBindHost" ), TRUE ); } void CTestContainer98App::SaveRegistrySettings() { WriteProfileInt( SETTINGS_KEY, _T( "UserMode" ), m_options.m_tUserMode ); WriteProfileInt( SETTINGS_KEY, _T( "AllowWindowless" ), m_options.m_tAllowWindowless ); WriteProfileInt( SETTINGS_KEY, _T( "QuickActivation" ), m_options.m_tQuickActivation ); WriteProfileInt( SETTINGS_KEY, _T( "TwoPassDrawing" ), m_options.m_tTwoPassDrawing ); WriteProfileInt( SETTINGS_KEY, _T( "UseIPointerInactive" ), m_options.m_tUseIPointerInactive ); WriteProfileInt( SETTINGS_KEY, _T( "HonorIgnoreActivateWhenVisible" ), m_options.m_tHonorIgnoreActivateWhenVisible ); WriteProfileInt( SETTINGS_KEY, _T( "IOleInPlaceSiteEx" ), m_options.m_tIOleInPlaceSiteEx ); WriteProfileInt( SETTINGS_KEY, _T( "IOleInPlaceSiteWindowless" ), m_options.m_tIOleInPlaceSiteWindowless ); WriteProfileInt( SETTINGS_KEY, _T( "IAdviseSinkEx" ), m_options.m_tIAdviseSinkEx ); WriteProfileInt( SETTINGS_KEY, _T( "SBindHost" ), m_options.m_tSBindHost ); } BOOL CTestContainer98App::InitInstance() { // Initialize OLE libraries if( !AfxOleInit() ) { AfxMessageBox( IDP_OLE_INIT_FAILED ); return( FALSE ); } AfxEnableControlContainer(); // Standard initialization // If you are not using these features and wish to reduce the size // of your final executable, you should remove from the following // the specific initialization routines you do not need. #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif // Change the registry key under which our settings are stored. // You should modify this string to be something appropriate // such as the name of your company or organization. SetRegistryKey( _T( "Microsoft" ) ); LoadStdProfileSettings(); // Load standard INI file options (including MRU) LoadRegistrySettings(); // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS( CTestContainer98Doc ), RUNTIME_CLASS( CMainFrame ), RUNTIME_CLASS( CTestContainer98View ) ); pDocTemplate->SetContainerInfo( IDR_TC98TYPE_CNTR_IP ); AddDocTemplate( pDocTemplate ); // Connect the COleTemplateServer to the document template. // The COleTemplateServer creates new documents on behalf // of requesting OLE containers by using information // specified in the document template. m_server.ConnectTemplate( clsid, pDocTemplate, FALSE ); // Note: SDI applications register server objects only if /Embedding // or /Automation is present on the command line. // Parse command line for standard shell commands, DDE, file open CTCCommandLineInfo cmdInfo( &m_options ); ParseCommandLine( cmdInfo ); // Check to see if launched as OLE server if( cmdInfo.m_bRunEmbedded || cmdInfo.m_bRunAutomated ) { // Application was run with /Embedding or /Automation. Don't show the // main window in this case. return( TRUE ); } // When a server application is launched stand-alone, it is a good idea // to update the system registry in case it has been damaged. m_server.UpdateRegistry( OAT_DISPATCH_OBJECT ); COleObjectFactory::UpdateRegistryAll(); // Dispatch commands specified on the command line if( !ProcessShellCommand( cmdInfo ) ) { return( FALSE ); } // The main window has been initialized, so show and update it. m_pMainWnd->ShowWindow( SW_SHOW ); m_pMainWnd->UpdateWindow(); return( TRUE ); } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) // No message handlers //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() // App command to run the dialog void CTestContainer98App::OnAppAbout() { CAboutDlg aboutDlg; aboutDlg.DoModal(); } ///////////////////////////////////////////////////////////////////////////// // CTestContainer98App commands void CTestContainer98App::OnOptionsTraceLevelNone() { SetTraceLevel( TRACELEVEL_NONE ); } void CTestContainer98App::OnOptionsTraceLevelNormal() { SetTraceLevel( TRACELEVEL_NORMAL ); } void CTestContainer98App::OnOptionsTraceLevelVerbose() { SetTraceLevel( TRACELEVEL_VERBOSE ); } void CTestContainer98App::OnUpdateOptionsTraceLevelNone( CCmdUI* pCmdUI ) { pCmdUI->SetRadio( GetTraceLevel() == TRACELEVEL_NONE ); } void CTestContainer98App::OnUpdateOptionsTraceLevelNormal( CCmdUI* pCmdUI ) { pCmdUI->SetRadio( GetTraceLevel() == TRACELEVEL_NORMAL ); } void CTestContainer98App::OnUpdateOptionsTraceLevelVerbose( CCmdUI* pCmdUI ) { pCmdUI->SetRadio( GetTraceLevel() == TRACELEVEL_VERBOSE ); } void CTestContainer98App::OnFileRegisterControls() { CRegisterControlsDlg dlg; dlg.DoModal(); }