<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=173153&amp;view=findpost&amp;p=1464182</guid>
        <pubDate>Sat, 24 Feb 2007 14:15:32 +0000</pubDate>
        <title>Пример создания сервера и клиента CORBA</title>
        <link>https://forum.sources.ru/index.php?showtopic=173153&amp;view=findpost&amp;p=1464182</link>
        <description><![CDATA[rikitikitavi: <div class='tag-align-center'><span class='tag-size' data-value='13' style='font-size:13pt;'><span class="tag-color tag-color-named" data-value="blue" style="color: blue">Пример создания сервера и клиента CORBA </span></span></div><br>
 В прежних версиях Delphi поддержка технологии CORBA была тесно объединена с поддержкой технологии COM (на уровне визуальных средств формирования интерфейсов). Это, в частности, выражалось в использовании редактора библиотеки типов, применявшегося преимущественно при описании интерфейсов для COM – объектов.<br>
 В Delphi 7 включен специальный компилятор IDL2PAS, автоматически генерирующий исходные тексты серверного и клиентского приложения на Паскале на основе описания интерфейса, заданного на языке IDL. Такой подход хорошо тем, что опираться на платформно - независимый язык IDL и даёт возможность создавать распределённые COBRA – приложения на основе шаблонов, подготовленных для других операционных систем.<br>
 <strong class='tag-b'>ЗАМЕЧАНИЕ</strong> <em class='tag-i'>При использование компилятора IDL2PAS в приложении будут использованы новые модули corba.pas и orbpas30.pas/orbpas40.pas вместо старых corbaobj.pas и orbpas.pas .</em><br>
 <div class='tag-align-center'><strong class='tag-b'><span class="tag-color tag-color-named" data-value="green" style="color: green">Серверный CORBA – модуль</span></strong></div> <br>
Рассмотрим пример создания CORBA – системы с применением новых возможностей Delphi 7. Эта система реализует функцию сложения двух чисел:<br>
 <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Function AddNmb(const X:Integer; const Y:Integer):Integer;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>Прежде всего необходимо подготовить исходный файл server.idl, содержащий описание нужного нам интерфейса. Для этого необходимо знание языка IDL – он во многом напоминает язык Си . Вместе с тем его основные элементы настолько прозрачны, что понимание структуры простейшего интерфейса не составит труда.<br>
<br>
Назовём IDL – модуль Server и опишем в нём два интерфейса: IMyTest и MyTestFactory. <br>
Первый, основной интерфейс, MyTestFactory, нужен для автоматического создания копии соответствующего объекта при обращении к публикуемому интерфейсу. Этот интерфейс сохраним в файл server.idl<br>
 <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Module Server</div><div class="code_line">&nbsp;{</div><div class="code_line">interface IMyTest;</div><div class="code_line">&nbsp;</div><div class="code_line">interface IMyTest</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp; long AddNmb (in long X, in long Y);</div><div class="code_line">};</div><div class="code_line">interface MyTestFactory</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;IMyTest Createinstance (in string InstanceName);</div><div class="code_line">&nbsp;&nbsp; };</div><div class="code_line">};</div></ol></div></div></div></div>Для создания CORBA – сервера надо дать команду File -&gt; New -&gt; Other и на закладке CORBA выбрать значок CORBA Server Application. Появится диалоговое окно, вызывающее компилятор IDL2PAS.<br>
 Этот компилятор можно также вызвать командой Tools -&gt; Regenerate CORBA IDL files (Инструменты -&gt; Перегенерировать CORBA IDL - файлы).<br>
