![]() |
|
Модераторы: MetalFan |
![]()
|
|
| Caduser |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: нет Всего: 1 |
Есть множество некоторых функций сервера приложений которые вызываются в клиенте так:
необходимо поместить вызов этих функций в поток, как это сделать? Пробовал так: Поместить объект DCOM в поток очень просто:
затем из основной программы:
Однако этот способ не эффективен т.к.: 1. будет замедлять скорость вызова пропорционально увеличению числа функций. 2. ситуация усложняется тем, что разным функциям нужно передавать различные параметры (например: DCOM.AppServer.Func5(par1, par2, par3); Прошу помощи в поиске эффективного решения (например с помощью переменной вариантного типа)??? Это сообщение отредактировал(а) Caduser - 24.1.2007, 02:55 |
||||||
|
|||||||
| CatATonik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 12.1.2007 Где: Москва Репутация: 2 Всего: 8 |
Единственное универсальное решение которое приходит мне в голову, это передавать потоку название функции и список параметров, в виде вариантного массива, затем вызывать соответствующую функцию через IDispatch.Invoke.
Гемморойно, зато универсально. |
|||
|
||||
| Caduser |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: нет Всего: 1 |
пусть геморойно, мне важно чтоб скорость вызова функции снизилось не значительно. IDispatch.Invoke А можно хотябы приблизительно накидать, как это будет выглядеть? Может как то так?
Это сообщение отредактировал(а) Caduser - 24.1.2007, 09:56 |
||||
|
|||||
| CatATonik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 12.1.2007 Где: Москва Репутация: 2 Всего: 8 |
Вот примерный набросок, также смотри функцию DispatchInvoke в модуле ComObj.
|
|||
|
||||
| Caduser |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: нет Всего: 1 |
Спасибо CatATonik, чувствую ответ уже близко. Во всяком случае этот код:
DispId функции возвращает верно, но безнадёжно спотыкается на:
с ошибкой "OLE error C0000005" тестовая функция не имеет параметров, но подозреваю что дело в переменной Params: TDispParams, не понятно как её заполнять? Вообще есть библиотека типов сервера (_TLB.pas) может его как то прикурить сюда? например DispId можно оттуда взять, тогда не нужен будет метод GetIDsOfNames. Это сообщение отредактировал(а) Caduser - 25.1.2007, 09:44 |
||||
|
|||||
| CatATonik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 12.1.2007 Где: Москва Репутация: 2 Всего: 8 |
Так трудно сказать в чем дело. Может Result не установлен?
|
|||
|
||||
| Caduser |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 71 Регистрация: 2.10.2006 Где: г. Хабаровск Репутация: нет Всего: 1 |
Заработало! Подвела меня невнимательность
Спасибо, CatATonik! P.S. Единственный недостаток всего этого - неудобно формировать параметры для функций, уж больно их много у меня. Особенно обидно что все функции уже описаны в _TLB.pas , теперь задумался - а может раннее связывание можно организовать, и быстрее будет работать, и проверка корректности вызовов сразу будет? Это сообщение отредактировал(а) Caduser - 26.1.2007, 05:52 |
||||
|
|||||
![]()
|
| Правила форума "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. |