Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сервер автоматизации обрабатывать массив структур


aserov ©   (2002-08-13 15:36:00) 

Доброе время суток. Обозначилась проблема следущего характера: при реализации сервера автоматизации возникла необходимость передавать с клиента на сервер массив структур (packed record) переменной длины (что то типа TList). Пробовал использовать SafeArray однако что то не получается присматривался к IStrings но тут только строки вроде. Подскажите пожалуйста решение (если оно есть). Заранее благодарен.


А. Н. Оним   (2002-08-13 16:50:00) [1]

Пардон, ProxyStub DLL конечно же одна. Но регистрировать её придётся как на клиентской машине, так и на серверной.


А. Н. Оним   (2002-08-13 16:46:00) [2]

Если бы Delphi позволял строить действительно не Ole-совместимые интерфейсы (что связано с генерацией ProxyStub DLL, но Delphi не умеет строить ProxyStub DLL), то интерфейс, передающий последовательность структур в MIDL мог бы быть описан например так:

typedef struct MyRec
{
   long a;
   BSTR b;
} tagMyRec;

[
   object,
   uuid(........-....-....-....-............),
]

interface Itest : IUnknown
{
   HRESULT CallMe ([in] int Count, [in, size_is (Count)] tagMyRec *Recs);
};
 
К сожалению, метод типа CallMe в Delphi описать нельзя. Насколько я понимаю, SafeArray'ем передать последовательность структур также нельзя, так как SafeArray это массив вариант-совместимых типов, а тип структуры - уже не Variant совместимый.
 Могу предложить три некрасивыхспособа:
1. Запихать область памяти со структурами в строку типа WideString и послать серверу на распаковку (или скопировать память в SafeArray типа Byte). Если в структуре нет указателей, то код для посылки и раскрывания должен получиться достаточно простым.
2. Представить массив структур опять-таки строкой, но уже синтаксически осмысленной. Например, массив структур типа MyRec мог бы быть описан как "a=10, b='Hello!';a=2;a=4". Серверу придётся заниматься синтаксическим анализом, однако этот способ хорош тем, что позволяет иногда сэкономить траффик на параметрах по умолчанию. Если твои структуры разрежены (много незаполненных полей), то при посылке пустые поля можно просто пропускать в описании.
3. Описать интерфейс в MSVC как было показано выше, собрать там же ProxyStub DLL, затем полученную TypeLIB импортировать в Delphi'йском проекте, добавить в список наследований твоего ко-класса новый интерфейс (в обход TypeLIB'а самого проекта) и радоваться жизни. Однако теперь, придётся за собой таскать эти самые ProxyStub DLL'ки, собранные в MSVC.



Наверх

Титульная страница Поиск, карта сайта Написать письмо