DCOM, exemple : illustre l'appel d'un objet COM à distance
Mise à jour : novembre 2007
L'exemple DCOM montre comment appeler un objet COM implémenté dans un service Windows à partir de plusieurs clients exécutés sur des ordinateurs différents. Il comprend trois parties :
DrawServ — service Windows qui implémente l'objet COM.
ATLDraw — client qui se connecte à l'objet COM DrawServ.
DrawCtl — version du contrôle d'ATLDraw.
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont copiés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont accessibles en ligne.
Génération et exécution de l'exemple
Pour que cet exemple puisse fonctionner, tous les ordinateurs doivent exécuter Windows 2000 ou une version ultérieure.
Pour générer et exécuter l'exemple
Ouvrez la solution DCOM.sln.
Dans le menu Générer, cliquez sur Générer la solution.
Copiez DrawServ.exe et ATLDraw.exe ou DrawCtl.dll sur chaque ordinateur sur lequel vous souhaitez exécuter l'exemple. Inscrivez le serveur sur chaque ordinateur en exécutant DrawServ à partir de la ligne de commande avec l'argument /RegServer ou -RegServer (ne respecte pas la casse). Par exemple :
C:\ATL> DrawServ /RegServer
(ATL.DLL doit être inscrit pour que ce code fonctionne.) Vous devez copier le serveur sur chaque client pour inscrire le CLSID du serveur et la bibliothèque de types sur chaque client.
Démarrez le service sur le serveur à l'aide de l'icône Services du Panneau de configuration.
Utilisez l'utilitaire DCOMCNFG sur chaque client (en l'exécutant à partir de la ligne de commande) pour sélectionner les Propriétés de la classe DrawServ. Sous l'onglet Emplacement, sélectionnez Exécuter l'application sur l'ordinateur suivant. Entrez le nom de l'ordinateur sur lequel vous exécutez l'objet serveur.
Exécutez ATLDraw et sélectionnez Connect à partir du menu Server sur chaque client. Dessinez dans la fenêtre client : maintenez le bouton gauche de la souris enfoncé et tracez une ligne. La ligne que vous dessinez doit s'afficher sur tous les clients connectés au même serveur. Vous pouvez également utiliser l'option Couleur du menu Affichage pour changer la couleur sur chaque client.
L'exemple DrawServ ne s'inscrit pas correctement si son chemin d'accès contient des espaces. Une solution à ce problème consiste à modifier le fichier .rgs correspondant et à ajouter des guillemets simples autour de toutes les occurrences de %MODULE%. Par exemple,
InprocServer32 = s %MODULE%
est modifié en :
InprocServer32 = s '%MODULE%'
Mots clés
Cet exemple utilise les mots clés suivants :
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