Esempio DCOM: dimostrazione della chiamata remota a un oggetto COM
Aggiornamento: novembre 2007
Nell'esempio DCOM viene illustrata la chiamata remota a un oggetto COM implementato in un servizio di Windows da parte di più client in esecuzione su computer diversi. L'esempio è costituito da tre parti.
DrawServ: il servizio di Windows che implementa l'oggetto COM.
ATLDraw: il client che effettua la connessione all'oggetto COM di DrawServ.
DrawCtl: una versione di controllo di ATLDraw.
Nota sulla sicurezza: |
---|
Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti. |
Per ottenere gli esempi e le istruzioni per l'installazione:
In Visual Studio scegliere Esempi dal menu ?.
Per ulteriori informazioni, vedere Individuazione dei file di esempio.
La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.
È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.
Generazione ed esecuzione dell'esempio
Per garantire il corretto funzionamento dell'esempio è necessario che su tutti i computer sia in esecuzione Windows 2000 o versione successiva.
Per generare ed eseguire l'esempio
Aprire la soluzione DCOM.sln.
Scegliere Genera soluzione dal menu Genera.
Copiare DrawServ.exe e ATLDraw.exe o DrawCtl.dll su ciascun computer su cui si desidera eseguire l'esempio. Registrare il server su ciascun computer eseguendo DrawServ con l'argomento /RegServer o -RegServer della riga di comando, senza distinzione tra maiuscole e minuscole. Esempio:
C:\ATL> DrawServ /RegServer
Per garantire il corretto funzionamento deve essere effettuata la registrazione di ATL.DLL. La parte server dell'applicazione deve essere copiata su ciascun client allo scopo di registrare il CLSID per il server e la libreria dei tipi del server su ciascun client.
Avviare il servizio sul server utilizzando l'icona Servizi del Pannello di controllo.
Selezionare le proprietà della classe DrawServ eseguendo l'utilità DCOMCNFG da una riga di comando su ogni client. Nella scheda Percorso selezionare Esegui l'applicazione sul seguente computer. Immettere il nome del computer su cui è in esecuzione l'oggetto server.
Eseguire ATLDraw e selezionare la connessione al server dal menu su ogni client. Tracciare una riga sulla finestra client tenendo premuto il pulsante sinistro del mouse mentre lo si trascina. La linea disegnata dovrebbe essere visualizzata su ciascun client connesso allo stesso server. È inoltre possibile modificare il colore per ciascun client mediante la voce di menu Visualizza/Colore.
La registrazione dell'esempio DrawServ non verrà eseguita correttamente se il relativo percorso contiene degli spazi. Per risolvere questo problema, è possibile modificare il file RGS corrispondente e racchiudere tutte le occorrenze di %MODULE% tra virgolette semplici. Di seguito è riportato un esempio di riga da modificare:
InprocServer32 = s %MODULE%
La riga risultante sarebbe:
InprocServer32 = s '%MODULE%'
Parole chiave
Nell'esempio vengono utilizzate le parole chiave seguenti:
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