Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

Доступ к 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 вся ветка

Форум: "Corba";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.019 c
15-1142877765
AlterEgo of WondeRu
2006-03-20 21:02
2006.04.09
Перевод слова MAKESPAN?


2-1143233546
Adil
2006-03-24 23:52
2006.04.09
TWebBrowser i JavaScript


15-1142687201
Новочеркасский Волк
2006-03-18 16:06
2006.04.09
2 месяца не могу понять в чём ошибка?!?!?


4-1138077362
Atheist
2006-01-24 07:36
2006.04.09
Нестандартный edit (получение текста)


1-1141306181
MegaVolt
2006-03-02 16:29
2006.04.09
Как выводить статус от нескольких потоков?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский