DCOM-Beispiel: Demonstriert den Remoteaufruf eines COM-Objekts
Aktualisiert: November 2007
Das DCOM-Beispiel demonstriert, wie ein COM-Objekt, das in einem Windows-Dienst implementiert ist, von mehreren, auf verschiedenen Computern laufenden Clients aus aufgerufen wird. Es besteht aus drei Teilen:
DrawServ – Der Windows-Dienst, der das COM-Objekt implementiert.
ATLDraw – Der Client, der eine Verbindung zum COM-Objekt von DrawServ herstellt.
DrawCtl – Eine Steuerelementversion von ATLDraw.
Sicherheitshinweis: |
---|
Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird. |
So rufen Sie Beispiele und Anweisungen für ihre Installation ab
Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.
Weitere Informationen finden Sie unter Suchen von Beispieldateien.
Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.
Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.
Erstellen und Ausführen des Beispiels
Dieses Beispiel funktioniert nur, wenn auf allen Computern Windows 2000 oder höher ausgeführt wird.
So erstellen Sie das Beispiel und führen es aus
Öffnen Sie die Projektmappe DCOM.sln.
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Kopieren Sie die Datei DrawServ.exe und ATLDraw.exe oder DrawCtl.dll auf jeden Computer, auf dem das Beispiel ausgeführt werden soll. Registrieren Sie den Server auf jedem Computer, indem Sie DrawServ mit dem Befehlszeilenargument /RegServer oder -RegServer (ohne Berücksichtigung von Groß- und Kleinschreibung) ausführen. Beispiel:
C:\ATL> DrawServ /RegServer
(Dies funktioniert nur, wenn ATL.DLL registriert ist.) Der Server muss auf jeden Client kopiert werden, um dort die CLSID für den Server und die Typbibliothek des Server zu registrieren.
Starten Sie den Dienst auf dem Server mithilfe des Symbols Dienste in der Systemsteuerung.
Wählen Sie die Eigenschaften der DrawServ-Klasse aus, indem Sie auf jedem Client DCOMCNFG (in der Befehlszeile) ausführen. Wählen Sie auf der Registerkarte Speicherort die Option Anwendung auf dem folgenden Computer ausführen. Geben Sie den Namen des Computers ein, auf dem das Serverobjekt ausgeführt wird.
Führen Sie ATLDraw aus, und wählen Sie aus dem Menü der einzelnen Clients Server verbinden aus. Zeichnen Sie im Clientfenster, indem Sie die linke Maustaste gedrückt halten und eine Linie ziehen. Die gezeichnete Linie sollte auf jedem Client angezeigt werden, der mit demselben Server verbunden ist. Darüber hinaus können Sie mit der Menüoption Ansicht/Farbe die Farbe der einzelnen Clients ändern.
Das DrawServ-Beispiel wird nicht ordnungsgemäß registriert, wenn der Pfad Leerzeichen enthält. Eine Möglichkeit zur Lösung dieses Problems besteht darin, die entsprechende RGS-Datei zu bearbeiten und alle Vorkommen von %MODULE% in einfache Anführungszeichen zu setzen. Ändern Sie beispielsweise eine Zeile mit folgendem Inhalt:
InprocServer32 = s %MODULE%
Das Ergebnis sähe wie folgt aus:
InprocServer32 = s '%MODULE%'
Schlüsselwörter
In diesem Beispiel werden die folgenden Schlüsselwörter verwendet:
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