Текущий архив: 2006.04.09;
Скачать: CL | DM;
ВнизДоступ к RemoteDataModule из Borland Socket Server? Найти похожие ветки
← →
sinsin (2005-05-17 17:53) [0]Уважаемые коллеги!
Имеется трехуровневое MIDAS-приложение, связь через TSocketConnection.
На сервере вертится Socket Server (scktsrvr.exe), все работает.
Стоит задача: в RemoteDataModule, создаваемом для клиента, определить НОМЕР ПОРТА, на который этот клиент был принят.
Насколько я понимаю, для этого придется переписать scktsrvr, ибо только он "знает" на какой порт пришел клиент (или я не прав?). В связи с этим и возникает вопрос: как из Socket Server-а достучаться до RemoteDataModule, чтоб "сообщить" ему номер порта?
Все мои попытки получить указатель на интерфейс RemoteDataModule успехом не увенчались. Однако, именно Socket Server передает клиенту этот указатель! Значит, должен иметь к нему непосредственный доступ. Думается, что решение лежит просто на поверхности, но найти не могу.
Помогите, пожалуйста!
← →
Dok_3D © (2005-05-17 23:04) [1]Может, не парится, и передать номер порта с клиента(через метод сервера)? Этот вариант хорош, если используются только "твои" клиенты.
Все мои попытки получить указатель на интерфейс RemoteDataModule успехом не увенчались.
А это еще почему? Из сокет-сервера ты имеешь ссылку на интефейс сервера приложений. Пользуй его как тебе нужно.
← →
Sinsin (2005-05-18 11:10) [2]Спасибо, что откликнулись!
не парится, и передать номер порта с клиента(через метод сервера)?
К сожалению, нельзя. Несмотря на то, что используются только "свои" клиенты, необходимо будет производить их аутентификацию (сторонними средствами), а там на входе нужен номер порта.
Из сокет-сервера ты имеешь ссылку на интефейс сервера приложений. Пользуй его как тебе нужно.
Вот здесь - подробнее, пожалуйста! Где появляется эта ссылка, в какой процедуре?
Ради Бога, не пинайте за ламерство. Мне кажется, что копать надо в TSocketDispatcherThread.ClientExecute. А именно:begin
CoInitialize(nil);
try
Synchronize(AddClient);
FTransport := CreateServerTransport;
try
Event := FTransport.GetWaitEvent;
PeekMessage(msg, 0, WM_USER, WM_USER, PM_NOREMOVE);
GetInterface(ISendDataBlock, Obj);
- вот здесь создается ссылка, верно?
Но если теперь написать что-то вроде
IApplicServ(Obj).SomeProcExecute
или
IApplicServDisp(Obj).SomeProcExecute
или
(Obj as IApplicServ).SomeProcExecute
,
то неизменно имеем ошибку чтения памяти.
(библиотека типов с IApplicServ, естественно, прописана в uses).
То ли я неправильно вызываю интерфейс, то ли искать его надо совсем не здесь...
← →
Dok_3D © (2005-05-18 13:21) [3]В общем, не совсем так.
В TSocketDispatcherThread.ClientExecute есть строчка:FInterpreter.InterpretData(Data);
В этой операции, грубо говоря, происходит распарсивание команды от клиента. Одной из команд может быть команда на создание COM-объекта (сигнатура asCreateObject).
Вот.
Нужно немного попутешествовать по SConnect.pas.
Если провалится в InterpretData
, затем в asCreateObject: DoCreateObject(Data);
, затем в V := CreateObject(ReadVariant(VarFlags, Data));
, затем в Result := InternalCreateObject(ClassID)
, затем в asCreateObject: DoCreateObject(Data);
то можно наткнуться на чудесную команду CoCreateInstance.
А уж для чего это команда и что возвращает, ты, думаю, знаешь :)
Удачи.
← →
Sinsin (2005-05-18 17:33) [4]Спасибо огромное, Dok_3D !
Теперь, думаю, все получится!
Страницы: 1 вся ветка
Текущий архив: 2006.04.09;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.02 c