Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива структур / 19 сообщений из 19, страница 1 из 1
04.04.2021, 15:38
    #40059568
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
Есть Out-process COM сервер. Написан на C++ и COM-клиент, написан на Delphi. И сервер и клиент мои.

Нужно из клиента в сервер передать такой массив
Код: pascal
1.
2.
3.
4.
5.
6.
type
  TDblPoint = record
    X, Y: Double;
  end;

  TPointList = array of TDblPoint;

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

Сейчас у меня в цикле вызывается метод
Код: plaintext
1.
HRESULT _stdcall AppendPoint([in] double x, [in] double y);

Но для большого числа точек (~500) получаются ощутимые задержки. Поэтому хочется весь массив передать за один раз.

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

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

С уважением, Vasilisk
...
Рейтинг: 0 / 0
04.04.2021, 16:06
    #40059571
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
Да сложи в один массив и "читай" парами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
04.04.2021, 16:44
    #40059575
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
Гаджимурадов Рустам
Да сложи в один массив и "читай" парами.
Тогда уже проще двумя массивами. Ошибок меньше будет
...
Рейтинг: 0 / 0
04.04.2021, 17:03
    #40059579
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
Ну можно и двумя...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.04.2021, 09:17
    #40059632
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
_Vasilisk_,

_Vasilisk_Передача должна быть OLE-совместимой.
что значит?
...
Рейтинг: 0 / 0
05.04.2021, 13:01
    #40059749
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
kealon(Ruslan)
что значит?
Чтобы при импорте dispinterface не появлялись такие сообщения
Код: pascal
1.
procedure LoadData(AGUID: {NOT_OLEAUTO(TGUID)}OleVariant; const AData: IUnknown); dispid 106;

Тынц
...
Рейтинг: 0 / 0
05.04.2021, 13:13
    #40059754
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
_Vasilisk_
kealon(Ruslan)
что значит?
Чтобы при импорте dispinterface не появлялись такие сообщения
Код: pascal
1.
procedure LoadData(AGUID: {NOT_OLEAUTO(TGUID)}OleVariant; const AData: IUnknown); dispid 106;

Тынц
понятно, "что п с бейсика можно было вызывать"
только массив выходит, как уже предложили
...
Рейтинг: 0 / 0
05.04.2021, 13:31
    #40059762
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
kealon(Ruslan)
понятно, "что п с бейсика можно было вызывать"
На самом деле только так можно заставить работать 64-битный сервер в 32-битном клиенте
kealon(Ruslan)
только массив выходит,
Не просто массив, а массив, упакованный в вариант
...
Рейтинг: 0 / 0
05.04.2021, 15:29
    #40059861
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
_Vasilisk_
kealon(Ruslan)
понятно, "что п с бейсика можно было вызывать"
На самом деле только так можно заставить работать 64-битный сервер в 32-битном клиенте
kealon(Ruslan)
только массив выходит,
Не просто массив, а массив, упакованный в вариант
на самом деле нет, опиши запись и всё, стандартный маршалер сможет её перекинуть

тынц
...
Рейтинг: 0 / 0
05.04.2021, 15:49
    #40059880
L_argo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
по сабжу: XML или JSON.
Универсально и гибко.
...
Рейтинг: 0 / 0
05.04.2021, 15:57
    #40059883
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
Оверкилл, даже JSON.
Впрочем, если скорость
неважна, можно и так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.04.2021, 16:15
    #40059905
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
kealon(Ruslan)
опиши запись и всё, стандартный маршалер сможет её перекинуть
З записей я начинал два месяца назад. Пока их не убрал и аргументов, при создании объекта получал Interface not supported
...
Рейтинг: 0 / 0
05.04.2021, 17:03
    #40059941
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
_Vasilisk_,

типа такого не пробовал? Вроде стандартный вариант, в разных примерах его видел, вот из одной своей старой программы:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
  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;
...
Рейтинг: 0 / 0
05.04.2021, 18:19
    #40059973
Valery_B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
L_argo
по сабжу: XML или JSON.
Универсально и гибко.
+1
Гаджимурадов Рустам
если скорость неважна.

А если важна, то писать свою операционную систему реального времени.
...
Рейтинг: 0 / 0
05.04.2021, 18:22
    #40059974
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
SafeArray
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.04.2021, 12:08
    #40060102
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
Dimitry Sibiryakov
SafeArray
Тут палка о двух концах. Работа с SafeArray удобна из C++, но из Делфи это геморрой. А для VARIANT все наоборот - в делфи пара строчек, а в си пара экранов
...
Рейтинг: 0 / 0
06.04.2021, 17:23
    #40060190
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
_Vasilisk_,

SafeArray это один из варинатов типа в Variant, не особо сложна с ним работа и в дельфях
...
Рейтинг: 0 / 0
06.04.2021, 17:24
    #40060191
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
_Vasilisk_
kealon(Ruslan)
опиши запись и всё, стандартный маршалер сможет её перекинуть
З записей я начинал два месяца назад. Пока их не убрал и аргументов, при создании объекта получал Interface not supported
странно, есть пример простой?
...
Рейтинг: 0 / 0
06.04.2021, 17:51
    #40060196
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача массива структур
kealon(Ruslan)
странно, есть пример простой?
Тупо один интерфейс, с одним методом, который принимает record. Сервер 64-битный, клиент 32-битный. TLB в ресурсах сервера
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива структур / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]