DCOM 範例:示範遠端呼叫 COM 物件
更新:2007 年 11 月
DCOM 範例示範如何從在不同的電腦上執行的多個用戶端中呼叫在 Windows 服務中實作的 COM 物件。它是由三個部分所組成:
DrawServ -- 能夠實作 COM 物件的 Windows 服務
ATLDraw -- 連接到 DrawServ COM 物件的用戶端
DrawCtl -- ATLDraw 的控制版本
安全性注意事項: |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要讓這個範例正常運作,所有的電腦都必須執行 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