Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.029 c
1-1141745031
Кефир87
2006-03-07 18:23
2006.04.09
Минимизация НЕ главной формы


2-1143042991
mrAndersen
2006-03-22 18:56
2006.04.09
CopyFile


6-1134687059
Indy
2005-12-16 01:50
2006.04.09
[INDY] Как использовать TIdIOHandlerStream совместно с TIdNNTP?


4-1137749947
not_dev
2006-01-20 12:39
2006.04.09
Контроль компонентов


15-1142634527
hgd
2006-03-18 01:28
2006.04.09
Delphi for .NET Compact Framework Technology Preview