home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / addins / cmdwnd / msdevcmd / msdevcmd.cpp < prev    next >
C/C++ Source or Header  |  1998-04-02  |  5KB  |  218 lines

  1. // msdevcmd.cpp : Defines the class behaviors for the application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "msdevcmd.h"
  6. #include "msdevcmdDlg.h"
  7. #include "CommandWindow.h"
  8.  
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMsdevcmdApp
  17. CComModule _Module;
  18.  
  19. class COleInit
  20. {
  21. public:
  22.     COleInit()
  23.     {
  24. #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
  25.         HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  26. #else
  27.         HRESULT hRes = CoInitialize(NULL);
  28. #endif
  29.         _ASSERTE(SUCCEEDED(hRes));
  30.     }
  31.  
  32.     ~COleInit()
  33.     {
  34.         CoUninitialize();
  35.     }
  36. };
  37.  
  38.  
  39. COleInit g_OleInit;
  40.  
  41. BEGIN_OBJECT_MAP(ObjectMap)
  42. OBJECT_ENTRY(CLSID_CommandWindow, CCommandWindow)
  43. END_OBJECT_MAP()
  44.  
  45. BEGIN_MESSAGE_MAP(CMsdevcmdApp, CWinApp)
  46.     //{{AFX_MSG_MAP(CMsdevcmdApp)
  47.         // NOTE - the ClassWizard will add and remove mapping macros here.
  48.         //    DO NOT EDIT what you see in these blocks of generated code!
  49.     //}}AFX_MSG
  50.     ON_COMMAND(ID_HELP, CWinApp::OnHelp)
  51. END_MESSAGE_MAP()
  52.  
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CMsdevcmdApp construction
  55.  
  56. CMsdevcmdApp::CMsdevcmdApp()
  57. {
  58. }
  59.  
  60. /////////////////////////////////////////////////////////////////////////////
  61. // The one and only CMsdevcmdApp object
  62.  
  63. CMsdevcmdApp theApp;
  64.  
  65. /////////////////////////////////////////////////////////////////////////////
  66. // CMsdevcmdApp initialization
  67.  
  68. BOOL CMsdevcmdApp::InitInstance()
  69. {
  70.     HRESULT hr;
  71.  
  72.     _Module.Init(ObjectMap, m_hInstance, &LIBID_devcmdLib);
  73.  
  74. #ifdef _DEBUGOLE
  75.     int iRes;
  76.     iRes = AfxMessageBox(IDS_DEBUGBREAK, MB_YESNO, 0);
  77.     if (iRes == IDYES)
  78.         DebugBreak(); // do this so you can catch the process as it starts. It will bring up a MessageBox. Press Cancel to debug.
  79. #endif
  80.  
  81.     CString strFile(m_lpCmdLine);
  82.     BOOL fRun;
  83.  
  84.     fRun = TRUE;
  85.     strFile.TrimLeft();
  86.     if (!strFile.IsEmpty() && (strFile.GetAt(0) == _T('/') || strFile.GetAt(0) == _T('-')))
  87.     {
  88.         strFile = strFile.Mid(1); // get rid of switch command...
  89.         if (strFile.CompareNoCase(_T("Regserver")) == 0)
  90.         {
  91.             _Module.UpdateRegistryFromResource(IDR_COMMANDWINDOW, TRUE);
  92.             hr = _Module.RegisterServer(TRUE);
  93. #ifdef FEEDBACK
  94.             if (SUCCEEDED(hr))
  95.             {
  96.                 AfxMessageBox(IDS_REGOK, MB_OK, 0);
  97.             }
  98.             else
  99.             {
  100.                 AfxMessageBox(IDS_NOREG, MB_OK, 0);
  101.             }
  102. #endif
  103.             fRun = FALSE;
  104.         }
  105.         else if (strFile.CompareNoCase(_T("Unregserver")) == 0)
  106.         {
  107.             _Module.UpdateRegistryFromResource(IDR_COMMANDWINDOW, FALSE);
  108.             hr = _Module.UnregisterServer();
  109.  
  110. #if _WIN32_WINNT >= 0x0400
  111.             hr = UnRegisterTypeLib(LIBID_CommandWindowXLib, 1, 0, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), SYS_WIN32);
  112. #endif
  113.             fRun = FALSE;
  114.         }
  115.         else if (strFile.CompareNoCase(_T("Embedded")) == 0)
  116.         {
  117.             // ignore command line.
  118.             strFile.Empty();
  119.         }
  120.         else
  121.         {
  122.             strFile = m_lpCmdLine; // reset
  123.         }
  124.     }
  125.     if (fRun)
  126.     {
  127. #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
  128.         hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  129.             REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
  130.         _ASSERTE(SUCCEEDED(hRes));
  131.         hr = CoResumeClassObjects();
  132. #else
  133.         hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
  134.             REGCLS_MULTIPLEUSE);
  135. #endif
  136.         _ASSERTE(SUCCEEDED(hr));
  137.  
  138.     // Standard initialization
  139.     // If you are not using these features and wish to reduce the size
  140.     //  of your final executable, you should remove from the following
  141.     //  the specific initialization routines you do not need.
  142.  
  143. #ifdef _AFXDLL
  144.     Enable3dControls();            // Call this when using MFC in a shared DLL
  145. #else
  146.     Enable3dControlsStatic();    // Call this when linking to MFC statically
  147. #endif
  148.  
  149.         m_pDlgCommandWindow = new CMsdevcmdDlg();
  150.         m_pMainWnd = m_pDlgCommandWindow;
  151.         int nResponse = m_pDlgCommandWindow->DoModal();
  152.         if (nResponse == IDOK)
  153.         {
  154.             // TODO: Place code here to handle when the dialog is
  155.             //  dismissed with OK
  156.         }
  157.         else if (nResponse == IDCANCEL)
  158.         {
  159.             // TODO: Place code here to handle when the dialog is
  160.             //  dismissed with Cancel
  161.         }
  162.     }
  163.     if (m_pCommandWindow)
  164.     {
  165.         m_pCommandWindow->DoFireClose();
  166.         m_pCommandWindow.Release();
  167.         m_pCommandWindow = NULL;
  168.     }
  169.     _Module.Term();
  170.  
  171.     // Since the dialog has been closed, return FALSE so that we exit the
  172.     //  application, rather than start the application's message pump.
  173.     return FALSE;
  174. }
  175.  
  176. void CMsdevcmdApp::SetCommandWindow(CCommandWindow *pCommandWindow)
  177. {
  178.     if (m_pCommandWindow)
  179.     {
  180.         m_pCommandWindow.Release(); // don't have two!
  181.     }
  182.     m_pCommandWindow = pCommandWindow;
  183. }
  184.  
  185. CCommandWindow *CMsdevcmdApp::GetCmd() // only derived dialog(s) should do this.
  186. {
  187.     HRESULT hr = S_OK;
  188.     if (m_pCommandWindow == NULL)
  189.     {
  190.         CComObject<CCommandWindow> *pCommandWindow;
  191.         
  192.         hr = CComObject<CCommandWindow>::CreateInstance(&pCommandWindow);
  193.         if (SUCCEEDED(hr) && pCommandWindow)
  194.         {
  195.             pCommandWindow->AddRef();
  196.             hr = pCommandWindow->FindApp();
  197.             m_pCommandWindow = pCommandWindow;
  198.         }
  199.  
  200.  
  201.     }
  202.     return((CCommandWindow *)m_pCommandWindow.p);
  203. }
  204.  
  205.  
  206. CMsdevcmdApp::~CMsdevcmdApp()
  207. {
  208.     if (m_pCommandWindow)
  209.     {
  210.         m_pCommandWindow.Release();
  211.     }
  212.     if (m_pDlgCommandWindow)
  213.     {
  214.         delete m_pDlgCommandWindow;
  215.     }
  216. }
  217.  
  218.