DCOM (курсовая работа) (548068), страница 4
Текст из файла (страница 4)
Как и IUnknown, онсодержит 3 метода: RemQueryInterface, RemAddRef и RemRelease. Но в отличие от методов IUnknownони позволяют выполнять групповые запросы. Например, одним вызовом RemQueryInterface можнозапросить несколько указателей на интерфейсы нескольких объектов. Аналогично RemAddRef иRemRelease позволяют одновременно увеличивать и уменьшать счетчики ссылок несколькихинтерфейсов нескольких объектов (доступ к каждому из которых осуществляется с помощью одной итой же информации связывания).Клиенты не используют интерфейс IRem Unknown непосредственно.
Вместо этого они, каквсегда, вызывают методы обычного IUnknown. Реализация этих методов стандартным заместителемгруппирует вызовы и затем выполняет (минимально возможное количество раз) удаленные вызовыIRemUnknown. Например, вызовы клиентом AddRef и Release обычно не транслируются в вызовыIRemUnknown::RemAddRef и IRemUnknown::RemRelease один к одному. Вместо этого каждый из этихметодов IRemUnknown вызывается не более одного раза — после первого вызова AddRef и послепоследнего вызова Release. Значит, объект могут использовать несколько клиентов, и в то же время егосчетчик ссылок может быть равен 1.
И никаких проблем: ведь объект не будет разрушен пока егосчетчик ссылок не равен 0. С точки зрения объекта и его клиентов, все работает аналогично локальномуслучаю, но в распределенной среде это решение гораздо эффективнее.Хотя оптимизация вызовов IUnknown, выполняемая инфраструктурой СОМ, несомненнополезна, иногда и сам клиент может действовать более разумно.
Например, когда ему нужны указателина несколько интерфейсов данного удаленного объекта, быстрее всего получить их за один вызов. Дляэтой цели DCOM определяет интерфейс IMultiQI, указатель на который клиент получает обычнымспособом — вызывая QueryInterface через указатель на любой интерфейс. Но IMultiQI обычнореализуется локальным заместителем, а не удаленным объектом, так что создается иллюзия, что егоподдерживает любой объект. Этот простой интерфейс содержит один метод (кроме унаследованных отIUnknown) — QueryMultipIeInterfaces. Клиент может передать ему список идентификаторовинтерфейсов и в ответ получить указатель на каждый из них. Вместо того, чтобы заставлять клиентавыполнять несколько удаленных вызовов, вся информация получается в результате одного запроса кудаленному объекту.Тестовый опросВсе объекты СОМ используют подсчет ссылок для определения момента, когда они могутбезопасно себя разрушить.
Но в случае объекта, выполняющегося на удаленной машине, есть однапроблема: что будет, если исполнение клиента завершится внезапно? Когда объект и его клиентвыполняются на одной машине, объект может быть уведомлен о внезапной смерти клиентанепосредственно. Но в распределенном случае ситуация несколько сложнее.К счастью, эта проблема давно решена: клиент может производить периодический тестовыйопрос (pinging) каждого используемого им объекта путем выдачи ему вызова ORPC.
Если в течениедостаточно длительного времени от данного клиента не приходит подобный тест, клиент считается"погибшим", и объект может предпринять соответствующие действия. Тестовый опрос может служитьпростым способом поддержки подсчета ссылок в распределенной среде.Но тестовый опрос может быть и невероятно неэффективным. Вообразите, например, что намашине работают 10 клиентов и у каждого из них по 30 указателей на интерфейсы 10 разных объектов,причем последние все расположены на второй машине. Наивный (и очень дорогой) метод тестовогоопроса может требовать от каждого клиента опрашивать все интерфейсы каждого объекта поотдельности.
Разумнее, объединив эти опросы, обеспечить гораздо более эффективное использованиесети.9Так и поступает DCOM. Вместо того, чтобы требовать от каждого клиента опрашивать всеобъекты индивидуально, пакеты тестового опроса отправляются и принимаются разрешателями OXID.Разрешатель OXID определяет, какие интерфейсы относятся к одному и тому же объекту и какиеобъекты находятся на одной машине.
Затем он определяет набор тестового опроса (ping set),включающего в себя все интерфейсы этих объектов, обращаясь к IObjectExporter::ComplexPingразрешателя OXID удаленной машины. После этого, разрешатель OXID может выполнять одинтестовый опрос другого разрешателя для всего набора с помощью IObjectExporter::SimplePing. Этогораздо эффективнее посылки пакета опроса каждым клиентом каждому объекту и уж тем более —тестового опроса каждого интерфейса каждого объекта.Тестовый пример:Разработаем тестовый пример приложения, где будут использоваться возможности DCOM, аименно связь приложения с сервером Microsoft Excel на другой машине в Локальной Сети. Средаразработки – Borland C++ Builder.Создадим новый проект. Добавим на форму пару компонентов – Button1::TButton иDCOMConnection1::TDCOMConnection.
Последний – устанавливает связь с указанным приложениемсервер указанной машины через DCOM.Для начала выделим значок компонента DCOMConnection1 и настроим его используя ObjectInspector:• В поле ComputerName нужно ввести адрес (IP-адрес или DNS-имя) машины, на которой мызапустим сервер Microsoft Excel;• В поле ServerName вводится имя сервера автоматизации, введем «Excel.Application». Тогда вполе ServerGUID появится GUID сервера «Excel.Application», взятый из реестра данноймашины.После настройки компонента DCOMConnection1, можно написать обработчик события принажатии на кнопку Button1:void __fastcall TForm1::Button1Click(TObject *Sender){DCOMConnection1->Connected = true; //включаем соединениеApp = DCOMConnection1->AppServer; //получаем настройки сервера из DCOMConnection1App.OlePropertySet("Visible", true); //создаем видимое окно сервераvVarBooks=App.OlePropertyGet("Workbooks"); //создаем файл Excel с 1 листомApp.OlePropertySet("SheetsInNewWorkbook",1);vVarBooks.OleProcedure("Add");vVarBook=vVarBooks.OlePropertyGet("Item",1);vVarSheets=vVarBook.OlePropertyGet("Worksheets");vVarSheet=vVarSheets.OlePropertyGet("Item",1);vVarSheet.OlePropertySet("Name","Тест"); //назовем этот лист «Тест»vVarCell=vVarSheet.OlePropertyGet("Range","A1:Z99"); //настроим шрифт, выравниваниеvVarCell.OlePropertyGet("Font").OlePropertySet("Size",60);vVarCell.OlePropertySet("HorizontalAlignment",-4108);vVarCell.OlePropertySet("VerticalAlignment",-4108);vVarCell=vVarSheet.OlePropertyGet("Cells").OlePropertyGet("Item",2,8);vVarCell.OlePropertySet("Value","Превед, DCOM!"); //введем некоторый текст в наш файл}Итак, тестовое приложение создано.
Протестируем приложение в локальной сети. Запустимего на машине с IP-адресом 172.16.3.143, а Excel будем запускать с машины с IP-адресом 172.16.3.51В итоге при нажатии кнопки в созданном приложении на машине (172.16.3.143), на другоймашине (172.16.3.51) запускается Excel и создается файл.ОграниченияДля работы тестового примера, на обеих машинах должны быть «одинаковые» учетныезаписи, т.е. имя пользователя и пароль должны совпадать, а также обе учетные записи должны быть справами «Администратора». Так же на обоих компьютерах должны быть отключены все имеющиесяпрограммы класса «Firewall» («Брандмауэр»), используемые для защиты подключений к компьютеру полокальной сети и интернет.10ЗаключениеВ данной работе проведен анализ технологии DCOM и разработан тестовый пример,показывающий некоторые возможности DCOM, а именно – связь с зарегистрированным в реестреприложении (на другой машине в локальной сети).Полученные при этом знания можно использовать для создания сложного приложения,использующего в своей работе данную технологию.Список литературы:1.
William Rubin, Marshall Brain «Understanding DCOM» - Prentice Hall PTR, 1999 – 298 с.2. Елманова Н., Трепалин С., Тенцер А. «Delphi и технология COM». Мастер-класс. – СПб.:Питер,2003. – 698 с.3. Архангельский А.Я. Программирование в С++ Builder 6. – М.: ЗАО «Издательство БИНОМ»,2002. – 1152 с.11.