powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
25 сообщений из 54, страница 1 из 3
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939503
Отправляю сообщение из одного приложения в другое, если оба 32х битные, всё нормально, если оба 64, тоже без проблем. Если же разрядность разная - приходит хаотичный набор данных.
Ну и первый вопрос, можно ли включить возможность при компиляции 64 разрядных приложений останавливаться на Брекпоинтах? Делфи их просто игнорирует.
Второй вопрос, почему происходит ошибка передачи данных и как её избежать.

Посылаю посредствам:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function TCoreShell.SendDataPipe  (SendHandle:THandle;var Data:TFluxPipe; nMessage:integer):Integer;
Begin
    CDS.dwData := nMessage;           // 
    CDS.cbData := SizeOf(Data); //тут достаточно большой массив данных в виде записи (думаю 10+мб)
    CDS.lpData := @Data;     //
    result := SendData (CDS,SendHandle);
End;

Function TCoreShell.SendData(const copyDataStruct: TCopyDataStruct; receiverHandle : THandle):integer ;
begin
  result := SendMessage(receiverHandle, WM_COPYDATA, Integer(Handle),   Integer(@copyDataStruct)) ;
end;


Принимаю:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
procedure TForm_3DViewer.WMCopyData(var MessageData: TWMCopyData);
Var
 Data:integer;
begin 
  Data:=MessageData.CopyDataStruct.dwData;
...
  if Data=9 then    //нейтронные поля
  begin
    GetAFluxMessage (MessageData)
  end;

  if Data=10 then  //перемещение
...
end;

Procedure TForm_3DViewer.GetAFluxMessage (var MessageData: TWMCopyData);
var
 i,j,k:integer;
 FluxPipe: TFluxPipe;
Begin
    FluxPipe:= TFluxPipe(MessageData.CopyDataStruct.lpData^);
   ... много кода присвоения.   
End;
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939508
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичInteger(@copyDataStruct))

В 64-х разрядном приложении-то? Это называется "новичкам везёт".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939510
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут нужно понимать разницу между 32-битной ссылкой и 64-битной.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939516
Dimitry Sibiryakov

Андрей ИгоревичInteger(@copyDataStruct))

В 64-х разрядном приложении-то? Это называется "новичкам везёт".

Int64?
wadman
Тут нужно понимать разницу между 32-битной ссылкой и 64-битной.

Я понимал ссылку как номер байта с которого начинаются данные в памяти? Это не так?
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939517
...
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939525
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Я понимал ссылку как номер байта с которого начинаются данные в памяти? Это не так?

Разница в длине ссылки: 32 бита и 64. Отсюда и проблемы. Есть куча других вариантов передачи информации между приложениями. Пайпсы, файлы, сокеты и т.п.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939544
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanРазница в длине ссылки: 32 бита и 64. Отсюда и проблемы.

Нет, проблемы не отсюда. Для WM_COPYDATA система честным образом копирует данные между
адресными пространствами и, естественно, она использует указатели правильного размера.
Проблема в том, что документацию не читают отдельно взятые личности.

https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939545
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичInt64?

Ты не поверишь, но четвёртый параметр у SendMessage() должен иметь тип LPARAM.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939557
wadman
Андрей Игоревич
Я понимал ссылку как номер байта с которого начинаются данные в памяти? Это не так?

Разница в длине ссылки: 32 бита и 64. Отсюда и проблемы. Есть куча других вариантов передачи информации между приложениями. Пайпсы, файлы, сокеты и т.п.

Файл слишком медленно. А какой способ не слишком сложный и позволяет быстро и разово передавать десятки мегабайт данных?
На вопрос зачем (очень уж часто его любят задавать), вот пример, каждое обновление - пересылка где-то 10 мб.



Dimitry Sibiryakov

Андрей ИгоревичInt64?

Ты не поверишь, но четвёртый параметр у SendMessage() должен иметь тип LPARAM.

Не понял
https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata A pointer to a COPYDATASTRUCT structure that contains the data to be passed.
Ну Int64? Или вы что-то другое хотите сказать? Во всех примерах используют Integer или LongInt, ну я как-то подзабыл, что он 32 бита. Ну и смена данного параметра ничего не изменила, данные приходят неверные.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939563
Андрей Игоревич

Забавно, что если включить 32-битную платформу, уже не требует.

...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939564
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

NativeInt или, как уже сказали LPARAM/WPARAM.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939565
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
какой способ не слишком сложный и позволяет быстро и разово передавать десятки мегабайт данных?
не надо ничего передавать, если оба на одной машине. почитайте про mmf
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939569
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20.03.2020 14:51, vavan пишет:
> не надо ничего передавать, если оба на одной машине. почитайте про mmf

+100500
тем более, десятки мегабайт.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939570
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan
почитайте про mmf

А потом придумайте, как это синхронизировать. С мьютексами познакомитесь и всё такое
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939571
Kazantsev Alexey
Андрей Игоревич,

NativeInt или, как уже сказали LPARAM/WPARAM.


Код: pascal
1.
2.
  result := SendMessage(receiverHandle, WM_COPYDATA, WPARAM(Handle),
            LPARAM(@copyDataStruct)) ;



Вот такой код не работает. Точнее 32-32 и 64-64 работает, 32-64 нет.

И ещё вопрос, одно из приложений при компиляции под 64 крашит Делфи с ошибкой "Disconnect session".
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939596
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример во вложении.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939597
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
одно из приложений при компиляции под 64 крашит Делфи с ошибкой "Disconnect session"

Скорее всего дебаггер отваливается. Штош.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939622
Kazantsev Alexey
Пример во вложении.

Угу. Работает. Я, кажется, сообразил где у меня происходит рассинхрон.
Код: pascal
1.
SizeOf(Data);


в 32-битах равно 202440, а в 64 - 204432
Может ли в этих 8 байтах быть причина, и какая переменная меняет своё размер при смене разрядности?
Data, в этом случае, выглядит так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
TFluxInHeight = record
 InHeight: array [0..100] of Single;
end;

TFluxPipe = record   //передача сообщение в 3DViewer
 CutOff    :Extended;
 Time      :Extended;
 NFA       :Integer;
 NHeight   :Integer;
 InFA:     array [1..500] of TFluxInHeight;
 Height:   array [0..100] of Single;
end;
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939623
...
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939626
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939627
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Код: pascal
1.
2.
3.
packed record
...
end;
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939630

Kazantsev Alexey
Андрей Игоревич,

Код: pascal
1.
2.
3.
packed record
...
end;


Применю, но вообще причина была в этих двух строчках

Код: pascal
1.
2.
 CutOff    :Extended;
 Time      :Extended;


При смене их типа на Single - всё заработало и сообщения начали передаваться. Не знал что в 64-битах Extended меньше на 4 байта... Как-то и не задумывался в этом направлении искать.

Спасибо большое за помощь. Проблема побеждена.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939631
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Кстати да, Extended в 32 и 64 битах это разные типы. Используй Double вместо него.
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939743
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
    #39939747

Ясно-понятно. Могли бы и сделать разные названия для этого, типа Extended64, NativeInt64,... Ведь Int64 же сделали.
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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