<br>
Следующий шаг – генерация на основе описанного выше интерфейса прикладных модулей Delphi, реализующих соответствующую функциональность. Кнопкой  Add в диалоговом окне выбирается соответствующий IDL –файл(server.idl), описывающий наш интерфейс, а с помощью переключателей Application Type можно указать вид создаваемого приложения: консольное или Windows(выберем вариант Windows).На вкладке Options задаются дополнительные параметры генерации исходных текстов. Желательно, чтобы были установлены флажки Generate Skeleton Units и Generate Implementation Units, которые соответственно означают Генерировать шаблоны модулей и Генерировать модули реализации интерфейса. <br>
<br>
После нажатия кнопки OK будут сгенерированы четыре файла на Паскале, названия которых совпадают с названием модуля IDK – файла, описывающего наш интерфейс (Server). Дополнения к названиям полученных файлов (они расположатся в одном каталоге с server.idl) означают следующее:<br>
       •	I – модуль реализации интерфейса;<br>
       •	S – модуль реализации шаблона интерфейса;<br>
       •	C – модуль реализации класса;<br>
       •	Impl – модуль, реализующий функциональность интерфейса.<br>
В файле server_impl.pas надо указать, что делает единственный описанный в интерфейсе метод AddNmb:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;Function TIMyTest.AddNmb(const X:integer; const Y:Integer):Integer;</div><div class="code_line">&nbsp;Begin</div><div class="code_line">&nbsp;&nbsp; Result :=X+Y;</div><div class="code_line">&nbsp;End;</div></ol></div></div></div></div>Автоматически подготовленная процедура InitCorba этого модуля выполняет инициализацию и связь с CORBA – системой, а также создаёт о формирует соответствующий серверный интерфейс. Вызывается она в момент создания формы сервера.<br>
 В нашем случае текст модуля будет выглядеть так :<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Unit Unit1;</div><div class="code_line">&nbsp;Interface uses</div><div class="code_line">&nbsp;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Corba, Server_c, Server_i, Server_s, Server_impl;</div><div class="code_line">&nbsp;Type</div><div class="code_line">&nbsp;TForm1 – class(TForm)</div><div class="code_line">&nbsp;Procedure FormCreate(Sender: TObject);</div><div class="code_line">Private </div><div class="code_line">{private declarations}</div><div class="code_line">Protected </div><div class="code_line">{ Protected declarations }</div><div class="code_line">&nbsp;MTest: IMyTest; // skeleton object</div><div class="code_line">Procedure InitCorba;</div><div class="code_line">Public</div><div class="code_line">{public declarations }</div><div class="code_line">end;</div><div class="code_line">var Form1 : TForm1;</div><div class="code_line">implementation</div><div class="code_line">{$R *.DFM}</div><div class="code_line">Procedure TForm1.InitCorba;</div><div class="code_line">Begin</div><div class="code_line">&nbsp;CorbaInitialize;</div><div class="code_line">MTest := TIMyTestSkeleton.Create(‘Corba MyTest’,TIMyTest.Create);</div><div class="code_line">BOA.ObjIsReady(MTest as _Object);</div><div class="code_line">End;</div><div class="code_line">Procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">Begin</div><div class="code_line">&nbsp;InitCorba;</div><div class="code_line">End;</div><div class="code_line">End.</div></ol></div></div></div></div><br>
 Данные приложения можно откомпилировать и запустить. Оно будет представлять собой полноценный CORBA – сервер, реализующий интерфейс IMyTest.<br>
<br>
<div class='tag-align-center'><strong class='tag-b'><span class="tag-color tag-color-named" data-value="green" style="color: green">Создание клиентского CORBA – приложения</span></strong></div><br>
Дадим команду File -&gt; New - &gt; Other, на панели CORBA выберем значок CORBAA Client Application. Снова, как и в прошлый раз, с помощью кнопки Add добавим соответствующий IDL – файл с описанием нужного интерфейса и нажмём кнопку OK. Будет автоматически сгенерирован клиентский CORBA – модуль, в котором потребуется дополнительно описать переменную:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;vIMyTest : IMyTest;</div></ol></div></div></div></div> В момент создания формы эта переменная послужит интерфейсом CORBA – серверу. Такая связь выполняется с помощью метода bind класса TIMyTestHelper. Теперь к этому интерфейсу можно обращаться из других частей программы, например при нажатии кнопки Button1. Полный текст данного модуля запишется так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Unit Unit2;</div><div class="code_line">&nbsp;Interface uses</div><div class="code_line">&nbsp;Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Corba, Server_c, Server_i, StdCtrls;</div><div class="code_line">&nbsp;Type</div><div class="code_line">&nbsp;TForm1 – class(TForm)</div><div class="code_line">&nbsp;Button1: TButton1;</div><div class="code_line">&nbsp;&nbsp;Procedure Button1Click(Sender: TObject);</div><div class="code_line">&nbsp;Procedure FormCreate(Sender: TObject);</div><div class="code_line">Private </div><div class="code_line">{private declarations}</div><div class="code_line">Protected </div><div class="code_line">{ Protected declarations }</div><div class="code_line">&nbsp;vIMyTest: IMyTest; // skeleton object</div><div class="code_line">Procedure InitCorba;</div><div class="code_line">Public</div><div class="code_line">{public declarations }</div><div class="code_line">end;</div><div class="code_line">var Form1 : TForm1;</div><div class="code_line">implementation</div><div class="code_line">{$R *.DFM}</div><div class="code_line">Procedure TForm1.FormCreate(Sender: TObject);</div><div class="code_line">Begin</div><div class="code_line">&nbsp;vIMyTest := TIMyTestHelper.bind;</div><div class="code_line">end;</div><div class="code_line">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">var n:integer;</div><div class="code_line">begin</div><div class="code_line">n:=vIMyTest.AddNmb(2,3);</div><div class="code_line">ShowMessage(IntToStr(n));</div><div class="code_line">End; </div><div class="code_line">End.</div></ol></div></div></div></div><strong class='tag-b'>ЗАМЕЧАНИЕ</strong> <em class='tag-i'>Для того чтобы компиляция серверного и клиентского приложения проходила нормально, в список подключаемых модулей необходимо добавить ссылку на автоматически сгенерированные файлы – в нашем случае это Server_c и Server_i .</em>  <br>
 <br>
 <div class='tag-align-center'><strong class='tag-b'><span class="tag-color tag-color-named" data-value="green" style="color: green">Тестирование CORBA – проекта </span></strong></div><br>
 <strong class='tag-b'>Запуск и использование объекта CORBA </strong><br>
В реальных проектах сервер CORBA запускается на более мощных компьютерах, чем ПК, на котором расположена клиентская программа CORBA, что позволяет более эффективно обрабатывать запросы. Однако тестовый пример вполне может работать и на локальном компьютере, под управлением Windows 9x. Брокеру всё равно, расположены ли соответствующие объекты на одном компьютере или на ста разных, главное, чтобы они зарегистрировали свои интерфейсы.<br>
А как произойдёт регистрация интерфейса только что созданного сервера CORBA ?<br>
Автоматически. Хотя технология CORBA предусматривает несколько способов такой регистрации, в том числе и динамический, система Delphi 7 создаёт весь код, необходимый для регистрации заданного интерфейса, без участия человека.<br>
Перед запуском серверного модуля на компьютере должен быть запущен «интеллектуальный агент» SmartAgent – ресурс брокера, который автоматически обнаруживает объекты с интерфейсами, нудными клиентским программам. Он вызывается командой Пуск-&gt;Программы-&gt;VisiBroker-&gt;VisiBroker Smart Agent. На экране появляется пустое окно агента.<br>
Далее надо запустить с помощью, например, Проводника сервер CORBA (Project1.exe, появится тоже пустое окно) и для проверки его работы две (или пять, или больше) копий клиента CORBA Project2.exe<br>
В каждой из клиентских программ можно ввести два числа и мгновенно получить их сумму, щёлкнув на кнопке Button1. При этом суммирование реально выполняется, как уже говорилось, сервером CORBA, а работать он может и на другом компьютере, обрабатывая запросы любого числа клиентов CORBA. Производительность серверного объекта и скорость его ответа на запросы клиентов определяется только ресурсами того компьютера, на котором он запущен.]]></description>
        <author>rikitikitavi</author>
        <category>ActiveX, COM, DCOM, CORBA, MIDAS, интерфейсы, OLE, DDE</category>
      </item>
	
      </channel>
      </rss>
	