DOSERVER.CPP
/************************************************************************** 
   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
   ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
   PARTICULAR PURPOSE. 
 
   Copyright 1997 Microsoft Corporation.  All Rights Reserved. 
**************************************************************************/ 
 
/************************************************************************** 
 
   File:          DOServer.cpp 
    
   Description:   General function implementation. 
 
**************************************************************************/ 
 
/************************************************************************** 
   #include statements 
**************************************************************************/ 
 
#include "DOServer.h" 
#include "ClsFact.h" 
#include <windowsx.h> 
#include <CommDlg.h> 
 
#include <initguid.h> 
 
// {F0FD0C00-65BA-11d0-B66F-00A0C90348D6} 
DEFINE_GUID(   CLSID_SimpleDocObject,  
               0xf0fd0c00,  
               0x65ba,  
               0x11d0,  
               0xb6,  
               0x6f,  
               0x0,  
               0xa0,  
               0xc9,  
               0x3,  
               0x48,  
               0xd6); 
 
/************************************************************************** 
   private function prototypes 
**************************************************************************/ 
 
BOOL InitApp(BOOL, int); 
void CenterWindow(HWND); 
 
/************************************************************************** 
   global variables 
**************************************************************************/ 
 
HINSTANCE      g_hInst; 
DWORD          g_DllRefCount; 
DWORD          g_dwRegister; 
 
/************************************************************************** 
 
   WinMain 
 
**************************************************************************/ 
 
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
BOOL  fEmbedding; 
MSG   msg; 
 
g_hInst = hInstance; 
 
//check for the embedding switch 
ParseCommandLine(lpCmdLine, &fEmbedding, NULL); 
  
if(!fEmbedding) 
   { 
   DialogBox(g_hInst, MAKEINTRESOURCE(IDD_MAIN_DIALOG), NULL, (DLGPROC)MainDlgProc); 
   return 0; 
   } 
 
if(!InitApp(fEmbedding, nCmdShow)) 
   return 0; 
 
//DebugBreak(); 
 
//The message loop will only exit when the main object gets destroyed. 
while(GetMessage(&msg, NULL, 0, 0)) 
   { 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
   } 
 
OutputDebugString(TEXT("Exiting WinMain\n")); 
 
if(g_dwRegister) 
   CoRevokeClassObject(g_dwRegister); 
 
CoUninitialize(); 
 
return msg.wParam; 
}                                  
 
/************************************************************************** 
 
   InitApp() 
    
**************************************************************************/ 
 
BOOL InitApp(BOOL fEmbedding, int nCmdShow) 
{ 
//initialize OLE 
if(FAILED(CoInitialize(NULL))) 
   return FALSE; 
 
CClassFactory  *pClassFactory = new CClassFactory(); 
 
if(NULL == pClassFactory) 
   { 
   CoUninitialize(); 
   return FALSE; 
   } 
 
LPUNKNOWN   pUnknown; 
HRESULT     hr; 
 
hr = pClassFactory->QueryInterface(IID_IUnknown, (LPVOID*)&pUnknown); 
if(FAILED(hr)) 
   { 
   pClassFactory->Release(); 
   return FALSE; 
   } 
 
//register the class object 
hr = CoRegisterClassObject(   CLSID_SimpleDocObject, 
                              pUnknown, 
                              CLSCTX_LOCAL_SERVER, 
                              REGCLS_MULTIPLEUSE, 
                              &g_dwRegister); 
 
if(FAILED(hr)) 
   { 
   pClassFactory->Release(); 
   return FALSE; 
   } 
 
return TRUE; 
} 
 
/************************************************************************** 
 
   MainDlgProc() 
    
**************************************************************************/ 
 
BOOL CALLBACK MainDlgProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) 
{ 
static COleDocument  *pOleDoc; 
 
switch(uMessage) 
   { 
   case WM_INITDIALOG: 
      CenterWindow(hWnd); 
       
      pOleDoc = new COleDocument(); 
 
      if(pOleDoc) 
         { 
         EnableWindow(GetDlgItem(hWnd, IDC_REGISTER), TRUE); 
         EnableWindow(GetDlgItem(hWnd, IDC_CREATE_FILE), TRUE); 
         } 
 
      break; 
    
   case WM_DESTROY: 
      if(pOleDoc) 
         { 
         delete pOleDoc; 
         } 
 
      break; 
    
   case WM_COMMAND: 
      switch(GET_WM_COMMAND_ID(wParam, lParam)) 
         { 
         case IDOK: 
         case IDCANCEL: 
            EndDialog(hWnd, 0); 
            break; 
          
         case IDC_REGISTER: 
            if(pOleDoc) 
               { 
               pOleDoc->RegisterServer(); 
               } 
            break; 
 
         case IDC_CREATE_FILE: 
            if(pOleDoc) 
               { 
               pOleDoc->CreateFile(hWnd); 
               } 
            break; 
         } 
      return FALSE; 
   } 
 
return FALSE; 
} 
 
 
/************************************************************************** 
 
   ColorHookProc() 
    
**************************************************************************/ 
 
BOOL CALLBACK ColorHookProc(HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam) 
{ 
static COleDocument  *pOleDoc; 
static UINT          uSaveOK; 
 
switch(uMessage) 
   { 
   case WM_INITDIALOG: 
      { 
      UINT  uSelect; 
 
      pOleDoc = (COleDocument*)((LPOPENFILENAME)(lParam))->lCustData; 
 
      uSaveOK = RegisterWindowMessage(FILEOKSTRING); 
 
      switch(pOleDoc->m_Color) 
         { 
         default: 
         case RED_COLOR: 
            uSelect = IDC_RED; 
            break; 
 
         case GREEN_COLOR: 
            uSelect = IDC_GREEN; 
            break; 
 
         case BLUE_COLOR: 
            uSelect = IDC_BLUE; 
            break; 
         } 
 
      CheckRadioButton(hWnd, IDC_RED, IDC_BLUE, uSelect); 
      } 
      break; 
 
   case WM_DESTROY: 
      break; 
 
   default: 
      if(uMessage == uSaveOK) 
         { 
         //Save button pressed 
         if(IsDlgButtonChecked(hWnd, IDC_GREEN)) 
            { 
            pOleDoc->m_Color = GREEN_COLOR; 
            } 
         else if(IsDlgButtonChecked(hWnd, IDC_BLUE)) 
            { 
            pOleDoc->m_Color = BLUE_COLOR; 
            } 
         else 
            { 
            pOleDoc->m_Color = RED_COLOR; 
            } 
} 
       
      break; 
   } 
 
return FALSE; 
} 
 
/***************************************************************************** 
 
   CenterWindow 
 
*****************************************************************************/ 
 
void CenterWindow(HWND hWnd) 
{ 
RECT  rc; 
int   x, 
      y; 
 
GetWindowRect(hWnd, &rc); 
 
x = GetSystemMetrics(SM_CXSCREEN)/2 - ((rc.right - rc.left)/2); 
y = GetSystemMetrics(SM_CYSCREEN)/2 - ((rc.bottom - rc.top)/2); 
 
//don't move the window if it's already in the right position 
if((x != rc.left) || (y != rc.top)) 
   MoveWindow(hWnd, x, y, rc.right - rc.left, rc.bottom - rc.top, TRUE); 
}