|
|
//+-------------------------------------------------------------------
// File: csrvapp.cxx
//
// Contents: Implementation of CTestServerApp
//
// Classes: CTestServerApp
//
// History: 17-Dec-92 DeanE Created
// 31-Dec-93 ErikGav Chicago port
// 25-Apr-95 BruceMa CoRevokeClassObject before shutting down
//---------------------------------------------------------------------
#pragma optimize("",off)
#include <windows.h>
#include <ole2.h>
#include "testsrv.hxx"
#include <except.hxx>
void ProcessCmdLine(LPSTR, BOOL *);
// Used to send a quit message
extern HWND g_hwndMain;
//+--------------------------------------------------------------
// Function: CTestServerApp::CTestServerApp
//
// Synopsis: Constructor - initialize members
//
// Parameters: None
//
// Returns: None
//
// History: 17-Dec-92 DeanE Created
//---------------------------------------------------------------
CTestServerApp::CTestServerApp() { _pteClassFactory = NULL; _dwRegId = 0; _fRegistered = FALSE; _fInitialized = FALSE; _fEmbedded = TRUE; _cEmbeddedObjs = 0; }
//+--------------------------------------------------------------
// Function: CTestServerApp::~CTestServerApp
//
// Synopsis: Insure pointers are free - note this is mainly for
// error-checking.
//
// Parameters: None
//
// Returns: None
//
// History: 17-Dec-92 DeanE Created
//---------------------------------------------------------------
CTestServerApp::~CTestServerApp() { Win4Assert(_pteClassFactory == NULL && "Class factory should have been released"); }
//+--------------------------------------------------------------
// Function: CTestServerApp::InitApp
//
// Synopsis: Initialize this instance of the app.
//
// Parameters: [lpszCmdline] - Command line of the application.
//
// Returns: S_OK if everything was initialized, or an error if not.
//
// History: 17-Dec-92 DeanE Created
//
// Notes: If this does not return, the CloseApp method should
// still be called for proper cleanup.
//---------------------------------------------------------------
SCODE CTestServerApp::InitApp(LPSTR lpszCmdline) { SCODE sc;
// Check OLE version running
// BUGBUG - NYI by OLE
// Bail out if we are not running with an acceptable version of OLE
// Process Command Line arguments
ProcessCmdLine(lpszCmdline, &_fEmbedded);
// Look up the thread mode from the win.ini file.
DWORD thread_mode; TCHAR buffer[80]; int len;
len = GetProfileString( TEXT("TestSrv"), TEXT("ThreadMode"), TEXT("MultiThreaded"), buffer, sizeof(buffer) / sizeof(TCHAR));
if (lstrcmp(buffer, TEXT("ApartmentThreaded")) == 0) { thread_mode = COINIT_APARTMENTTHREADED; sc = CoInitialize(NULL); } else { #ifdef MULTI_THREADING
thread_mode = COINIT_MULTITHREADED; sc = CoInitializeEx(NULL, thread_mode); #else
// multi-threading not supported
sc = E_INVALIDARG; #endif
}
if (S_OK == sc) { _fInitialized = TRUE; } else { return(sc); }
// Create the applications class factory - note that we have to free
// at a later time
_pteClassFactory = CTestEmbedCF::Create(this); if (NULL == _pteClassFactory) { return(E_ABORT); }
// Register the class with OLE
sc = CoRegisterClassObject( CLSID_TestEmbed, _pteClassFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &_dwRegId); if (S_OK == sc) { _fRegistered = TRUE; }
return(sc); }
//+--------------------------------------------------------------
// Function: CTestServerApp::CloseApp
//
// Synopsis: Clean up resources this instance of the app is using.
//
// Parameters: None
//
// Returns: S_OK if everything was cleaned up, or an error if not.
//
// History: 17-Dec-92 DeanE Created
//---------------------------------------------------------------
SCODE CTestServerApp::CloseApp() { // Release this apps class factory, and insure the returned count is 0
if (NULL != _pteClassFactory) { if (0 == _pteClassFactory->Release()) { _pteClassFactory = NULL; } else { // BUGBUG - Log error
} }
// Uninitialize OLE only if OleInitialize succeeded
if (TRUE == _fInitialized) { CoUninitialize(); } return(S_OK); }
//+--------------------------------------------------------------
// Function: CTestServerApp::GetEmbeddedFlag
//
// Synopsis: Returns TRUE if app was started for an embedded object,
// FALSE if standalone.
//
// Parameters: None
//
// Returns: BOOL (_fEmbedded)
//
// History: 17-Dec-92 DeanE Created
//
// Notes: BUGBUG - This should be an inline method
//---------------------------------------------------------------
CTestServerApp::GetEmbeddedFlag() { return(_fEmbedded); }
//+--------------------------------------------------------------
// Function: CTestServerApp::IncEmbeddedCount
//
// Synopsis: Increments the count of embedded objects the server
// has open.
//
// Parameters: None
//
// Returns: ULONG (_cEmbeddedObjs)
//
// History: 17-Dec-92 DeanE Created
//
// Notes: BUGBUG - This should be an inline method
//---------------------------------------------------------------
ULONG CTestServerApp::IncEmbeddedCount() { return(++_cEmbeddedObjs); }
//+--------------------------------------------------------------
// Function: CTestServerApp::DecEmbeddedCount
//
// Synopsis: Decrements the count of embedded objects the server
// has open. If 0 are left and we were running for an
// embedded object(s), shut down.
//
// Parameters: None
//
// Returns: ULONG (_cEmbeddedObjs)
//
// History: 17-Dec-92 DeanE Created
//
//---------------------------------------------------------------
ULONG CTestServerApp::DecEmbeddedCount() { if ((0 == --_cEmbeddedObjs) && _fEmbedded) { // Revoke the class object, if registered
if (TRUE == _fRegistered) { CoRevokeClassObject(_dwRegId); // OutputDebugStringA("Revoking class object now!\n");
}
// Shut down the app
SendMessage(g_hwndMain, WM_USER, 0xFFFFFFFF, 0xFFFFFFFF); }
return(_cEmbeddedObjs); }
//+--------------------------------------------------------------
// Function: ProcessCmdline
//
// Synopsis: Checks the cmd line parameters, in particular for
// '/Embedding' or '-Embedding'.
//
// Parameters: [lpszCmdLine] - Command line buffer.
// [pfEmbedded] - Flag should be set to true if we get
// the '/Embedding' switch.
//
// Returns: void
//
// History: 25-Nov-92 DeanE Created
//
// Notes: Only two valid commandlines for this program:
// (1) -Embedding when started by OLE or (2) Null
// string if started from the command line.
//---------------------------------------------------------------
void ProcessCmdLine(LPSTR lpszCmdline, BOOL *pfEmbedded) { if (lpszCmdline[0] == 0) { *pfEmbedded = FALSE; return; }
if (strcmp(lpszCmdline, "-Embedding") == 0) { *pfEmbedded = TRUE; return; }
Win4Assert(!"testsrv received an invalid command line!"); *pfEmbedded = FALSE;
return; }
|