191 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			191 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // ===========================================================================
 | ||
| // File: S S E R V E R . C P P
 | ||
| //
 | ||
| // 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.
 | ||
| //
 | ||
| // Description:
 | ||
| //
 | ||
| //  This is the server-portion of the SIMPLE Network OLE sample. This
 | ||
| // application implements the CLSID_SimpleObject class as a LocalServer.
 | ||
| // Instances of this class support a limited form of the IStream interface --
 | ||
| // calls to IStream::Read and IStream::Write will "succeed" (they do nothing),
 | ||
| // and calls on any other methods fail with E_NOTIMPL.
 | ||
| //
 | ||
| //  The purpose of this sample is to demonstrate what is minimally required
 | ||
| // to implement an object that can be used by clients (both those on the same
 | ||
| // machine using OLE and those using Network OLE across the network).
 | ||
| //
 | ||
| // Instructions:
 | ||
| //
 | ||
| //  To use this sample:
 | ||
| //   * build it using the NMAKE command. NMAKE will create SSERVER.EXE and
 | ||
| //     SCLIENT.EXE.
 | ||
| //   * edit the SSERVER.REG file to make the LocalServer32 key point to the
 | ||
| //     location of SSERVER.EXE, and run the INSTALL.BAT command (it simply
 | ||
| //     performs REGEDIT SSERVER.REG)
 | ||
| //   * run SSERVER.EXE. it should display the message "Waiting..."
 | ||
| //   * run SCLIENT.EXE on the same machine using no command-line arguments,
 | ||
| //     or from another machine using the machine-name (UNC or DNS) as the sole
 | ||
| //     command-line argument. it will connect to the server, perform some read
 | ||
| //     and write calls, and disconnect. both SSERVER.EXE and SCLIENT.EXE will
 | ||
| //     automatically terminate. both applications will display some status text.
 | ||
| //   * you can also run SCLIENT.EXE from a different machine without having first
 | ||
| //     run SSERVER.EXE on the machine. in this case, SSERVER.EXE will be launched
 | ||
| //     by OLE in the background and you will be able to watch the output of
 | ||
| //     SCLIENT.EXE but the output of SSERVER.EXE will be hidden.
 | ||
| //   * to examine the automatic launch-security features of Network OLE, try
 | ||
| //     using the '...\CLSID\{...}\LaunchPermission = Y' key commented out in
 | ||
| //     the SSERVER.REG file and reinstalling it. by setting different read-access
 | ||
| //     privileges on this key (using the Security/Permissions... dialog in the
 | ||
| //     REGEDT32 registry tool built into the system) you can allow other
 | ||
| //     users to run the SCLIENT.EXE program from their accounts.
 | ||
| //
 | ||
| // Copyright 1996 Microsoft Corporation.  All Rights Reserved.
 | ||
| // ===========================================================================
 | ||
| 
 | ||
| // %%Includes: ---------------------------------------------------------------
 | ||
| #define INITGUID
 | ||
| #include <mdcommon.hxx>
 | ||
| 
 | ||
| // %%Globals: ----------------------------------------------------------------
 | ||
| HANDLE          hevtDone;
 | ||
| 
 | ||
| // {BA4E57F0-FAB6-11cf-9D1A-00AA00A70D51}
 | ||
| //extern const GUID CLSID_MDCOM;
 | ||
| //DEFINE_GUID(CLSID_MDCOM, 0xba4e57f0, 0xfab6, 0x11cf, 0x9d, 0x1a, 0x0, 0xaa, 0x0, 0xa7, 0xd, 0x51);
 | ||
| 
 | ||
| STDAPI DllRegisterServer(void);
 | ||
| STDAPI DllUnregisterServer(void);
 | ||
| // ---------------------------------------------------------------------------
 | ||
| // %%Function: Message
 | ||
| //
 | ||
| //  Formats and displays a message to the console.
 | ||
| // ---------------------------------------------------------------------------
 | ||
|  void
 | ||
| Message(LPTSTR szPrefix, HRESULT hr)
 | ||
| {
 | ||
|     LPTSTR   szMessage;
 | ||
| 
 | ||
|     if (hr == S_OK)
 | ||
|         {
 | ||
|         printf(szPrefix);
 | ||
|         printf(TEXT("\n"));
 | ||
|         return;
 | ||
|         }
 | ||
| 
 | ||
|     if (HRESULT_FACILITY(hr) == FACILITY_WINDOWS)
 | ||
|         hr = HRESULT_CODE(hr);
 | ||
| 
 | ||
|     FormatMessage(
 | ||
|         FORMAT_MESSAGE_ALLOCATE_BUFFER |
 | ||
|         FORMAT_MESSAGE_FROM_SYSTEM,
 | ||
|         NULL,
 | ||
|         hr,
 | ||
|         MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), //The user default language
 | ||
|         (LPTSTR)&szMessage,
 | ||
|         0,
 | ||
|         NULL );
 | ||
