DCOM 示例:演示如何远程调用 COM 对象

更新:2007 年 11 月

DCOM 示例说明如何从运行于不同计算机上的多个客户端调用在 Windows 服务中实现的 COM 对象。它由三部分组成:

  • DrawServ — 实现 COM 对象的 Windows 服务。

  • ATLDraw — 连接到 DrawServ COM 对象的客户端。

  • DrawCtl — ATLDraw 的管理版本。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

所有计算机必须运行 Windows 2000 或更高版本才能运行此示例。

生成并运行此示例

  1. 打开解决方案 DCOM.sln。

  2. 在“生成”菜单中,单击“生成解决方案”。

  3. 将 DrawServ.exe 和 ATLDraw.exe 或 DrawCtl.dll 复制到要在其上运行此示例的每台计算机。通过运行带命令行参数 /RegServer 或 -RegServer(这不区分大小写)的 DrawServ,在每台计算机上注册服务器。例如:

    C:\ATL> DrawServ /RegServer 
    

    (必须注册 ATL.DLL 才能正常工作。) 必须将服务器复制到每个客户端以便在每个客户端上注册服务器的 CLSID 和服务器类型库。

  4. 通过使用“控制面板”中的“服务”图标,启动服务器上的服务。

  5. 在每个客户端,使用 DCOMCNFG 实用工具(从命令行运行它)选择 DrawServ 类的“属性”。从“位置”选项卡中选择“在下列计算机上运行应用程序”。输入要在其上运行服务器对象的计算机的名称。

  6. 运行 ATLDraw 并从每个客户端的菜单中选择“服务器连接”。通过按住鼠标左键并沿直线拖动,在客户端窗口中绘制线条。绘制的线条应显示在连接到同一服务器的每个客户端上。也可以使用“视图”中的“颜色”菜单选项来更改每个客户端的颜色。

如果 DrawServ 示例的路径包含空格,它将不能正确注册。解决此问题的一个方法是编辑相应的 .rgs 文件,并在 %MODULE% 的所有匹配项两侧添加单引号。例如,将包含以下内容的一行:

InprocServer32 = s %MODULE%

更改为下面的内容:

InprocServer32 = s '%MODULE%'

关键字

此示例使用以下关键字:

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

请参见

其他资源

ATL 示例