Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 238

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 232 233 234 235 236 237 < 238 > 239 240 241 242 243 244 .. 320 >> Следующая

HRESULT GetEngine([out, retval] IEnglrte** pEngine);
}:
Реализация метода Get Eng ine С) требует применения некоторых типов ATL. На. случай, если они вам не очень знакомы, просто скажем, что объект CoEngine создается при помощи статического метода После этого производится запрос к интерфейсу и возврат его клиенту:
ST0METH0DIMP ССоСаг::GetEngine(IEngine **pEng1ne)
{ Il Создав* CoEngine и нозаращве* интерфейс !Engine клиенту CComObject<CCoEngine> *pEng; CComOnject<CCoEngi пе>::Createlnstance(&pEng)• pEng->QueryInterface(IIDJEngine. (void**)pEngine):
return
}
Если мы захотим запретить создание объекта вложенного класса, достаточно добавить атрибут [noncreatable] в код ЮЬдля CoEngine. Этот атрибут воспринимается множеством языков программирования (в том числе'Visual Basic 6.0) какзаг -рет создания пользователем объекта этого класса напрямую. Если пользователь все-таки произведет такую попытку, он получит сообщение об ошибке тора. Выглядеть все это может так:
590 Глава 12 • Взаимодействие с унаследованным программным кодом
[ UUid(32С07Е17-F966-4EFD-ВЗО1-9729FE2D60BS}. helpstringC'CoEngine Class").
noncreatable ]
coclass CoEngine (
[default] interface IF.rglns;
}:
Кроме того, внесем изменения в ATL OHJECT_MAP, пометив CoEnglne как NON CREATARLE. Это запретит внешним клиентам напрямую создавать объекты этого класса:
BEGlN_08JECT_MAP(Obj ectHa р)
0BJECT_ENTRY(CLSID_CoCar. CCoCar)
OBJECT ENTRY_NON_CREATABLE (CCoEгіді ne) END_OBJECT_MAP()
Последний штрих: создаем перечисление IDL
Перед тем как мы приступим к созданию прокси-сборки для нашего СОМ-сервера, осталось внести в его определение последний штрих. Откроем файл IDL нашего проекта и добавим в него перечисление СОМ, которое будет называться СагТуре. Оно должно быть размещено непосредственно после выражений IMPORT в верхней части файла:
// Это перечисление СОН будет испопьэовано для идентификации типа автомобиля typedef епита СагТуре {Jetta. BMW. Ford, Colt} СагТуре:
Чтобы внешние клиенты смогли обращаться к этому перечислению, добавим в интерфейс ІСагеще один метод, который будет называться GetCarTypeu: interface : IDispatch
{
[Id(I). heipstring("method SpeedUp")] HRESULT Sp8?dCo([-nl int delta);
[id(2). hei pst ring ("method GetCurSpeed")] HRESULT GetCurSpeed([out. retval] int*currSp):
[ісКЗ), fielpstring("method GetEngine)]
HRESULT Gf>tEngine([out. retval] IEn:,ine** pEngine):
[1d(4). nelpstrlngt"method GetCarType"}] HRESULT GetCarType([out. retval] СагТуре* et):
h
Реализация метода GetCe.rType() создает и устанавливает значение перечисления СагТуре для использования клиентом СОМ:
STDMETHODIMP ССоСоп : GetCarType (СагТуре *ct) {
*ct = Colt; И Или что-нибудь другое... return S_0K:
}
Готов поспорить, что вы вряд ли ожидали встретить столько информации по ATL в книге, посвященной С#. В свое оправдание могу сказать только, что все это нам понадобится для рассмотрения вопросов взаимодействия .NET и СОМ. В большинстве случаев СОМ-серверы выполняют гораздо более сложные дей-
Клиент СОМ-сервера в Visual Basic 6.0 591
Клиент СОМ-сервера в Visual Basic 6.0
Интерфейс клиента Visual Basic 6,0 представлен на рис. 12.19.
VOIiO ATI I ..I и I l.i'iil

all Сдаете I Ре' names your cylinders
Рис. 12.19. Интерфейс клиента visual Basic
При загрузке формы создается объект класса Саг (который объявлен с ключевым словом WithEvents, чтобы можно было реализовать реакцию на входящее событие Exploded). Обработчик события Exploded всего-навсего выводит сообщение, посылаемое погибающим автомобилем;
Private Sub myCarjxploded(ByVa 1 deadMsg As String) MsgBox deadMsg. . "Message from СоСаг!"
End Sub
При нажатии на кнопку Speedup происходит, конечно, увеличение скорости автомобиля. Вспомним, что как только скорость автомобиля достигнет максимума, СОМ-сервер СоСаг отправит сообщение о событии Exploded. Если пользователь попробует ускорить уже несуществующий автомобиль, он получит объект СОМ-ошибки, которую Visual Basic перехватит при помощи конструкции On Error GoTo:
Private Sub otnSpeedUp EMcK) On Error GoTo OOPS
myCaг.Speedup 50
Labe!2.Capt oi = Current Speed;
& тіуйг Get CurSpeed
Exit Sub OOPS:
HsqBok Err.Description. . "Error from cer!"
ствия, чем сложение двух объектов, вот почему нам потребовался СОМ-сервер с поддержкой протокола ошибок, точек соединения, вложенным классом, перечислением, который работает с такими распространенными в мире СОМ типами, как BSTR и SAFEARRA Y.
Теперь, когда работа над СОМ-сервером завершена, мы создадим промежуточную сборку и рассмотрим, как более сложные возможности СОМ будут отображаться в .NET. Однако перед этим мы вначале опробуем наш класс СоСаг в действии, подключив к нему традиционного клиента на Visual Basic 6.0.
Код приложения ClassicATLCOMServerможно найти в подкаталоге Chapter
592 Глава 12 • Взаимодействие с унаследованным программным кодом
Resume Ne хт. End Sub
При нажатии на кнопку Get all Cylinders будет получена от СоСаг ссылка на интерфейс IE na ine, а после этого будет вызван метод GetCyl і riders (.): Private Sub btnGetCylinders_Click()
Предыдущая << 1 .. 232 233 234 235 236 237 < 238 > 239 240 241 242 243 244 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100