Образец DCOM: демонстрация удаленного вызова COM-объекта
Обновлен: Ноябрь 2007
В образце DCOM демонстрируется вызов COM-объекта, реализованного в службе Windows, из нескольких клиентов, запущенных на разных компьютерах. Образец состоит из трех частей:
DrawServ — служба Windows, реализующая COM-объект.
ATLDraw — клиент, подключающийся к COM-объекту DrawServ.
DrawCtl — версия элемента управления для ATLDraw.
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Для демонстрации этого образца необходимо, чтобы все компьютеры работали под управлением Windows 2000 или более поздней версии.
Построение и запуск образца
Откройте решение DCOM.sln.
В меню Построение выберите команду Построить решение.
Скопируйте файлы DrawServ.exe и ATLDraw.exe или DrawCtl.dll на каждый компьютер, где требуется запустить образец. Зарегистрируйте сервер на каждом компьютере, выполнив программу DrawServ с аргументом командной строки /RegServer или -RegServer (вводятся без учета регистра символов). Пример.
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