Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  01:05[Войти] | [Зарегистрироваться]
Ответ на вопрос № 22399

15-05-2004 08:37
Здравствуйте.
Задача простая: передать память обекта TMemoryStream c COM-сервера на клиент (живут на разных компьютерах).

Решил так: создаю массив (встроенный динамический), заполняю из MemoryStream,
присваиваю вариантной переменной, отправляю.

Мне кажется, что это решение - тормоз. Нет ли других возможностей?

И более общий вопрос: каким способом лучше всего передавать массивы данных такого рода
от одного приложения другому, работающим на разных компьютерах. Если есть ссылки на
документацию - сбросьте пожалуйста.

Спасибо.

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

20-05-2004 14:58
Для КоньВПальто

Отправил.

Она этого не понимает?
Если да, то значит библиотеку нужно писать на С/С++ и компилировать, как вы говорили, midl.exe?..


Не знаю, может, есть способ. Никогда не писал COM-серверы на Delphi.

19-05-2004 20:18 | Сообщение от автора вопроса
С удовольствием прочитаю, спасибо.
Мой ящик, не трудно догадаться, CoatedHorse@mail.ru :)

Набираю в редакторе библиотеки типов:
HRESULT SendArray([in]int ElementSize; [in,size_is(ElementSize)] int* Element[]);
а Delphi ругается на size_is...
Она этого не понимает?
Если да, то значит библиотеку нужно писать на С/С++ и компилировать, как вы говорили, midl.exe?..
:(

19-05-2004 12:42
Инна, я отправил, ловите.

А что за центр?
http://www.rtsoft-training.ru/, http://www.rtsoft.ru/education/

Мои курсы - "COM/DCOM, OPC, ActiveX" и "Разработка OPC-серверов".

19-05-2004 11:46
aie@mail.ru
>>>В нашем учебном центре я читаю лекции
А что за центр?

19-05-2004 11:29
Инна, а куда высылать-то? Со страницы с вашим профайлом нельзя отправить письмо с вложением.

19-05-2004 10:17
Антон, вышлите, пожалуйста, и мне!

19-05-2004 09:50
(с учётом того, что параметры могут сами быть указателями, и те области памяти, на которые они указывают, тоже должны попасть в поток) - здорово.

Если вы уже успели близко познакомиться с IDL, то знаете, что параметры-указатели там обязательно сопровождаются атрибутами ref, unique или ptr. Если структура, описанная на IDL, содержит указатели, то они тоже должны иметь соответствующие атрибуты. Есть ещё атрибуты atring, size_is, iid_is и другие, которые служат для того, чтобы заместитель знал, как упаковывать в поток ту область памяти, на которую ссылается указатель.

В нашем учебном центре я читаю лекции, в т.ч. и по COM/DCOM. Когда-то я написал учебное пособие по своим материалам. Оно ориентировано на использование VC++, но там всё равно есть немало полезной для начинающего информации. Если хотите, могу выслать вам ту главу своего пособия, в которой идёт речь о COM/DCOM.

18-05-2004 18:47 | Сообщение от автора вопроса
(с учётом того, что параметры могут сами быть указателями, и те области памяти, на которые они указывают, тоже должны попасть в поток) - здорово.

18-05-2004 18:35 | Сообщение от автора вопроса
Антону Григорьеву .
Спасибо за ответ, так подробно! :)
Про виды маршалинга ещё не слышал.

Спасибо. Буду копать.

18-05-2004 17:17
По MSDN'у если поискать, то там про маршалинг много чего есть. Но там всё очень сложно, для предварительного знакомства плохо подходит. Электронного источника для начинающих подсказать не могу, только печатную книгу Э.Трельсен "Модель COM и применение ATL 3.0".

Вкратче могу сказать следующее: в COM/DCOM клиент оперирует указателем на объект, который расположен в адресном пространстве другого процесса и, может быть, даже на другом компьютере. Понятно, что указатель на этот объект существовать не может. Реально в адресное пространство клиента загружается заместитель (proxy), а в адресное пространство сервера - заглушка (stub). Заместитель создаёт объект, на который реально ссылается клиент. Вызов функции сервера происходит следующим образом: на самом деле клиент вызывает функцию объекта заместителя. Этот объект упаковывает параметры функции в поток (с учётом того, что параметры могут сами быть указателями, и те области памяти, на которые они указывают, тоже должны попасть в поток) и передаёт этот поток стандартному системному объекту канала. Далее поток передаётся системными средствами объекту канала на стороне сервера, тот передаёт этот поток заглушке, заглушка восстанавливает в адресном пространстве сервера всю ту структуру данных, которая была передана клиентом, и вызывает требуемую функцию сервера, передавая ей копии параметров в адресном пространстве сервера. Результат работы функции сервера передаётся по этой же цепочке в обратном порядке.

Процесс упаковки данных в поток называется маршалингом (marshling), извлечения из потока - обратным маршалингом (unmarshaling). Очевидно, что для выполнения маршалинга необходимо учитывать специфику объекта, построение универсальной заглушки и заместителя невозможно. Существует три вида маршалинга:

1. Пользовательский. COM-объект реализует интерфейс IMarshal, функции которого осуществлят упаковку данных. Самый сложный и самый редкоиспользуемый способ.

2. Универсальный. Заместитель и заглушка строится стандартной системной библиотекой oleaut32.dll. Для их построения oleaut32.dll берёт информацию из т.н. библиотеки типов, которая может быть реализована в виде отдельного файла с расширением tlb или внедрена в файл сервера. Достоинтсва метода - простота, недостаток - oleaut32.dll может осуществлять маршалинг только функций, параметры которых имеют Variant-совместимые типы. Универсальный маршалинг иногда называют type-library marshaling. Библиотека типов должна быть создана разработчиком сервера (обычно она создаётся автоматически при компиляции IDL-файла).

3. Стандартный. Заместитель и заглушка реализуются специальной proxy/stub dll, которая индивидуальна для каждого сервера и должна создаваться автором сервера. Достоинства - практически нет ограничений на типы параметров, относительная простота (по сравнению с пользовательским маршалингом). Недостатки - автор сервера должен возиться с созданием этой библиотеки и таскать её всюду, где будет клиент или сервер.

Как создаётся proxy/stub dll средствами Delphi, я не знаю. Знаю только, что в составе VisualC++ есть компилятор IDL-файлов midl.exe, который на основе IDL-описания объекта генерирует для него исходники (на C и C++), из которых можно собрать эту библиотеку.

17-05-2004 17:08 | Сообщение от автора вопроса
Юрию Хапёрскому:
Пробовал подобный вариант, только не блокировал массив. Взглянул на ваш вариант и вспомнил Тейксеру и Пачеку - читал, ведь, у них про VarArrayLock, но забыл :) - наверно нужно спать побольше :)

В третьей строке, я так понял, опечатка: BufPointer := VarArrayLock(LBuffer);

Спасибо за ответ.

Антону Григорьеву:
Вечером попробую реализовать. Сразу по следам ответа нашёл в W32' Developers Reference статьи "Arrays and Pointers", "Arrays" из раздела о RPC - там что-то похожее есть... Просто первый раз слышу об универсальном и стандартном маршалинге (сейчас я только обнюхиваю COM) - ни на что не сошлётесь?

Спасибо.

17-05-2004 13:30
Есть такой способ передачи данных (прототип функции на IDL для массива типа Integer):

HRESULT SendArray(
[in,size_is(Size)]int* Array,
[in]int Size);

Идея, думаю, понятна: передаётся указатель на первый элемент массива и его длина. Благодаря атрибуту size_is прокси знает, как осуществлять маршалинг. Проблема только в том, что oleaut32.dll такое не прожуёт, и вместо универсального маршалинга придётся использовать стандартный со всеми вытекающими неудобствами.


17-05-2004 07:07
Примерно так:
...
  BufferSize := MemStream.Size;

  LBuffer := VarArrayCreate([0, BufferSize - 1], varByte);
  BufPointer := VarArrayLock(Buffer);
  try
    Move(MemStream.Memory^, BufPointer^, BufferSize);
  finally
    VarArrayUnLock(Buffer);
    FreeAndNil(MemStream);
  end;

Способ не такой уж и тормозной, как вы думаете. В COM бинарные данные передаются как правило только с помощью Variant arrays (если не изощряться конечно). Так делают все, так что не заморачивайтесь по этому поводу. ;)
Удачи!

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
"Мы с тобой одной крови — ты и я!". Чьи это заветные слова?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования