Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Есть Out-process COM сервер. Написан на C++ и COM-клиент, написан на Delphi. И сервер и клиент мои.

Нужно из клиента в сервер передать такой массив
type
  TDblPoint = record
    X, Y: Double;
  end;

  TPointList = array of TDblPoint;
Передача должна быть OLE-совместимой. Как это сделать быстрее и проще?

Сейчас у меня в цикле вызывается метод
HRESULT _stdcall AppendPoint([in] double x, [in] double y);
Но для большого числа точек (~500) получаются ощутимые задержки. Поэтому хочется весь массив передать за один раз.

Придумал два варианта:
1. Сложить точки в IStream и передать. Из плюсов - простота реализации и клиента и сервера. Из минусов жесткая привязка на двоичный формат
2. Передать двумя вариантными массивами. В один сложить все X, в другой все Y. Минусы - очень геморройно работать с вариантами из C++

Может еще идеи есть?

С уважением, Vasilisk
4 апр 21, 15:38    [22304104]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62646
Да сложи в один массив и "читай" парами.

Posted via ActualForum NNTP Server 1.5

4 апр 21, 16:06    [22304108]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Гаджимурадов Рустам
Да сложи в один массив и "читай" парами.
Тогда уже проще двумя массивами. Ошибок меньше будет
4 апр 21, 16:44    [22304115]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62646
Ну можно и двумя...

Posted via ActualForum NNTP Server 1.5

4 апр 21, 17:03    [22304119]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
_Vasilisk_,

_Vasilisk_
Передача должна быть OLE-совместимой.

что значит?
5 апр 21, 09:17    [22304201]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
kealon(Ruslan)
что значит?
Чтобы при импорте dispinterface не появлялись такие сообщения
procedure LoadData(AGUID: {NOT_OLEAUTO(TGUID)}OleVariant; const AData: IUnknown); dispid 106;
Тынц
5 апр 21, 13:01    [22304372]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
_Vasilisk_
kealon(Ruslan)
что значит?
Чтобы при импорте dispinterface не появлялись такие сообщения
procedure LoadData(AGUID: {NOT_OLEAUTO(TGUID)}OleVariant; const AData: IUnknown); dispid 106;
Тынц
понятно, "что п с бейсика можно было вызывать"
только массив выходит, как уже предложили
5 апр 21, 13:13    [22304382]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
kealon(Ruslan)
понятно, "что п с бейсика можно было вызывать"
На самом деле только так можно заставить работать 64-битный сервер в 32-битном клиенте
kealon(Ruslan)
только массив выходит,
Не просто массив, а массив, упакованный в вариант
5 апр 21, 13:31    [22304393]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
_Vasilisk_
kealon(Ruslan)
понятно, "что п с бейсика можно было вызывать"
На самом деле только так можно заставить работать 64-битный сервер в 32-битном клиенте
kealon(Ruslan)
только массив выходит,
Не просто массив, а массив, упакованный в вариант
на самом деле нет, опиши запись и всё, стандартный маршалер сможет её перекинуть

тынц
5 апр 21, 15:29    [22304545]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
L_argo
Member

Откуда:
Сообщений: 1456
по сабжу: XML или JSON.
Универсально и гибко.
5 апр 21, 15:49    [22304571]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 62646
Оверкилл, даже JSON.
Впрочем, если скорость
неважна, можно и так.

Posted via ActualForum NNTP Server 1.5

5 апр 21, 15:57    [22304579]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
kealon(Ruslan)
опиши запись и всё, стандартный маршалер сможет её перекинуть
З записей я начинал два месяца назад. Пока их не убрал и аргументов, при создании объекта получал Interface not supported
5 апр 21, 16:15    [22304612]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
s62
Member

Откуда: Жуковский
Сообщений: 1299
_Vasilisk_,

типа такого не пробовал? Вроде стандартный вариант, в разных примерах его видел, вот из одной своей старой программы:
  TOutputs = array[0..7] of byte;
  TMState = record
    OutputsV: TOutputs;
    OutputsA: TOutputs;
  end;

function TShedPortSrv_.GetState8(out State: OleVariant): HResult;
var Size: integer;
    P: Pointer;
begin
  if OnLine then
  begin
    Size:=SizeOf(TMState);
    State:=VarArrayCreate([0, Size-1], varByte); //<----вот это вот
    P:=VarArrayLock(State);
    try
      Move(TM88Protocol.MState, P^, Size);
    finally
      VarArrayUnlock(State);  //досюда
    end;
    Result:=S_OK;
  end
  else Result := S_FALSE;
end;


Сообщение было отредактировано: 5 апр 21, 16:56
5 апр 21, 17:03    [22304660]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 2038
L_argo
по сабжу: XML или JSON.
Универсально и гибко.
+1
Гаджимурадов Рустам
если скорость неважна.

А если важна, то писать свою операционную систему реального времени.
5 апр 21, 18:19    [22304713]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

SafeArray

Posted via ActualForum NNTP Server 1.5

5 апр 21, 18:22    [22304716]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
Dimitry Sibiryakov
SafeArray
Тут палка о двух концах. Работа с SafeArray удобна из C++, но из Делфи это геморрой. А для VARIANT все наоборот - в делфи пара строчек, а в си пара экранов
6 апр 21, 12:08    [22304975]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
_Vasilisk_,

SafeArray это один из варинатов типа в Variant, не особо сложна с ним работа и в дельфях
6 апр 21, 17:23    [22305130]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 6314
_Vasilisk_
kealon(Ruslan)
опиши запись и всё, стандартный маршалер сможет её перекинуть
З записей я начинал два месяца назад. Пока их не убрал и аргументов, при создании объекта получал Interface not supported
странно, есть пример простой?
6 апр 21, 17:24    [22305131]     Ответить | Цитировать Сообщить модератору
 Re: Передача массива структур  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
kealon(Ruslan)
странно, есть пример простой?
Тупо один интерфейс, с одним методом, который принимает record. Сервер 64-битный, клиент 32-битный. TLB в ресурсах сервера
6 апр 21, 17:51    [22305146]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить