STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2)

{

return Number1 + Number2;

}

.STDMETHODIMP TMyObjectlmpl::Div(long Numberl, long Number2, float* Res)

{

*Result = (float)Number1 / Number2;

return S_OK;

}

Приведенный код навряд ли нуждается в комментах. В способе Addпросто ворачивается сумма значений 2-ух характеристик. А в способе Divитог деления заносится в выходной параметр. При делении употребляется очевидное приведение типа STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) 1-го из характеристик, чтоб получить итог в виде реального числа. Ворачивается в способе константа S_OK,свидетельствующая о благополучном окончании способа.

Сейчас все изготовлено, объект в составе сервера СОМ сотворен. Осталось зарегистрировать сервер в системе. Это можно сделать командой Run|Register ActiveX Server головного меню C++Builder. To же самое можно STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) выполнить 2-ой справа резвой кнопкой в окне рис.

При регистрации вашему серверу и объекту в нем присвоятся уникальные идентификаторы uuid,а информация о сервере запишется в реестр Windows. Если в предстоящем будет нужно удалить его (навряд ли этот тестовый сервер представляет какую-то ценность), то через главное меню STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) необходимо выполнить команду

Run|Unregister ActiveX Server.

Отметим еще, что для распространения вашего проекта меж юзерами будет нужно библиотека типов на языке IDL Трансляция ее осуществляется резвой кнопкой Export To IDL — последняя правая на рис..

Осталось проверить работу сделанного сервера, создав для него клиентское приложение. Начните новый проект. Разместите на форме два окна Edit STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2),в каких юзер сумеет задавать числа. Добавьте две кнопки, одна из которых (назовите ее BAdd)будет делать сложение, а другая (BDiv)— деление, выполняя соответственно способы первого и второго интерфейсов. Введите также в приложение метку Label,в какой будут отображаться результаты эти вычислений. Сейчас нам нужно обеспечить связь нашего STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) клиентского приложения с сервером. Так как вы сами разработали сервер и все его файлы у вас имеются, это можно было бы сделать до боли просто. Но мы разглядим более общий путь, обеспечивающий связь с хоть каким посторонним сервером. Сделайте команду Project|Import Type Library. Перед вами раскроется окно, показанное на STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) рис.

В верхнем перечне вы увидите все зарегистрированные на вашем компьютере библиотеки типов. Если некий библиотеки вы не отыщите, можно щелкнуть на кнопке Add и избрать требуемый файл. В нашем случае, если вы не запамятовали зарегистрировать ваш сервер, вы отыщите его библиотеку в перечне, как показано на STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) рис. Выключите индикатор Generate Component Wrappers. Это исключит генерацию оболочки, которая нам не нужна. Щелкните по имени сделанного типа. Кнопка Create Unit - сделать модуль, станет активной. Дальше щелкните на кнопке Create Unit. В итоге в проект включится модуль Mycomserv_tlb. Это модуль описания вашей библиотеки типов, файлы которого мы пока не смотрели STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2). Фактически, сможете и на данный момент в их не всматриваться. В файле Mycomserv_tlb.cpp вы увидите перечень идентификаторов GUID библиотеки, объекта и интерфейсов. А в файле Мусотserv_tlb.h вы отыщет описание класса с бессчетными объявлениями способов и, а именно, объявлениями введенных вами способов Add и STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) Div.

Чтоб связать основной модуль вашего клиентского приложения с сервером, введите в заголовочный файл модуля директиву

#include

Сейчас вы сможете использовать объявления, находящиеся в описании сервера. В объявление класса формы клиентского приложения введите переменные Interface1иInterface2,которые будут указывать на надлежащие интерфейсы сервера. Объявление класса формы может иметь вид:

#include

. . .

public: . // User declarations

fastcall TForml STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2)(TComponent* Owner);

TCOMIMyObject Interfacel;

IntDivPtr Interface2;

};

Тип переменной Interface1задан как TCOMIMyObject.Это класс так именуемого умственного (smart) интерфейса. Вы сможете отыскать имя этого класса (поточнее, имя личной реализации соответственного шаблона класса) в заголовочном файле MyComSeru_TLB.h. Вобщем, не непременно вдаваться в тонкости реализации. Довольно знать, что интересующее вас STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) имя складывается из имени интерфейса, перед которым добавляется префикс ТСОМ. Умственный интерфейс автоматом производит операции по установлению и разрыву связи с сервером. Так что лучше использовать конкретно его, а не сам интерфейс. Тип переменной Interface2задан равным IntDivPtr.Это указатель на сооветствующий интерфейс. Он представляет собой реализацию 1-го из STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) шаблонов класса, который вы сможете отыскать в файле MyComServ_TLI}.h. Имя типа указателя складывается из имени интерфейса и суффикса Ptr.

В обработчик действия формы OnCreateвоткните код:

Interfacel = CoMyObject::Create ( ) ;

Interface2 = Interfacel;

1-ый из этих операторов вызывает способ Createсокласса объекта сервера. Этот вызов производит все нужные деяния по STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) инициализации сервера. В итоге в приложении будет сотворен объект сервера Interface1.Вы сможете обращаться через него к свойствам и способам интерфейса по дефлоту. Когда выполнение приложения закончится, автоматом вызовется деструктор класса TCOMIMyObject,который высвободит интерфейс сервера.

2-ой из приведенных операторов задает переменной Interface2 значение указателя на 2-ой интерфейс. Вам даже не требуется STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) вызывать способ QueryInterface.Его вызов осуществится автоматом.

Осталось написать обработчики щелчков на кнопках, вызывающих надлежащие способы интерфейсов. Они могут иметь вид:

void fastcall TForml::BAddClick(TObject *Sender)

{

Label1->Caption = Interfacel.Add(StrToInt(Edit1->Text),

StrToInt(Edit2->Text));

и

void fastcall TForml::BDivClick(TObject *Sender)

float R;

(*Interface2).Div(StrToInt(Edit STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2)1->Text),

StrToInt(Edit2->Text), &R);

Label1->Caption = R;

}

Как видно в приведенном коде, вызов способа Add осуществляется конкретно через объект Interface1.При этом итог этого вызова возвращаемое способом значение, в нашем случае — сумма чисел. Вызов способа второго интерфейса осуществляется с учетом того, что переменная Interface2— указатель на интерфейс STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2). Не считая того, в приложение приходится вводить дополнительную переменную R, указатель на которую передается в способ Div. В переменную R заносится итог — значение выходного параметра способа.

Проектирование клиентского приложения закончено. Сможете выполнить его и убедиться, что все работает нормально.

Реализация и внедрение локальных серверов СОМ

Ранее рассматривалось построение внутреннего сервера СОМ в виде файла STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) DLL. Сейчас разглядим построение сервера, реализуемого исполняемым файлом .ехе. Исходя из убеждений юзера основное отличие этого варианта состоит в том, что сервер представляет собой отдельное приложение. За его состоянием можно следить, можно управлять его работой, переключать его в разные режимы и т.п.

Попробуем выстроить обычный локальный сервер STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) СОМ и его клиентов. Пусть этот сервер будет содержать окно редактирования, в которое можно вносить некий текст сообщения. А клиенты сервера сумеют читать это сообщение и вносить на сервер собственные сообщения. Таким макаром, клиенты сумеют разговаривать вместе. Чтоб дополнительно обсудить создание и внедрение способов интерфейсов, добавим на сервер способ, который STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) по запросу клиента может управлять видимостью сервера. Начните новое приложение, перенесите на форму окно редактирования Editи задайте заголовок формы Сервер MyServer. Больше сможете в серверное приложение ничего не заносить. А сможете добавить какие-то органы управления по собственному желанию.

Сохраните ваш проект под каким-либо именованием. Учтите, что это STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) имя станет именованием исполняемого файла вашего сервера. Но предстоящий текст в данном разделе нацелен на имя Project1.

Пока создаy обыденный проект C++Builder. Сейчас давайте превратим его в локальный сервер СОМ. Сделайте команду File | New | Other и на страничке ActiveX Депозитария изберите пиктограмму Automation Object — объект STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) автоматизации. С ним вы уже умеете работать, так как точно так же делали объект во внутреннем сервере, рассмотренном ранее. В окне, которое раскроется перед вами в окошке CoClass Name укажите имя класса MyObject.

После щелчка на кнопке ОК перед вами раскроется знакомое окно РедактораБиблиотеки Типов

Что необходимо вам внести в интерфейс STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2)? Имя этого интерфейса в нашем примере IMyServer, а класс его родительского интерфейса нужно установить равным IDispatch. Сначала, введите в этот интерфейс способ SetVis. Этот способ будет управлять видимостью сервера. Задайте в способе один параметр с именованием Vis, типом VARIANT_BOOL (это булев тип, применяемый в СОМ) и спецификатором [in]. Этот параметр будет указывать STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2), должен ли сервер быть видимым (при значении true) либо невидимым (при значении false).

Сейчас давайте введем в интерфейс свойство с именованием Mess. Оно будет представлять читаемые либо записываемый текст сервера. Так как пока мы не добавляли параметров в интерфейс, разглядим эту операцию подробнее. Нажмите кнопку выпадающего перечня рядом с кнопкой Property (4-ая справа). Раскроется STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) меню с разделами Read | Write (для чтения и записи), Read Only (только для чтения), Write Only (только для записи), Read | Write | Write By Ref (для чтения, записи и записи по ссылке). Нам нужно и читать, и записывать значения Mess. Так что изберите раздел Read | Write. В итоге в STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) левой панели Редактора Библиотеки Типов появятся две верхушки: одна для функции записи, другая для функции чтения. Задайте какой-то из них имя Megs. Это имя автоматом присвоится и 2-ой верхушке. На страничке Attributes задайте тип характеристики — BSTR. Это тип строк, применяемый в СОМ.

Для функции чтения на страничке Parameters задайте STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) имя параметра функции Text, тип параметра BSTR * — указатель на BSTR, спецификатор параметра [out, retval]. Для функции записи имя параметра Text, тип параметра BSTR, спецификатор параметра [in]. Возвращаемый тип в обеих функциях HRESULT.

Формирование параметров и способов интерфейса закончено. Сейчас можно их реализовывать. Щелкните на кнопке Refresh Implementation STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2) (Обновить реализацию) — 3-я справа на рис.. Перейдите в Редактор Кода. В файле MyServerlmpl.cpp вы увидите заготовки функций записи и чтения get_Mess, set_Mess и способа SetVis. Вам остается только добавить по одному оператору в каждую из этих заготовок. В итоге они должны смотреться так:

STDMETHODIMP TMyServerlmpl STDMETHODIMP TMyObjectlmpl::Add(long Numberl, long Number2)::get_Mess(BSTR* Text)

{

Try

(

*Text = WideString((Forml->Editl->Text).c_str()). cjDstr();

}

catch(Exception &e)

(

return Error(e.Message.c_str(), IID_IMyServer);

}

return SJDK;


stavki-zemelnogo-naloga-na-selskohozyajstvennie-zemli-selskohozyajstvennogo-naznacheniya.html
stavropolskie-gubernskie-vedomosti-stavropol-29022012-monitoring-smi-modernizaciya-professionalnogo-obrazovaniya.html
stavropolskij-kraj-reest-r-subektov-estestvennih-monopolij-v-otnoshenii-kotorih-osushestvlyaetsya-gosudarstvennoe.html