Share via


Ejemplo DCOM: muestra la llamada remota a un objeto COM

Actualización: noviembre 2007

El ejemplo DCOM muestra cómo llamar a un objeto COM implementado en un servicio de Windows desde múltiples clientes que se ejecutan en diferentes equipos. Se compone de tres partes:

  • DrawServ: servicio de Windows que implementa el objeto COM.

  • DrawServ: cliente que conecta con el objeto COM DrawServ.

  • DrawCtl: versión de control de ATLDraw.

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Todos los equipos deben ejecutar Windows 2000 o posterior para que este ejemplo funcione.

Para generar y ejecutar este ejemplo

  1. Abra la solución DCOM.sln.

  2. En el menú Generar, haga clic en Generar solución.

  3. Copie DrawServ.exe y ATLDraw.exe o DrawCtl.dll en cada equipo en el que desee ejecutar el ejemplo. Para registrar el servidor en cada equipo, ejecute DrawServ con el argumento de línea de comandos /RegServer o -RegServer (no se hace distinción entre mayúsculas y minúsculas). Por ejemplo:

    C:\ATL> DrawServ /RegServer 
    

    (ATL.DLL debe estar registrada para que esto funcione.) Deberá copiar el servidor en cada cliente para registrar el CLSID para el servidor y la biblioteca de tipos de servidor en cada cliente.

  4. Inicie el servicio en el servidor utilizando el icono Servicios del Panel de control.

  5. Usando la utilidad DCOMCNFG en cada cliente (ejecútela desde la línea de comandos), seleccione las propiedades de la clase DrawServ. En la ficha Ubicación, seleccione Ejecutar la aplicación en el siguiente equipo. Escriba el nombre del equipo en el que está ejecutando el objeto de servidor.

  6. Ejecute ATLDraw y seleccione Server Connect desde el menú de cada cliente. Dibuje en la ventana del cliente manteniendo presionado el botón primario del mouse (ratón) y arrastrando una línea. La línea dibujada debería aparecer en cada cliente conectado al mismo servidor. También puede utilizar la opción de menú Ver/Color para cambiar el color de cada cliente.

El ejemplo DrawServ no se registrará correctamente cuando su ruta de acceso contenga espacios. Una solución a este problema consiste en editar el correspondiente archivo .rgs y encerrar entre comillas simples todas las apariciones de %MODULE%. Por ejemplo, cambie la línea siguiente:

InprocServer32 = s %MODULE%

debería cambiarse por esta otra:

InprocServer32 = s '%MODULE%'

Palabras clave

En este ejemplo se utilizan las siguientes palabras clave:

AfxMessageBox; ASSERT_VALID; ATLASSERT; AtlUnadvise; BEGIN_COM_MAP; BEGIN_CONNECTION_POINT_MAP; BEGIN_INTERFACE_MAP; BEGIN_MSG_MAP; BEGIN_OBJECT_MAP; CComCoClass; CComControl; CComModule::GetClassObject; CComModule::GetLockCount; CComModule::Init; CComModule::RegisterServer; CComModule::Term; CComModule::Unlock; CComModule::UnregisterServer; CComModule::UpdateRegistryFromResource; CComObjectRoot; CDocument::OnNewDocument; CFrameWnd::AssertValid; CFrameWnd::DockControlBar; CFrameWnd::Dump; CFrameWnd::EnableDocking; CFrameWnd::OnCreate; CFrameWnd::PreCreateWindow; CloseServiceHandle; CoCreateInstance; CoCreateInstanceEx; CoInitialize; CoInitializeSecurity; COM_INTERFACE_ENTRY; COM_INTERFACE_ENTRY_IMPL; COM_INTERFACE_ENTRY_IMPL_IID; COM_INTERFACE_ENTRY2; CONNECTION_POINT_ENTRY; ConnectSink; ControlService; CoUninitialize; CProxyIDrawServ; CreatePen; CreateService; CStatusBar::SetIndicators; CToolBar::EnableDocking; CToolBar::LoadToolBar; CView::DoPreparePrinting; CView::OnLButtonUp(nFlags, point);; CView::PreCreateWindow; CWinApp::AddDocTemplate; CWinApp::LoadStdProfileSettings; CWinApp::ParseCommandLine; CWinApp::ProcessShellCommand; CWindow::SetCapture; DECLARE_GET_CONTROLLING_UNKNOWN; DECLARE_REGISTRY_RESOURCEID; DeleteObject; DeregisterEventSource; DisableThreadLibraryCalls; Disconnect; DisconnectSink; END_COM_MAP; END_CONNECTION_POINT_MAP; END_INTERFACE_MAP; END_OBJECT_MAP; GetModuleFileName; IConnectionPointContainerImpl; IDataObjectImpl; IDispatchImpl; IMPLEMENT_DYNCREATE; Install; INTERFACE_PART; IObjectSafetyImpl; IOleControlImpl; IOleInPlaceActiveObjectImpl; IOleInPlaceObjectWindowlessImpl; IOleObjectImpl; IPersistStorageImpl; IPersistStreamInitImpl; IProvideClassInfo2Impl; IQuickActivateImpl; ISupportErrorInfo; IViewObjectExImpl; IViewObjectExImpl::Draw; LineTo; LoadString; LogEvent; MESSAGE_HANDLER; MessageBox; MoveToEx; OBJECT_ENTRY; OffsetRect; OpenSCManager; OpenService; PostThreadMessage; PtInRect; QueryInterface; RegisterEventSource; ReleaseDC; ReportEvent; SelectObject; SetCapture; SetServiceStatus; SetWindowOrgEx; StartServiceCtrlDispatcher; Uninstall

Vea también

Otros recursos

Ejemplos de ATL