295 lines
7.4 KiB
C++
295 lines
7.4 KiB
C++
//+-------------------------------------------------------------------
|
|
// 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;
|
|
}
|