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

 

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

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

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

Добавление методов в интерфейс по умолчанию
Первое, что мы должны сделать, создавая наш СОМ-есркер, — добавить несколько исходных членов в интерфейс по умолчанию ([default]), который у нас называется ІСаг. Щелкнем правой кнопкой мыши на значке интерфейса СОМ в Class View и воспользуемся мастером Add Method (Добавить метод) для добавления двух методов. Первый метод SpeedUpO будет принимать единственный параметр WIt (см рис. 12.17).
Второй метод - GetCurSpeedO - возвращает указатель int (помеченный как [out, retval ]). После добавления обоих методов определение интерфейса в IDL будет выглядеть следующим образом:
[ object. uuid(A8E01A32-0300-402A-BlEC-ADCD2DC52684), dual, helpstrtng"ІСаг interface"),
pointer_default(unique) ]
Cancel
Создаем СОМ-сервер при помощи ATL 585
interface !Car : IDispatch
{
[1d(l), helpstringC'method SpeedUp")] HRESULT SpeedUp([ in\ iotoelU).
[id(2). helpStringC method GetCurSpeed")] HRESULT GetCurSpeedt[out. retval] int* currSp);
}:
A'.iij Method to ;:.u-,i,^r WLW 21 *i

fletum Type: OK
HRESULT
Cancel
Method Цапе:
[Speedup Alliibutes... j
Patameteis:
delta
mptsmentation:
Dcffl I, ht^ttmsfmethod Sp«dUp")l
. HRESULT SpeedUplTHfrdeM;

Рис. 12.17. Определяем параметры при помощи атрибутов IDL
Реализовать этот интерфейс в й'жгжсг в соответствии с приведенным определением очень просто. Вначале мы добавим переменную типа i nt (она будет называться curSpeed), инициализируем ее в конструкторе, установив значение, равное О,, а затем реализуем каждый из двух методов интерфейса следующим образом:
STOMETHOC CCoCar::SpeedUp (int delta) і
// Добавляем delta к текущей скорости curSpeed +- delta; return S_0K;
}
STDMETHOOIHP CCoCaг::GetCurSpeed(int *currSp) {
//Возвращаем текущ/ю скорость *currSp = curSpeed; return S OK;
)
Чтобы убедиться, что ошибок у нас нет, откомпилируем наш сервер.
Генерация события СОМ
Следующее, что мы должны сделать, — настроить наш сокласс СоСаг таким образом, чтобы он мог генерировать событие СОМ. Первое, что мы должны при этом сделать — добавить метод в исходящий интерфейс, который будет представлять методы, вызываемые соклассом через приемник клиента (исходящий интерфейс — это интерфейс, определенный на СОМ-сервере, но реализованный на клиенте). В ATL исходящие интерфейсы выводятся на самом верху Class View и все они помечены префиксом " /' и суффиксом "Events". Щелкнем правой кнопкой на исхо-
586 Глава 12 • Взаимодействие с программным кодом
дящем интерфейсе и откроем New Method Wizard. Добавим событие с именем Exploded, при возникновении которого клиенту будет передаваться параметр типа 6STR(PHC 12.18).
Add Method to JnI etl.ti e
?elurn Typt:
Jhresult
M«lhod?dm«: |Explodcd
Eafemeleis:
JW; ISt Rdeaotosg
Implementation:
C
OK
1
Concei
illifajle*..
iapil^Uirtf,fneftodEKplotfad,,)J .
HPiSiJCT Euplodedllini 8STR d№*sa);
Рис. 12.18. Создаем событие для исходящего [source] интерфейса
Вот код для этого интерфейса в IDL:
[uuid(E68DA278-AD04-407F-9BBB-D8COOAFE7984). helpstring("_ICarEventS Interface") ]
dispinterface JCarEvents
{
properties: methods:
[idCl). helpstringC"method Exploded")] HRESIJLT ExplodedtLin] BSTIi deadMsg ):
}
После добавления этого события в исходящий интерфейс откомпилируем проект для того, чтобы обновить информацию о типах СОМ.
Следующая наша задача - добавить прокси для этого события, который будет использован средой ATL для передачи информации о возникновении события Exploded любому подключенному к СОМ-серверу клиенту. Щелкнем правой кнопкой мыши на классе СоСагв окне Class View и выберем в контекстном меню Implement Connection Point (Реализовать точку соединения). В открывшемся диалоговом окне выберем имя интерфейса событий (_CarEvents) и нажмем ОК.
В наш сокласс СоСаг будет внесено сразу несколько изменений. Во-первых, мы сможем обнаружить, что в CONNECT IONJIAP (в заголовочном файле СоСаг) будет внесена новая запись. Для чего нужна эта запись — нам сейчас не очень интересно, важнее исправить ошибку, которая в этом месте иногда появляется (в результате ошибки в мастере). Иногда параметр для макроса CONNECTI0N_P01NT_ENTRY генерируется без необходимого префикса D. В этой ситуации ошибку необходимо будет исправить вручную (если у нас этой ошибки нет, нет и необходимости что-либо исправлять):
BEGIN_C0NNECTIONPOINT_MAP{ССоСа г)
// Здесь мастер МОЖЄТ забыть префикс O
// CONNЕСТI0N_P0INT_ENTRY(IID_ICarEvents) // Ошибка
C0NNECTI0N_P0INT ENTRY(OIIOICarEvents) // Правильно
END_ CONNECTION P0INT_MAP()
Создаем при помощи 587
Второе важное изменение, которое будет внесено, — в цепь наследования для СоСаг будет добавлен новый класс (CProxyJCarEvents). Этот класс реализует метод iFire_ExplodedO, который и занимается всей работой по передаче информации о событии всем подключенным в настоящий момент клиентам.
Чтобы создать механизм, который будет заставлять событие Exploded срабатывать, мы добавим две переменные — maxSpeed и dead (не забудем присвоить им исходные значения в конструкторе). Переменная maxSpeed (тип данных int) будет представлять максимально допустимую скорость нашего транспортного средства. Переменная dead (тип данных bool) будет использована для хранения информации о текущем состоянии автомобиля — взорвался он уже или нет. После того как эти переменные будут добавлены в заголовочный файл, изменим метод SpeedUpO
Предыдущая << 1 .. 230 231 232 233 234 235 < 236 > 237 238 239 240 241 242 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100