454 lines
13 KiB
C++
454 lines
13 KiB
C++
|
//**********************************************************************
|
||
|
// File name: simpsvr.cpp
|
||
|
//
|
||
|
// Main source file for the simple OLE 2.0 server
|
||
|
//
|
||
|
// Functions:
|
||
|
//
|
||
|
// WinMain - Program entry point
|
||
|
// MainWndProc - Processes messages for the frame window
|
||
|
// About - Processes messages for the about dialog
|
||
|
// DocWndProc - Processes messages for the doc window
|
||
|
//
|
||
|
// Copyright (c) 1993 Microsoft Corporation. All rights reserved.
|
||
|
//**********************************************************************
|
||
|
|
||
|
#include "pre.h"
|
||
|
#include "obj.h"
|
||
|
#include "app.h"
|
||
|
#include "doc.h"
|
||
|
#include "icf.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <testmess.h>
|
||
|
|
||
|
#define MEASUREITEMWIDTH 40
|
||
|
#define MEASUREITEMHEIGHT 40
|
||
|
|
||
|
// This line is needed for the debug utilities in OLE2UI
|
||
|
extern "C" {
|
||
|
OLEDBGDATA_MAIN(TEXT("SIMPSVR"))
|
||
|
}
|
||
|
|
||
|
BOOL fBeVerbose = FALSE;
|
||
|
extern "C"
|
||
|
void TestDebugOut(LPSTR psz)
|
||
|
{
|
||
|
if (fBeVerbose)
|
||
|
{
|
||
|
OutputDebugStringA(psz);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CSimpSvrApp FAR * lpCSimpSvrApp;
|
||
|
CClassFactory FAR * lpClassFactory;
|
||
|
|
||
|
//**********************************************************************
|
||
|
//
|
||
|
// WinMain
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// Program entry point
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// HANDLE hInstance - Instance handle for this instance
|
||
|
//
|
||
|
// HANDLE hPrevInstance - Instance handle for the last instance
|
||
|
//
|
||
|
// LPSTR lpCmdLine - Pointer to the command line
|
||
|
//
|
||
|
// int nCmdShow - Window State
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// msg.wParam
|
||
|
//
|
||
|
// Function Calls:
|
||
|
// Function Location
|
||
|
//
|
||
|
// CSimpSvrApp::CSimpSvrApp APP.CPP
|
||
|
// CSimpSvrApp::fInitApplication APP.CPP
|
||
|
// CSimpSvrApp::fInitInstance APP.CPP
|
||
|
// CSimpSvrApp::HandleAccelerators APP.CPP
|
||
|
// CSimpSvrApp::~CSimpSvrApp APP.CPP
|
||
|
// OleUIInitialize OLE2UI
|
||
|
// OleUIUninitialize OLE2UI
|
||
|
// GetMessage Windows API
|
||
|
// TranslateMessage Windows API
|
||
|
// DispatchMessage Windows API
|
||
|
//
|
||
|
//
|
||
|
//********************************************************************
|
||
|
|
||
|
int PASCAL WinMain
|
||
|
#ifdef WIN32
|
||
|
(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||
|
#else
|
||
|
(HANDLE hInstance, HANDLE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
|
||
|
#endif
|
||
|
{
|
||
|
MSG msg;
|
||
|
fBeVerbose = GetProfileInt("OLEUTEST","BeVerbose",0);
|
||
|
|
||
|
if(fBeVerbose == 0)
|
||
|
{
|
||
|
fBeVerbose = GetProfileInt("OLEUTEST","simpsvr",0);
|
||
|
}
|
||
|
|
||
|
TestDebugOut(TEXT("Starting Simpsvr.....\n"));
|
||
|
|
||
|
// recommended size for OLE apps
|
||
|
SetMessageQueue(96);
|
||
|
|
||
|
lpCSimpSvrApp = new CSimpSvrApp;
|
||
|
|
||
|
if (!lpCSimpSvrApp)
|
||
|
{
|
||
|
/* memory allocation error. We cannot carry on.
|
||
|
*/
|
||
|
MessageBox(NULL, TEXT("Out of Memory"), TEXT("SimpSvr"),
|
||
|
MB_SYSTEMMODAL | MB_ICONHAND);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
lpCSimpSvrApp->AddRef(); // need the app ref. count at 1 to hold the
|
||
|
// app alive.
|
||
|
|
||
|
lpCSimpSvrApp->ParseCmdLine(lpCmdLine);
|
||
|
|
||
|
// app initialization
|
||
|
if (!hPrevInstance)
|
||
|
if (!lpCSimpSvrApp->fInitApplication(hInstance))
|
||
|
{
|
||
|
// We need to release CSimpSvrApp before we go away
|
||
|
lpCSimpSvrApp->Release();
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
// instance initialization
|
||
|
if (!lpCSimpSvrApp->fInitInstance(hInstance, nCmdShow, lpClassFactory))
|
||
|
{
|
||
|
// We need to release CSimpSvrApp before we go away
|
||
|
lpCSimpSvrApp->Release();
|
||
|
return (FALSE);
|
||
|
}
|
||
|
|
||
|
/* Initialization required for OLE 2 UI library. This call is
|
||
|
** needed ONLY if we are using the static link version of the UI
|
||
|
** library. If we are using the DLL version, we should NOT call
|
||
|
** this function in our application.
|
||
|
** The 3rd and 4th parameters passed the OleUIInitialize
|
||
|
** function are strings which are used to name two custom
|
||
|
** control classes used by the OLE2UI library. These strings
|
||
|
** must be unique for each application that uses the OLE2UI
|
||
|
** library. These strings are typically composed by combining
|
||
|
** the APPNAME with a suffix in order to be unique for a
|
||
|
** particular application. The special symbols "SZCLASSICONBOX"
|
||
|
** and "SZCLASSRESULTIMAGE" are used define these strings. These
|
||
|
** symbols must be defined in a header file that is included
|
||
|
** both in this file AND the resource file that included the
|
||
|
** "OLE2UI.RC" resoure file. These symbols should be used in the
|
||
|
** call to OleUIInitialize and are referenced in the INSOBJ.DLG
|
||
|
** and PASTESPL.DLG resouce files of the OLE2UI library.
|
||
|
*/
|
||
|
if (!OleUIInitialize(hInstance, hPrevInstance, TEXT(SZCLASSICONBOX),
|
||
|
TEXT(SZCLASSRESULTIMAGE)))
|
||
|
{
|
||
|
OleDbgOut(TEXT("Could not initialize OLEUI library\n"));
|
||
|
|
||
|
// We need to release CSimpSvrApp before we go away
|
||
|
lpCSimpSvrApp->Release();
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
// message loop
|
||
|
while (GetMessage(&msg, NULL, NULL, NULL))
|
||
|
{
|
||
|
// Is this an accelerator for us? -- Remember that this server
|
||
|
// only has one window and only processes one object at a time.
|
||
|
if (TranslateAccelerator(lpCSimpSvrApp->GethAppWnd(),
|
||
|
lpCSimpSvrApp->m_hAccel, &msg))
|
||
|
{
|
||
|
// Yes -- so we can loop for the next message
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (lpCSimpSvrApp->IsInPlaceActive())
|
||
|
{
|
||
|
// Only key messages need to be sent to OleTranslateAccelerator.
|
||
|
// Any other message would result in an extra FAR call to occur
|
||
|
// for that message processing...
|
||
|
|
||
|
if ((msg.message >= WM_KEYFIRST) && (msg.message <= WM_KEYLAST))
|
||
|
{
|
||
|
// OleTranslateAccelerator MUST be called, even though this
|
||
|
// application does not have an accelerator table. This has
|
||
|
// to be done in order for the mneumonics for the top level
|
||
|
// menu items to work properly.
|
||
|
|
||
|
if (OleTranslateAccelerator(
|
||
|
lpCSimpSvrApp->GetDoc()->GetObj()->GetInPlaceFrame(),
|
||
|
lpCSimpSvrApp->GetDoc()->GetObj()->GetFrameInfo(),
|
||
|
&msg) == NOERROR)
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
TranslateMessage(&msg); /* Translates virtual key codes */
|
||
|
DispatchMessage(&msg); /* Dispatches message to window */
|
||
|
}
|
||
|
|
||
|
// De-initialization for UI libraries. Just like OleUIInitialize, this
|
||
|
// funciton is needed ONLY if we are using the static link version of the
|
||
|
// OLE UI library.
|
||
|
OleUIUninitialize();
|
||
|
|
||
|
return (msg.wParam); /* Returns the value from PostQuitMessage */
|
||
|
}
|
||
|
|
||
|
|
||
|
//**********************************************************************
|
||
|
//
|
||
|
// MainWndProc
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// Processes messages for the main frame window
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// HWND hWnd - Window handle for frame window
|
||
|
//
|
||
|
// UINT message - Message value
|
||
|
//
|
||
|
// WPARAM wParam - Message info
|
||
|
//
|
||
|
// LPARAM lParam - Message info
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// long
|
||
|
//
|
||
|
// Function Calls:
|
||
|
// Function Location
|
||
|
//
|
||
|
// CSimpSvrApp::lCommandHandler APP.CPP
|
||
|
// CSimpSvrApp::DestroyDocs APP.CPP
|
||
|
// CSimpSvrApp::lCreateDoc APP.CPP
|
||
|
// CSimpSvrApp::lSizeHandler APP.CPP
|
||
|
// CGameDoc::lAddVerbs DOC.CPP
|
||
|
// PostQuitMessage Windows API
|
||
|
// DefWindowProc Windows API
|
||
|
//
|
||
|
//
|
||
|
//********************************************************************
|
||
|
|
||
|
LRESULT FAR PASCAL EXPORT MainWndProc(HWND hWnd,UINT message,WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_CLOSE:
|
||
|
TestDebugOut(TEXT("*** In WM_CLOSE *** \r\n"));
|
||
|
|
||
|
// if there is still a document
|
||
|
if (lpCSimpSvrApp->GetDoc())
|
||
|
|
||
|
// if there is still an object within a document
|
||
|
if (lpCSimpSvrApp->GetDoc()->GetObj())
|
||
|
// this case occurs if there is still
|
||
|
// an outstanding Ref count on the object
|
||
|
// when the app is trying to go away.
|
||
|
// typically this case will occur in
|
||
|
// the "open" editing mode.
|
||
|
//
|
||
|
// Close the document
|
||
|
lpCSimpSvrApp->GetDoc()->Close();
|
||
|
|
||
|
// hide the app window
|
||
|
lpCSimpSvrApp->HideAppWnd();
|
||
|
|
||
|
// if we were started by ole, unregister the class factory,
|
||
|
// otherwise remove the ref count on our dummy OLE object
|
||
|
if (lpCSimpSvrApp->IsStartedByOle())
|
||
|
{
|
||
|
if (CoRevokeClassObject(lpCSimpSvrApp->GetRegisterClass())
|
||
|
!= S_OK)
|
||
|
TestDebugOut(TEXT("Fail in CoRevokeClassObject\n"));
|
||
|
}
|
||
|
else
|
||
|
lpCSimpSvrApp->GetOleObject()->Release();
|
||
|
|
||
|
lpCSimpSvrApp->Release(); // This should close the app.
|
||
|
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND: // message: command from application menu
|
||
|
return lpCSimpSvrApp->lCommandHandler(hWnd, message,
|
||
|
wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_CREATE:
|
||
|
return lpCSimpSvrApp->lCreateDoc(hWnd, message, wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_DESTROY: // message: window being destroyed
|
||
|
PostQuitMessage(0);
|
||
|
break;
|
||
|
|
||
|
case WM_MEASUREITEM:
|
||
|
((LPMEASUREITEMSTRUCT)lParam)->itemWidth = MEASUREITEMWIDTH;
|
||
|
((LPMEASUREITEMSTRUCT)lParam)->itemHeight = MEASUREITEMHEIGHT;
|
||
|
break;
|
||
|
|
||
|
case WM_DRAWITEM:
|
||
|
lpCSimpSvrApp->HandleDrawItem((LPDRAWITEMSTRUCT) lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_SIZE:
|
||
|
return lpCSimpSvrApp->lSizeHandler(hWnd, message, wParam, lParam);
|
||
|
|
||
|
default: // Passes it on if unproccessed
|
||
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||
|
}
|
||
|
return (NULL);
|
||
|
}
|
||
|
|
||
|
|
||
|
//**********************************************************************
|
||
|
//
|
||
|
// About
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// Processes dialog box messages
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// HWND hWnd - Window handle for dialog box
|
||
|
//
|
||
|
// UINT message - Message value
|
||
|
//
|
||
|
// WPARAM wParam - Message info
|
||
|
//
|
||
|
// LPARAM lParam - Message info
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
//
|
||
|
// Function Calls:
|
||
|
// Function Location
|
||
|
//
|
||
|
// EndDialog Windows API
|
||
|
//
|
||
|
//
|
||
|
//********************************************************************
|
||
|
|
||
|
INT_PTR
|
||
|
#ifdef WIN32
|
||
|
CALLBACK
|
||
|
#else
|
||
|
FAR PASCAL EXPORT
|
||
|
#endif
|
||
|
About(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
|
||
|
{
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_INITDIALOG: /* message: initialize dialog box */
|
||
|
return (TRUE);
|
||
|
|
||
|
case WM_COMMAND: /* message: received a command */
|
||
|
if (wParam == IDOK /* "OK" box selected? */
|
||
|
|| wParam == IDCANCEL) /* System menu close command? */
|
||
|
{
|
||
|
EndDialog(hDlg, TRUE); /* Exits the dialog box */
|
||
|
return (TRUE);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return (FALSE); /* Didn't process a message */
|
||
|
}
|
||
|
|
||
|
//**********************************************************************
|
||
|
//
|
||
|
// DocWndProc
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
// Processes dialog box messages
|
||
|
//
|
||
|
// Parameters:
|
||
|
//
|
||
|
// HWND hWnd - Window handle for doc window
|
||
|
//
|
||
|
// UINT message - Message value
|
||
|
//
|
||
|
// WPARAM wParam - Message info
|
||
|
//
|
||
|
// LPARAM lParam - Message info
|
||
|
//
|
||
|
// Return Value:
|
||
|
//
|
||
|
// Function Calls:
|
||
|
// Function Location
|
||
|
//
|
||
|
// CSimpSvrApp::PaintApp APP.CPP
|
||
|
// BeginPaint Windows API
|
||
|
// EndPaint Windows API
|
||
|
// DefWindowProc Windows API
|
||
|
// IOleObject::QueryInterface Object
|
||
|
// IOleInPlaceObject::UIDeactivate Object
|
||
|
// IOleObject::DoVerb Object
|
||
|
// IOleInPlaceObject::Release Object
|
||
|
//
|
||
|
//
|
||
|
//********************************************************************
|
||
|
|
||
|
LRESULT FAR PASCAL EXPORT DocWndProc(HWND hWnd,UINT message,WPARAM wParam,
|
||
|
LPARAM lParam)
|
||
|
{
|
||
|
HDC hDC;
|
||
|
PAINTSTRUCT ps;
|
||
|
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_COMMAND: // message: command from application menu
|
||
|
return lpCSimpSvrApp->lCommandHandler(hWnd, message,
|
||
|
wParam, lParam);
|
||
|
break;
|
||
|
|
||
|
case WM_PAINT:
|
||
|
hDC = BeginPaint(hWnd, &ps);
|
||
|
|
||
|
// tell the app class to paint itself
|
||
|
if (lpCSimpSvrApp)
|
||
|
lpCSimpSvrApp->PaintApp (hDC);
|
||
|
|
||
|
EndPaint(hWnd, &ps);
|
||
|
break;
|
||
|
|
||
|
case WM_MENUSELECT:
|
||
|
lpCSimpSvrApp->SetStatusText();
|
||
|
break;
|
||
|
|
||
|
case WM_MEASUREITEM:
|
||
|
((LPMEASUREITEMSTRUCT)lParam)->itemWidth = MEASUREITEMWIDTH;
|
||
|
((LPMEASUREITEMSTRUCT)lParam)->itemHeight = MEASUREITEMHEIGHT;
|
||
|
break;
|
||
|
|
||
|
case WM_DRAWITEM:
|
||
|
lpCSimpSvrApp->HandleDrawItem((LPDRAWITEMSTRUCT) lParam);
|
||
|
break;
|
||
|
|
||
|
|
||
|
default: /* Passes it on if unproccessed */
|
||
|
return (DefWindowProc(hWnd, message, wParam, lParam));
|
||
|
}
|
||
|
return (NULL);
|
||
|
}
|