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

Вниз

Передача методу COM-сервера объекта(TClientDataSet) в параметре   Найти похожие ветки 

 
А. Н. Оним   (2002-07-31 16:55) [0]

В DLL да ещё и на одной машине такие фокусы как передача экземпляров класса всегда будет проходить, так как и сервер и клиент живут в одном адрессном пространстве и всё что нужно сделать, так это обратиться к одному участку памяти. Правда я не гарантирую, что это будет работать, если клиент и сервер будут скомплированы на разных версиях Delphi. Но пока это прекрасно получается и переданная тобой ссылка на экземпляр класса DataSet (как указатель на область памяти) будет иметь смысл для сервера.
 Как только клиент и сервер живут в разных адрессных пространствах - всё летит кувырком и указатель на область памяти клиента для сервера теряет всякий смысл. DataSet не является COM объектом, поэтому его передача в вызове метода не приведёт к процессу маршлалинга (создания прокси клиентского экземпляра кокласса на сервере) и его передача как в случае InProc взаимодействия невозможна.
 Не очень всё-таки понимаю, что за задача решается, но могу предложить следующий общий подход: реализовать в серверном коклассе методы обмена информацией между клиентом и сервером. Когда на клиенте происходят изменения, то клиент посылает обновлённые значения на сервер и наоборот, сервер посылает изменённые значения в качестве CallBack"ов клиенту через клиентский Sink объект. Для Callback"ов Посмотри интерфейсы IConnectionPointContainer, IConnectionPoint. Если ты пишешь в Delphi, то вопрос обратных вызовов рассматривается, например, во II томе Стива Тейксера (Delphi 5 руководство разработчика) со страницы 245.
 Нельзя ли поподробней рассказать о решаемой задаче?  


 
А. Н. Оним   (2002-07-31 17:16) [1]

Можно попробовать так:
1. --Клиент--
 Клиент содержит COM объект-обёртку, что реализует пару интерфейсов. Например, IDataSet и IPersonal.
* IDataSet содержит примерно те же методы, что и TDataSet
* IPersonal позволяет назначить объекту управляемый им DataSet.
 Клиент создаёт экземпляр такого кокласса, и через IPersonal передаёт ему экземпляр DataSet"а. Так как и DataSet и COM объект в одном процессе (InProc) - это пройдёт. Предполагается, что клиентский COM объект реализует IDataSet перенаправлением вызовов метода этого интерефейса на назначенный ему через IPersonal экземпляр DataSet.
2. --Сервер--
 Сервер выставляет ConnectionPoint, позволяющий принимать такие обёртки.
3. --Клиент--
 Клиент посылает серверу такую обёртку (например, через IConnectionPoint сервера).
4.  --Сервер--
 На Сервер есть класс, который является наследником DataSet, но перенаправляет вся вызовы своих методов (делегирует вызовы) на объект обёртку, а ещё конкретней на его интерфейс IDataSet, полученный от клиента.

 В этой схеме клиент может менять данные в своём реальном DataSet"е, а сервер, обладающий прокси обёртки клиента, дёргает через проксие клиентский объект, тот, в свою очередь, дёргает назначенный ему DataSet, а уже тот и выполняет все операции. По идее, всё должно работать.


 
Robin ©   (2002-07-31 17:56) [2]

А. Н. Оним   (31.07.02 17:16) >

 Спасибо за мысль.
 Пойду вчитаюсь во II-й том Стива Тейксера.
Бо пока не очень все понятно: как реализовать
IDataSet (т.е. в моем случае IClientDataSet) и в чем идея IPersonal?

 Если можно, немножко разъясните.

 




 
DiamondShark ©   (2002-07-31 18:10) [3]

А что, TRemoteDatamodule, TDatasetProvider уже отменили?


 
А. Н. Оним   (2002-07-31 18:19) [4]

 Полагаю, что DiamondShark прав и есть более простые решения этой проблемы (но сам я, признаться, подолгу не работал ни с DataSet"ами, ни с RemoteDataModul"ями) и COM кажется притянутым здесь за уши.
 Назначение IPersonal очень простое. Передать экземпляру CoClass ссылку на DataSet. Это можно сделать тысячью способов и обойтись без этого COM-интерфейса, но у меня просто правило такое - доступ к СOM объекту (даже внутри его сервера) только через его COM интерфейсы. Не нравится - не надо.


 
Robin ©   (2002-08-01 15:21) [5]

2 А. Н. Оним   (31.07.02 18:19)

Спасибо за разъяснения.
Немножко тут продвинулся передавая в COM не ClientDataSet, а
ClientDataSet.Data. Но в COM-объекте тогда получается  "подвисший" ClientDataSet, т.е. без Providerа.

2 DiamondShark ©   (31.07.02 18:10)

Но чего то не догоняю: ведь TRemoteDatamodule - тоже COM-объект.
То есть приходим к DCOMConnection. Или я не прав?
 Можно пожалуйста поподробнее.



 
Romkin ©   (2002-08-14 22:32) [6]

Насколько понял, нужен просто MIDAS server в dll, так будет проще всего. Я вижу два варианта
1. Создать ActiveX library а в ней RemoteDataModule, а подключиться действительно можно через TDCOMConnection - что мешает? Просто не указывать имя хоста, и будет подгрузка
2. Тоже самое, но для подключения вызывать CreateOleObject/CreateCOMObject и др., с прямым преобразованием к IAppServer (Delphi 5?), и вручную работать с данными через методы этого интерфейса
3. Реализовать собственный T...Connection по аналогии с TDCOMConnection, это просто, там буквально два или три метода

2 А. Н. Оним а то, что если используешь COM, то передавать только интерфейсы - поддерживаю полностью



Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.057 c
14-1091014194
peypivo
2004-07-28 15:29
2004.08.15
Для абонентов UMC и Киевстар


3-1090227091
PokSer
2004-07-19 12:51
2004.08.15
DBF-файл и ДОС-кодировка


3-1090406510
Fynjy1984
2004-07-21 14:41
2004.08.15
Редактируемый запрос в ADOQuery


6-1086970510
Neo09
2004-06-11 20:15
2004.08.15
Проблема с "net send"ом.


9-1083242798
HardPac
2004-04-29 16:46
2004.08.15
Hard-Pac (скриншоты в догонку)





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский