CallBack из внешнего сервера
От: olafpalmer Россия  
Дата: 19.04.02 16:53
Оценка:
Хочу реалзиовать следующую схему: есть внешний сервер COM, который умееет обращаться к БД.
С ним работают клиенты, причем работают по серийному принципу:
заблокировал, спросил, подождал ответа, раблокировал.
Все вроде просто, но есть один нюанс: перед тем как вызвать запрос, клиент отдает серверу адрес своей функции, чтобы сервер во время выполнения запроса мог спросить что либо у клиента сам, с помощью этой функции.
Как написать такой сервер? Конкретно если, то не могу написать свойство, в которое можно присвоить адрес функции с параметрами.
Пишу все в DELPHI, поэтому желательно реццепты давать применительно к данному средству быстрого
приготовления программных блюд
Re: CallBack из внешнего сервера
От: George_Seryakov Россия  
Дата: 19.04.02 17:05
Оценка:
Здравствуйте olafpalmer, Вы писали:

O>Все вроде просто, но есть один нюанс: перед тем как вызвать запрос, клиент отдает серверу адрес своей функции, чтобы сервер во время выполнения запроса мог спросить что либо у клиента сам, с помощью этой функции.


Передавай не адрес функции, а указатель на интерфейс.

Подробнее: В клиенте сделай COM-объект, при вызове сервера создавай его, его интерфейс передавай COM-вызовом на сервер. IDL будет выглядеть типа HRESULT method(... , IYourInterace* pIface);. COM сам должен все отмаршаллить. От сервера вызовешь метод этого интерфейса. Не забудь, что обратный вызов тоже требует прав, как и прямой, о безопасности придется позаботиться.
GS
Re[2]: CallBack из внешнего сервера
От: olafpalmer Россия  
Дата: 22.04.02 11:11
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>Здравствуйте olafpalmer, Вы писали:


O>>Все вроде просто, но есть один нюанс: перед тем как вызвать запрос, клиент отдает серверу адрес своей функции, чтобы сервер во время выполнения запроса мог спросить что либо у клиента сам, с помощью этой функции.


GS>Передавай не адрес функции, а указатель на интерфейс.


GS>Подробнее: В клиенте сделай COM-объект, при вызове сервера создавай его, его интерфейс передавай COM-вызовом на сервер. IDL будет выглядеть типа HRESULT method(... , IYourInterace* pIface);. COM сам должен все отмаршаллить. От сервера вызовешь метод этого интерфейса. Не забудь, что обратный вызов тоже требует прав, как и прямой, о безопасности придется позаботиться.

Спасибо за подробный ответ. У меня встречный: что значит в COM заботиться о безопасности?
И еще один:
Не понимаю как сделать внешний COM сервер посредством DELPHI6
В документации сказано, что для создания внешнего сервера нужно создать банальное приложение DELPHI (Application) и в нем создать Automation Object. Так и делаю, но в редакторе библиотеки не вижу кнопки "Зарегистрировать компонент" (хотя если делать ActiveX library, то такая кнопка есть)
Что это значит:
1.нужно регистрировать самому?
2.Что регистрировать: exe-шник?
3.Я что-то делаю не так и зарегистрировать нельзя в принципе?
Re[3]: CallBack из внешнего сервера
От: George_Seryakov Россия  
Дата: 22.04.02 12:58
Оценка:
Здравствуйте olafpalmer, Вы писали:

O> Спасибо за подробный ответ. У меня встречный: что значит в COM заботиться о безопасности?


Значит:Выяснить 1) под какими логинами выполняются клиент и сервер (это два приложения, так?), 2) имеет ли логин клиента право на серверной машине на создание и/или вызов сервера. Должен иметь такое право. Если нет, то нужно давать. Или null security делать (посмотри поиск по форуму на CoInitializeSecurity).

O>Не понимаю как сделать внешний COM сервер посредством DELPHI6

...
O>1.нужно регистрировать самому?
O>2.Что регистрировать: exe-шник?
O>3.Я что-то делаю не так и зарегистрировать нельзя в принципе?

В дельфях я тебе не помошник. Но можно было бы проверить следы регистрации в registry — просто поищи имя своего исполняемого файла. Регистрация экзешников обычно делается запуском этиго экзешника (иногда с ключом типа /RegServer).
GS
Re[4]: CallBack из внешнего сервера
От: Аноним  
Дата: 22.04.02 14:48
Оценка:
Здравствуйте George_Seryakov, Вы писали:

GS>В дельфях я тебе не помошник. Но можно было бы проверить следы регистрации в registry — просто поищи имя своего исполняемого файла. Регистрация экзешников обычно делается запуском этиго экзешника (иногда с ключом типа /RegServer).


Именно так Дельфи и делает (и запуск, и параметром /RegServer).
Re[5]: CallBack из внешнего сервера
От: olafpalmer Россия  
Дата: 22.04.02 14:55
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте George_Seryakov, Вы писали:


GS>>В дельфях я тебе не помошник. Но можно было бы проверить следы регистрации в registry — просто поищи имя своего исполняемого файла. Регистрация экзешников обычно делается запуском этиго экзешника (иногда с ключом типа /RegServer).


А>Именно так Дельфи и делает (и запуск, и параметром /RegServer).


Еще по DELPHI:
сделал новое приложение,
создал в нем Automation Object,
выполнил с параметром RegServer — информация прописалась в реестр.
Но создать не могу — CreateOleObect вещает, что "Произошла ошибка при запуске приложения сервера".
Делал все при помощи мастеров, сам в код (кроме реализации ессно) ничего не прописывал. В чем может быть дело?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.