powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача массива структур
19 сообщений из 19, страница 1 из 1
Передача массива структур
    #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
Передача массива структур
    #40059571
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да сложи в один массив и "читай" парами.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача массива структур
    #40059575
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Да сложи в один массив и "читай" парами.
Тогда уже проще двумя массивами. Ошибок меньше будет
...
Рейтинг: 0 / 0
Передача массива структур
    #40059579
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну можно и двумя...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача массива структур
    #40059632
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

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

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

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

тынц
...
Рейтинг: 0 / 0
Передача массива структур
    #40059880
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по сабжу: XML или JSON.
Универсально и гибко.
...
Рейтинг: 0 / 0
Передача массива структур
    #40059883
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оверкилл, даже JSON.
Впрочем, если скорость
неважна, можно и так.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Передача массива структур
    #40059905
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)
опиши запись и всё, стандартный маршалер сможет её перекинуть
З записей я начинал два месяца назад. Пока их не убрал и аргументов, при создании объекта получал Interface not supported
...
Рейтинг: 0 / 0
Передача массива структур
    #40059941
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
Передача массива структур
    #40059973
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L_argo
по сабжу: XML или JSON.
Универсально и гибко.
+1
Гаджимурадов Рустам
если скорость неважна.

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

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


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