| 
 | ||
|     printf(TEXT("%s: %s(%lx)\n"), szPrefix, szMessage, hr);
 | ||
| 
 | ||
|     LocalFree(szMessage);
 | ||
| }  // Message
 | ||
| 
 | ||
| // ---------------------------------------------------------------------------
 | ||
| // %%Function: main
 | ||
| // ---------------------------------------------------------------------------
 | ||
|  void __cdecl
 | ||
| main( INT    cArgs,
 | ||
|       char * pArgs[] )
 | ||
| {
 | ||
|     HRESULT hr;
 | ||
|     DWORD   dwRegister;
 | ||
| 
 | ||
|     if (cArgs >= 2) {
 | ||
|         if ((*pArgs[1] == 'R') || (*pArgs[1] == 'r')) {
 | ||
|             if (FAILED(DllRegisterServer())) {
 | ||
|                 printf("Failed to Register Server\n");
 | ||
|             }
 | ||
|             else {
 | ||
|                 printf("Server Registered Successfully\n");
 | ||
|             }
 | ||
|         }
 | ||
| 
 | ||
|         else if ((*pArgs[1] == 'U') || (*pArgs[1] == 'u')) {
 | ||
|             if (FAILED(DllUnregisterServer())) {
 | ||
|                 printf("Failed to UnRegister Server\n");
 | ||
|             }
 | ||
|             else {
 | ||
|                 printf("Server UnRegistered Successfully\n");
 | ||
|             }
 | ||
|         }
 | ||
|         else {
 | ||
|             printf("Invalid parameter");
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     // create the thread which is signaled when the instance is deleted
 | ||
|     hevtDone = CreateEvent(NULL, FALSE, FALSE, NULL);
 | ||
|     if (hevtDone == NULL)
 | ||
|         {
 | ||
|         hr = HRESULT_FROM_WIN32(GetLastError());
 | ||
|         Message(TEXT("Server: CreateEvent"), hr);
 | ||
|         exit(hr);
 | ||
|         }
 | ||
| /*
 | ||
|     // initialize COM for free-threading
 | ||
|     hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
 | ||
|     if (FAILED(hr))
 | ||
|         {
 | ||
|         Message(TEXT("Server: CoInitializeEx"), hr);
 | ||
|         exit(hr);
 | ||
|         }
 | ||
|     CMDCOMSrvFactory   *pMDClassFactory = new CMDCOMSrvFactory;
 | ||
|     // register the class-object with OLE
 | ||
|     hr = CoRegisterClassObject(CLSID_MDCOM, pMDClassFactory,
 | ||
|         CLSCTX_SERVER, REGCLS_MULTIPLEUSE, &dwRegister);
 | ||
|     if (FAILED(hr))
 | ||
|         {
 | ||
|         Message(TEXT("Server: CoRegisterClassObject"), hr);
 | ||
|         exit(hr);
 | ||
|         }
 | ||
| */
 | ||
| 
 | ||
|     BOOL bReturn = InitComMetadata(TRUE);
 | ||
|     if (!bReturn) {
 | ||
|         exit(bReturn);
 | ||
|     }
 | ||
| 
 | ||
|     HRESULT hRes;
 | ||
|     IMDCOM * pcCom = NULL;
 | ||
| 
 | ||
|     hRes = CoCreateInstance(CLSID_MDCOMEXE, NULL, CLSCTX_SERVER, IID_IMDCOM, (void**) &pcCom);
 | ||
| 
 | ||
|     hRes = pcCom->ComMDInitialize();
 | ||
|     printf("MDInitialize(); Returns %X\n", hRes);
 | ||
| 
 | ||
|     hRes = pcCom->ComMDTerminate(FALSE);
 | ||
|     printf("MDTerminate(FALSE); Returns %X\n", hRes);
 | ||
| 
 | ||
|     pcCom->Release();
 | ||
| 
 | ||
|     Message(TEXT("Server: Waiting"), S_OK);
 | ||
| 
 | ||
|     // wait until an object is created and deleted.
 | ||
|     WaitForSingleObject(hevtDone, 500000);
 | ||
| 
 | ||
|     CloseHandle(hevtDone);
 | ||
| 
 | ||
| //    CoUninitialize();
 | ||
|     bReturn = TerminateComMetadata();
 | ||
| 
 | ||
|     Message(TEXT("Server: Done"), S_OK);
 | ||
|     Sleep(5000);
 | ||
| }  // main
 | ||
| 
 | ||
| // EOF =======================================================================
 | ||
| 
 | ||
|  |