//+------------------------------------------------------------------- // 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 #include #include "testsrv.hxx" #include 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; }