更新: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 或更高版本才能運行此示例。
生成並運行此示例
-
打開解決方案 DCOM.sln。
-
在“生成”菜單中,單擊“生成解決方案”。
-
將 DrawServ.exe 和 ATLDraw.exe 或 DrawCtl.dll 複製到要在其上運行此示例的每臺計算機。通過運行帶命令行參數 /RegServer 或 -RegServer(這不區分大小寫)的 DrawServ,在每臺計算機上註冊服務器。例如:
C:/ATL> DrawServ /RegServer
(必須註冊 ATL.DLL 才能正常工作。) 必須將服務器複製到每個客戶端以便在每個客戶端上註冊服務器的 CLSID 和服務器類型庫。
-
通過使用“控制面板”中的“服務”圖標,啓動服務器上的服務。
-
在每個客戶端,使用 DCOMCNFG 實用工具(從命令行運行它)選擇 DrawServ 類的“屬性”。從“位置”選項卡中選擇“在下列計算機上運行應用程序”。輸入要在其上運行服務器對象的計算機的名稱。
-
運行 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