![]() |
|
Модераторы: MetalFan |
![]()
|
|
| Ahmed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.11.2006 Репутация: нет Всего: нет |
Господа, добрый день. Помогите разобраться с проблемой.
Нужно обработать событие com-объекта CreateSession( .. ); Это событие описано в интерфейсе ISessionEvents = dispinterface ['{67В71FA4-9381-4061-B3BB-74A545C75874}'] procedure CreateSession(const Session: GuiSession); dispid 514; end; Есть пример на VBScript. Нужно это же сделать на Delphi. Кто сможет помочь?
|
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
На Delphi вообще-то достаточно сделать Import type library с инсталляцией компонента. Насколько я понял, объест самописный?
|
|||
|
||||
| Ahmed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.11.2006 Репутация: нет Всего: нет |
К сожалению сом-объект несамописный. Я импортнул библиотеку типов. Просто как прикрутить к событию CreateSession свой обработчик. Через object inspector/events не получится, потому что это событие описано в другом интерфейсе. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
В этом случае прикручивание состоит в том, что ты должен сам реализовать объект-обработчик.
Если импортнул библиотеку, то там, насколько я понял, и описан ISessionEvents. Делай следующее: 1. New -> ActiveX -> AutomationObject 2. Именуй как хочешь. О выборе Threading model - потом поговорим 3. в получившемся модуле в uses интерфейсной части сразу пиши модуль импорта библиотеки 4. View -> type library. Там на вкладке uses выбирай ту библиотеку, которую импортировал (намекаю: используй правую клавишу мыши) 5. ТАм же смело удаляй интерфейс только что созданного объекта 6. Вставай на кокласси в закладке implemets добавляй ISessionEvents 7. рефреш - и у тебя в модуле должен быть метод CreateSession. Все. Пиши в этом методе, что нужно. Можно и проще, но проще - объяснять дольше Теперь модель потока: сделаешь апартмент, как по умолчанию - метод будет дергаться в другом потоке, нужна синхронизация. Рекомендую single, чтобы не париться... А вот как запихнуть твой объект-событие в ScriptingEngine - тут надо смотреть на описание... Навскидку не скажу, что делает WScript.ConnectObject Ну не работал я с IConnectionPoint |
|||
|
||||
| Ahmed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.11.2006 Репутация: нет Всего: нет |
Сделал.
Только теперь проект не компилируется. TMyClass = class(TAutoObject, ISapSessionEvents) protected procedure CreateSession(const Session: GuiSession); stdcall; ... Ошибка : Interface type required Ругается на ISapSessionEvents |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
А что в ..._TLB.pas написано?
|
|||
|
||||
| Ahmed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.11.2006 Репутация: нет Всего: нет |
type
... ISapSessionEvents = dispinterface; // *********************************************************************// // DispIntf: ISapSessionEvents // Flags: (4096) Dispatchable // GUID: {67A71FA4-9381-4061-B3BB-74A545C75874} // *********************************************************************// ISapSessionEvents = dispinterface ['{67A71FA4-9381-4061-B3BB-74A545C75874}'] procedure CreateSession(const Session: GuiSession); dispid 514; ... end; таким образом декларирован. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
А, только disp... Сорри, но тогда не пойдет
Я уже запутался. Забудь все, что я говорил, у тебя обычный объект с событиями. Импортируй библиотеку с флажком "Generate component wrapper", тогда у тебя будет класс, с property CreateSession, и все будет прозрачно. Инсталлировать, кстати, и не надо, просто Create unit. |
|||
|
||||
| Ahmed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.11.2006 Репутация: нет Всего: нет |
Дело в том, что класс этого интерфейса не создается при импорте TLB-файла. Было бы все просто и прозрачно. События декларированы в интерфейсе ISapSessionEvents. И все. в TLB больше нет упоминания об этих событиях. Я поэтому и привел пример VBScript'a, в котором все работает.
|
|||
|
||||
| Romkin |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
Как это нет?! При импорте, если заказываешь враппер, создается класс, с нужным событием. Вручную писать - замучаешься.
Вот что примерно должно быть:
И название последнего свойства - как раз обработчки события:
|
||||
|
|||||
| Ahmed |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 27.11.2006 Репутация: нет Всего: нет |
Не так выразился.
Ни в одном сгенеренном классе не описывается это событие "CreateSession". Например,
И так же примерно в других классах. |
|||
|
||||
| Romkin |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 189 Регистрация: 14.11.2006 Где: Москва Репутация: нет Всего: 5 |
Тогда вряд ли я сейчас смогу что-то сказать. Просто не попадалось такого.
Могу только подсказать, что использовать надо ConnectEvents, ручками. У потомков TOleServer как раз это есть. Прямо в Connect:
Как все делается автоматически (как должно), можено увидеть, быстро создав ActiveX Library с Automation object, у которого при создании включено "Generate event support code". Эвенты вводятся как методы у dispinterface. |
|||
|
||||
![]()
|
| Правила форума "Delphi: ActiveX/СОМ/CORBA" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |