Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2 3      [все]
 SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Отправляю сообщение из одного приложения в другое, если оба 32х битные, всё нормально, если оба 64, тоже без проблем. Если же разрядность разная - приходит хаотичный набор данных.
Ну и первый вопрос, можно ли включить возможность при компиляции 64 разрядных приложений останавливаться на Брекпоинтах? Делфи их просто игнорирует.
Второй вопрос, почему происходит ошибка передачи данных и как её избежать.

Посылаю посредствам:
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;

Принимаю:

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;
20 мар 20, 13:11    [22102902]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

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

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

Posted via ActualForum NNTP Server 1.5

20 мар 20, 13:24    [22102910]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26449
Тут нужно понимать разницу между 32-битной ссылкой и 64-битной.
20 мар 20, 13:24    [22102912]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Dimitry Sibiryakov

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

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

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

Я понимал ссылку как номер байта с которого начинаются данные в памяти? Это не так?

Сообщение было отредактировано: 20 мар 20, 13:38
20 мар 20, 13:38    [22102924]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

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

Сообщение было отредактировано: 20 мар 20, 13:38
20 мар 20, 13:38    [22102926]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 26449
Андрей Игоревич
Я понимал ссылку как номер байта с которого начинаются данные в памяти? Это не так?

Разница в длине ссылки: 32 бита и 64. Отсюда и проблемы. Есть куча других вариантов передачи информации между приложениями. Пайпсы, файлы, сокеты и т.п.
20 мар 20, 13:51    [22102937]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

wadman
Разница в длине ссылки: 32 бита и 64. Отсюда и проблемы.

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

https://docs.microsoft.com/en-us/windows/win32/dataxchg/wm-copydata

Posted via ActualForum NNTP Server 1.5

20 мар 20, 14:19    [22102959]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

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

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

Posted via ActualForum NNTP Server 1.5

20 мар 20, 14:21    [22102960]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
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 бита. Ну и смена данного параметра ничего не изменила, данные приходят неверные.
Картинка с другого сайта.

Сообщение было отредактировано: 20 мар 20, 14:41
20 мар 20, 14:37    [22102975]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Андрей Игоревич
Картинка с другого сайта.

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

Картинка с другого сайта.
20 мар 20, 14:45    [22102983]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Андрей Игоревич,

NativeInt или, как уже сказали LPARAM/WPARAM.
20 мар 20, 14:48    [22102984]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
vavan
Member

Откуда: Казань
Сообщений: 3491
Андрей Игоревич
какой способ не слишком сложный и позволяет быстро и разово передавать десятки мегабайт данных?
не надо ничего передавать, если оба на одной машине. почитайте про mmf
20 мар 20, 14:51    [22102985]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 31141

20.03.2020 14:51, vavan пишет:
> не надо ничего передавать, если оба на одной машине. почитайте про mmf

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

Posted via ActualForum NNTP Server 1.5

20 мар 20, 14:53    [22102989]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
vavan
почитайте про mmf

А потом придумайте, как это синхронизировать. С мьютексами познакомитесь и всё такое
20 мар 20, 14:54    [22102990]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Kazantsev Alexey
Андрей Игоревич,

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


  result := SendMessage(receiverHandle, WM_COPYDATA, WPARAM(Handle),
            LPARAM(@copyDataStruct)) ;


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

И ещё вопрос, одно из приложений при компиляции под 64 крашит Делфи с ошибкой "Disconnect session".
20 мар 20, 14:55    [22102992]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Пример во вложении.

К сообщению приложен файл (wmcd.zip - 107Kb) cкачать
20 мар 20, 15:34    [22103026]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Андрей Игоревич
одно из приложений при компиляции под 64 крашит Делфи с ошибкой "Disconnect session"

Скорее всего дебаггер отваливается. Штош.
20 мар 20, 15:36    [22103028]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Kazantsev Alexey
Пример во вложении.

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

в 32-битах равно 202440, а в 64 - 204432
Может ли в этих 8 байтах быть причина, и какая переменная меняет своё размер при смене разрядности?
Data, в этом случае, выглядит так:
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;


