powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передачи строки посредством SendMessage
12 сообщений из 37, страница 2 из 2
Lazarus: передачи строки посредством SendMessage
    #39514764
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дока можешь в двух словах об их отличии при использовании пользовательских сообщений?

Ты тоже ссылку постом выше почитай
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514771
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiТы тоже ссылку постом выше почитай
почитал уже. Т.о. это имеет только историческое значение.

Я тут читаю :)
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514786
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокschiТы тоже ссылку постом выше почитай
почитал уже. Т.о. это имеет только историческое значение.

Я тут читаю :)

Что-то после фразы "В 16-разрядной Windows передача сообщения в окно всегда осуществляется синхронно отправитель не может продолжить работу, пока окно не обработает полученное сообщение " доверие к переводу несколько падает, потому что очередь сообщений и функция PostMessage были еще в 16-разрядной Windows...
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514800
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докт.е. так кошерно?
Код: pascal
1.
Label1.Caption:= 'цифра: ' + IntToStr(NativeInt(Msg.lParam));

Кошерно. Но зачем? Чем не строило
Код: pascal
1.
Label1.Caption:= 'цифра: ' + IntToStr((Msg.lParam));


Докв приемнике выдает соответственно -333 и -555Вопрос к транслятору типов. МСДН четко пишет LPARAM
A message parameter.
This type is declared in WinDef.h as follows:
typedef LONG_PTR LPARAM;

WPARAM
A message parameter.
This type is declared in WinDef.h as follows:
typedef UINT_PTR WPARAM;
Дока можешь в двух словах об их отличии при использовании пользовательских сообщений?Никаких. У тебя есть два числа. Как хочешь, так и используй
alekcvpКстати, а на 64хбитной системе WParam и LParam - 64-битные или всё также 32х?Я же написал - типы размером с машинное слово. 32 битной системе - 32 бита. На 64 - 64
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514802
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Вопрос к транслятору типов. МСДН четко пишет LPARAM
A message parameter.
This type is declared in WinDef.h as follows:
typedef LONG_PTR LPARAM;

WPARAM
A message parameter.
This type is declared in WinDef.h as follows:
typedef UINT_PTR WPARAM
т.е., все равно никаких, кроме итсторического происхождения их названия? :)
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514807
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Чем не строило
Код: pascal
1.
Label1.Caption:= 'цифра: ' + IntToStr((Msg.lParam));


решил выяснить все до конца. Привычка :)
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514894
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокschiТы тоже ссылку постом выше почитай
почитал уже. Т.о. это имеет только историческое значение.

При отправке сообщений из 32х битного приложения в 64х битное, то WPARAM просто дополняется 0ми, т.е. если отправлялся
Код: pascal
1.
SendMessage(Handle, Message, WPARAM(-1), LPARAM(-1))

то в 64х битном приложении мы получим NativeInt(WPARAM) = 4294967295 и NativeInt(LPARAM) = -1.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39515003
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpто в 64х битном приложении мы получим NativeInt(WPARAM) = 4294967295 и NativeInt(LPARAM) = -1.
хорошо, а если так
Код: pascal
1.
2.
3.
SendMessage(Form1.Handle,WM_INT_MSG,WPARAM(NativeUInt(-333)),-555);
...
Label1.Caption:= Format('wparam = %d, lparam = %d',[NativeUInt(Msg.wParam),Msg.lParam]);


где
NativeUInt
Код: 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.
25.
NativeUInt = Type PtrUInt;
...
{$ifdef CPU64}
  SizeInt = Int64;
  SizeUInt = QWord;
  PtrInt = Int64;
  PtrUInt = QWord;
  ValSInt = int64;
  ValUInt = qword;
  CodePointer = Pointer;
  CodePtrInt = PtrInt;
  CodePtrUInt = PtrUInt;
{$endif CPU64}

{$ifdef CPU32}
  SizeInt = Longint;
  SizeUInt = DWord;
  PtrInt = Longint;
  PtrUInt = DWord;
  ValSInt = Longint;
  ValUInt = Cardinal;
  CodePointer = Pointer;
  CodePtrInt = PtrInt;
  CodePtrUInt = PtrUInt;
{$endif CPU32}


а справка говорит
Код: pascal
1.
2.
3.
4.
5.
NativeInt and NativeUInt are Delphi compatibility types. Even though Delphi has IntPtr and 
UIntPtr, the Delphi documentation for NativeInt states that 'The size of NativeInt is equivalent to the size of the 
pointer on the     current platform'. Because of the misleading names, these types shouldn't be used in the FPC 
RTL. Note that on i8086 their size changes between 16-bit and 32-bit according to the memory model, so they're 
not really a 'native int' type there at all.

...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39515141
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, тема всех утомила. Попробую резюмировать:

1. если данные передаются в пределах приложений одной разрядности , то
WParam = LParam = тип DWord(x32) и Int64(x64)

2. если данные передаются в пределах приложений разной разрядности , то
WParam - тип DWord(x32) или QWord(x64)
LParam - аналогично п.1

Все правильно?
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39515208
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док2. если данные передаются в пределах приложений разной разрядности , то
Даже не пробовал так никогда, если честно. По идее вообще сработать вряд ли должно.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39515345
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПохоже, тема всех утомила. Попробую резюмировать:
1. если данные передаются в пределах приложений одной разрядности , то
... то неважно как их интерпретировать, как Int или как UInt соотв. разрядности, т.к. они передаются "Как есть".
Док2. если данные передаются в пределах приложений разной разрядности , то
То преобразование происходит так:
из х64 в х86: просто отбрасываются 32 старших разряда;
из х86 в х64: для WParam просто дорисовываются 32 нуля слева, что превращает WPARAM в UInt64, при этом получаются сюрпризы если там предполагалось отрицательное число со знаком;
Для LPARAM - идёт расширение со знаком, т.е. значение интерпретируется как Int32, после этого расширяется до Int64 с сохранением знака. Если там предполагалось беззнаковое число больше MaxInt[32], то снова получаются сюрпризы.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39515497
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем за участие и разъяснения. Я выяснил почти все, что хотел :)
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передачи строки посредством SendMessage
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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