Сообщение было отредактировано: 20 мар 20, 16:36
20 мар 20, 16:35    [22103059]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

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

Сообщение было отредактировано: 20 мар 20, 16:36
20 мар 20, 16:35    [22103060]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

https://stackoverflow.com/questions/5616418/getting-64-bit-data-in-wm-copydata-command-instead-of-expected-32-bit-dword

Posted via ActualForum NNTP Server 1.5

20 мар 20, 16:39    [22103065]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Андрей Игоревич,

packed record
...
end;
20 мар 20, 16:43    [22103067]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Dimitry Sibiryakov

https://stackoverflow.com/questions/5616418/getting-64-bit-data-in-wm-copydata-command-instead-of-expected-32-bit-dword

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

packed record
...
end;

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

 CutOff    :Extended;
 Time      :Extended;

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

Спасибо большое за помощь. Проблема побеждена.

Сообщение было отредактировано: 20 мар 20, 16:51
20 мар 20, 16:49    [22103073]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Андрей Игоревич,

Кстати да, Extended в 32 и 64 битах это разные типы. Используй Double вместо него.
20 мар 20, 16:51    [22103074]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
http://docwiki.embarcadero.com/RADStudio/Rio/en/Simple_Types_(Delphi)
20 мар 20, 22:06    [22103316]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
X-Cite
http://docwiki.embarcadero.com/RADStudio/Rio/en/Simple_Types_(Delphi)

Ясно-понятно. Могли бы и сделать разные названия для этого, типа Extended64, NativeInt64,... Ведь Int64 же сделали.
20 мар 20, 22:14    [22103323]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
rgreat
Member

Откуда:
Сообщений: 5722
Андрей Игоревич
Ясно-понятно. Могли бы и сделать разные названия для этого, типа Extended64, NativeInt64
Extended такой корявый из-за оптимизации скорости работы с железом во времена когда это было очень важно. Преданья старины глубокой в общем.

Не используй его без необходимости и все. Благо дело он почти никогда и не нужен.

Сообщение было отредактировано: 20 мар 20, 22:26
20 мар 20, 22:24    [22103335]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
Андрей Игоревич,

NativeInt как раз и ввели для того, чтобы иметь целочисленный тип соответствующий размеру указателя. Это важно, когда используется адресная арифметика. С Extended ещё проще - добавили директиву $EXTENDEDCOMPATIBILITY. И вообще RTFM.
20 мар 20, 22:29    [22103337]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
http://docwiki.embarcadero.com/RADStudio/Rio/en/Delphi_Considerations_for_Multi-Device_Applications
21 мар 20, 11:23    [22103461]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1668
http://docwiki.embarcadero.com/RADStudio/Rio/en/Converting_32-bit_Delphi_Applications_to_64-bit_Windows

Короче, читайте справку, там еще много интересного...
21 мар 20, 12:01    [22103470]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
GunSmoker
Member

Откуда:
Сообщений: 3122
Extended - это аппаратно-зависимый тип, такой же как Pointer или Integer.
Single, Double, Int64 - это аппаратно-независимые типы.
21 мар 20, 12:01    [22103471]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 101
Реализовывал всегда сокетное общение между приложений.
21 мар 20, 20:04    [22103705]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 101
Между прочим, на все указатели надо использовать NativeUInt. И никакой NativeInt. Адрес не может иметь отрицательный адрес. Но мы можем не попасть в объём типа, и улететь в трубу.

Так что, только NativeUInt


Но а если мы говорим о таком общение. То мы должны зафиксировать тип на нужном диапазоне, для общения разных разрядностей.

Ну или же использовать сокеты, и никому не фифать мозг разрядностью.

Сообщение было отредактировано: 21 мар 20, 20:17
21 мар 20, 20:15    [22103712]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Автор, используй учебник. Два каждый вечер - и ты "все знаешь"...

Рихтер Дж. - Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows - 2008
21 мар 20, 20:48    [22103722]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
ВсеРазумный
Так что, только NativeUInt

В операциях сравнения, если они нужны. Для арифметики Int использовать проще т.к. избавляет от кучи приведений знаковых типов.

ВсеРазумный
Ну или же использовать сокеты, и никому не фифать мозг разрядностью.

Няшка, как сокеты тебя избавят от проблемы ТС?
21 мар 20, 21:05    [22103729]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 101
Kazantsev Alexey

В операциях сравнения, если они нужны. Для арифметики Int использовать проще т.к. избавляет от кучи приведений знаковых типов.


За то приведёт к большим проблемам адресации.

Kazantsev Alexey

***, как сокеты тебя избавят от проблемы ТС?


Один клиент, другой сервер. Никто никому не мешает быть ЛГБТ двух полым. Каждый слушает приходящие команды и выполняет что - то.

Обычный get\post, только для приложений в виде json к примеру. Это огромное решение, которое позволяет передавать данные так, как хочет человек передать. Независимо от количество данных.

Ну и к тому - же, в пару строк кода ещё и реализуется вебхост прослушивания ip. Мы в браузере можем открыть интересующий адрес, и из программы отобразить всю нужную нам информацию. Реализовав общую админ панель, в закрытом обществе
21 мар 20, 22:45    [22103763]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Kazantsev Alexey
Няшка, как сокеты тебя избавят от проблемы ТС?

ВсеРазумный
Один клиент, другой сервер.


Няшык, у ТС типы данных зависят от разрядности. Exteded в х32 и в х64 - разные, ты хоть как передавай.
21 мар 20, 22:56    [22103767]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
ВсеРазумный
За то приведёт к большим проблемам адресации.

Не приведёт. Учи матчасть.

ВсеРазумный
Обычный get\post, только для приложений в виде json к примеру.

Ты бы уже определился, ты сокетами проблему разрядности решаешь или использованием механизма сериализации

ВсеРазумный
Мы в браузере можем открыть интересующий адрес, и из программы отобразить всю нужную нам информацию. Реализовав общую админ панель, в закрытом обществе

Закусывать надо (с)
21 мар 20, 23:03    [22103770]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

ъъъъъ
Exteded в х32 и в х64 - разные, ты хоть как передавай.

Если ты не обратил внимания, он их собирается текстом передавать. В JSON.

Posted via ActualForum NNTP Server 1.5

21 мар 20, 23:04    [22103771]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ВсеРазумный
Member

Откуда:
Сообщений: 101
Kazantsev Alexey
ВсеРазумный
За то приведёт к большим проблемам адресации.

Не приведёт. Учи матчасть.


То есть ты уверяешь, что выделенное адресное пространство всегда в 100% из 100% поместиться в объём int ? И не уйдёт в отрицательный диапазон.

Kazantsev Alexey


Ты бы уже определился, ты сокетами проблему разрядности решаешь или использованием механизма сериализации


Для непонятливых

- Оно решает всё.
- Приносит кучу плюшек и удобств.

Неужели так приятно жить в каменном веке, бросаться в друг друга handle-ом и что - то там пытаться выковыривать считывая лагучим пост обработчиком, который ещё опрокинет через кучу обработчиков.


Kazantsev Alexey
Закусывать надо (с)


Это уже от того, что можно. Если это общая сеть, то и на телефоне получишь общий доступ.
21 мар 20, 23:09    [22103775]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Dimitry Sibiryakov
ъъъъъ
Exteded в х32 и в х64 - разные, ты хоть как передавай.

Если ты не обратил внимания, он их собирается текстом передавать. В JSON.

Тогда не только Extended, но Double может быть покоцан на этапе преобразования в JSON и обратно.
21 мар 20, 23:18    [22103781]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
...если, конечно, не передавать данные в "точном" представлении - в виде строк с шестнадцатеричными или двоичными или ещё какими-либо значениями.
21 мар 20, 23:20    [22103782]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
ВсеРазумный
То есть ты уверяешь, что выделенное адресное пространство всегда в 100% из 100% поместиться в объём int ? И не уйдёт в отрицательный диапазон.

Следи за руками:
uses
  System.SysUtils;

var
 i : Integer;
 c : Cardinal;
begin

 i := high(Integer);
 c := i;

 c := c + 1024;
 i := i + 1024;

 writeLn(Format('%p (%s)', [Pointer(c), c.ToString]));
 writeLn(Format('%p (%s)', [Pointer(i), i.ToString]));

 readln;

end.


ВсеРазумный
- Оно решает всё.
- Приносит кучу плюшек и удобств.

Так сокеты или сериализация? Ну?
21 мар 20, 23:28    [22103784]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
bk0010
Member

Откуда:
Сообщений: 4915
Если алгоритм вычислительный с накоплением ошибки, то замена Extended (настоящего, десятибайтового) на double может сказаться на результатах: настоящий Extended не только длиннее, но и считает немного по другому (не IEEE 754).
22 мар 20, 00:09    [22103791]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
rgreat
Member

Откуда:
Сообщений: 5722
bk0010
Если алгоритм вычислительный с накоплением ошибки, то замена Extended (настоящего, десятибайтового) на double может сказаться на результатах: настоящий Extended не только длиннее, но и считает немного по другому (не IEEE 754).

Если вам надо точно, может стоит перейти на https://github.com/rvelthuis/DelphiBigNumbers ?

Сообщение было отредактировано: 22 мар 20, 01:18
22 мар 20, 01:18    [22103810]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

ТС вообще в Single считает, о чём вы спорите?..

Posted via ActualForum NNTP Server 1.5

22 мар 20, 01:21    [22103811]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
northener
Member

Откуда: Москва
Сообщений: 37
Dimitry Sibiryakov

ТС вообще в Single считает, о чём вы спорите?..

Откуда известно что и как считает ТС?
22 мар 20, 02:42    [22103825]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Не, у него флоат точность по максимуму
Андрей Игоревич
TFluxPipe = record   //передача сообщение в 3DViewer
 CutOff    :Extended;
 Time      :Extended;


Он же ж секретный физик.
Картинка с другого сайта.
22 мар 20, 03:10    [22103830]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Dimitry Sibiryakov
Member

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

northener
Откуда известно что и как считает ТС?

Код выше по топику.

Posted via ActualForum NNTP Server 1.5

22 мар 20, 13:05    [22103916]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 300
Dimitry Sibiryakov

ТС вообще в Single считает, о чём вы спорите?..

Считаю я в Extended, в Single я просто вывожу результаты, и то вынужденно, так как пространственные распределения результатов это почти всегда огромные массивы занимающие гигабайты(иногда даже десятки) в памяти, потому вывожу/передаю в Single, так как для визуализации точности более чем хватает.

ъъъъъ
Автор, используй учебник. Два каждый вечер - и ты "все знаешь"...

Рихтер Дж. - Windows. Создание эффективных Win32-приложений с учётом специфики 64-разрядной версии Windows - 2008


Эх, ...гдеб столько времени взять, чтоб всё читать, при этом ещё работать и жить. Я вот сейчас Питон активно осваиваю, так как для некоторых моих задач он удобнее, а ещё по физике и прочности куча книг лежит в ожидании прочтения... Ну будет время может почитаю...

Сообщение было отредактировано: 22 мар 20, 14:03
22 мар 20, 13:59    [22103932]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
GunSmoker
Member

Откуда:
Сообщений: 3122
Kazantsev Alexey
Следи за руками:


К слову:
 c := c + 1024; // OK
 i := i + 1024; // "Integer overflow"
22 мар 20, 18:14    [22104033]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 4217
GunSmoker,

Контроль переполнения отключен по дефолту.
22 мар 20, 18:24    [22104034]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
Андрей Игоревич
Эх, ...гдеб столько времени взять, чтоб всё читать,

Именно эту книжку изучить НУЖНО.
22 мар 20, 20:21    [22104082]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
GunSmoker
Member

Откуда:
Сообщений: 3122
ъъъъъ
Именно эту книжку изучить НУЖНО.

Только там ничего не сказано про типы Delphi.
23 мар 20, 12:21    [22104395]     Ответить | Цитировать Сообщить модератору
 Re: SendMessage и WM_COPYDATA между 32 и 64 разрядными приложениями.  [new]
ъъъъъ
Member

Откуда:
Сообщений: 248
GunSmoker,

про типы уже все рассказали.
23 мар 20, 14:10    [22104482]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2 3      [все]
Все форумы / Delphi Ответить