powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передачи строки посредством SendMessage
37 сообщений из 37, показаны все 2 страниц
Lazarus: передачи строки посредством SendMessage
    #39513710
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отправляю строку так
Код: pascal
1.
2.
3.
4.
5.
6.
var
  s: String;
begin
  s:= 'здесь написано "Made in Japan"';
  SendMessage(Form1.Handle,WM_STR_MSG,0,LPARAM(LongInt(s)));
end;



принимаю так
Код: pascal
1.
2.
3.
4.
procedure TForm1.WM_Str_Msg(var Msg: TLMessage);
begin
  Label2.Caption:= String(Msg.lParam);
end; 



Мне, лапотнику-гуманитарию, кто-нибудь на пальцах сможет объяснить, есть тут какие-то ограничения при использовании (длина строки, разрядность ОСи или еще что)? Или способ универсальный и может применяться везде без выделения памяти и проч. сложностей?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55538); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513715
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докесть тут какие-то ограничения при использовании (длина строки, разрядность ОСи или еще
что)? Или способ универсальный и может применяться везде без выделения памяти и проч.
сложностей?

Это работает только с SendMessage и только в пределах одного процесса. Во всех остальных
случаях - облом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513727
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док
Код: pascal
1.
LongInt(s)


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

И, обсуждалось:

19084237
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513734
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокИли способ универсальный и может применяться везде без выделения памяти и проч. сложностей?

Если между разными модулями (dll/exe <-> dll) или, не дай бог, приложениями, то ИМХО лучше WM_COPYDATA.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513757
Bred eFeM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, более api-шно и немного быстрей:
Код: pascal
1.
2.
3.
 SendMessage(Form1.Handle, WM_STR_MSG, 0, IntPtr(PChar(s)));
 ..
 Label1.SetTextBuf(PChar(Msg.lParam));


SendMessage(MyWnd внутри GUI потока не нужно, а из других - тормозит твой второй поток, что тоже не хорошо. Поэтому такая конструкция удивляет.

Но если лень делать свой межпоточный обмен, то сойдёт и так.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513842
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513844
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpДокИли способ универсальный и может применяться везде без выделения памяти и проч. сложностей?

Если между разными модулями (dll/exe <-> dll) или, не дай бог, приложениями, то ИМХО лучше WM_COPYDATA.

Вся память процесса доступна его всем его потокам и всем его модулям. M_COPYDATA только для межпроцессорного обмена.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513917
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schialekcvpпропущено...
Если между разными модулями (dll/exe <-> dll) или, не дай бог, приложениями, то ИМХО лучше WM_COPYDATA.
Вся память процесса доступна его всем его потокам и всем его модулям. M_COPYDATA только для межпроцессорного обмена.
Доступна, только если потом попадётся dll написанная, например, на C, будет неприятно, потому что она ничего не знает про тип string.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39513940
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpна C, будет неприятно, потому что она ничего не знает про тип string.Но знает про PChar
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514058
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bred eFeMПоэтому такая конструкция удивляетна практике - пересылка из доп.потока в основной

чччДДок, используешь виндовый апи и, под линухом наверное такого нет

за ссылку спасибо

Dimitry SibiryakovВо всех остальных случаях - облом.
а ограничений по длине передаваемой строки нет? У меня как раз в рамках одного процесса (приложения)

YuRockПеределай на NativeInt на всякий
а в чем цимес?

schiЯ передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание.
так можно применять и между процессами?
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514065
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дока ограничений по длине передаваемой строки нет? У меня как раз в рамках одного процесса
(приложения)

Нет. В любом случае там передаётся только целое. То, что ты его интерпретируешь как
указатель - чисто твои заморочки, системе всё равно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514095
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокYuRockПеределай на NativeInt на всякий
а в чем цимес?
Если будешь компилить под x86_64, то там
sizeof(NativeInt) = sizeof(Pointer),
а
sizeof(LongInt) <> sizeof(Pointer)

и тогда вот этим
LongInt(s)

ты обрежешь 4 старших байта указателя на свою строку.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514121
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокschiЯ передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание.
так можно применять и между процессами?Нет. Указатель же выделяется в одном процессе. В другом процессе в этом месте может быть все, что угодно
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514168
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДока ограничений по длине передаваемой строки нет? У меня как раз в рамках одного процесса
(приложения)

Нет. В любом случае там передаётся только целое. То, что ты его интерпретируешь как
указатель - чисто твои заморочки, системе всё равно.
Тогда уточню: в wparam передается целое, а lparam - указатель, как целое?

YuRockты обрежешь 4 старших байта указателя на свою строку.
Спасибо, не знал. Попробую.


_Vasilisk_Нет. Указатель же выделяется в одном процессе. В другом процессе в этом месте может быть все, что угодно
Тогда, имхо, нет смысла - тут ещё за освобождением памяти надо будет следить.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514170
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокschiЯ передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание.
так можно применять и между процессами?

Между процессами надо делать разделенную копию передаваемых данных, доступную обоим процессам. Для системных сообщений и для WM_COPYDATA этим занимается система, для остальных ты можешь имитировать, создав общедоступную проекцию файла, например.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514207
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокТогда уточню: в wparam передается целое, а lparam - указатель, как целое?Это два целых, каждое равное машинному слову. Что-ты туда запихнешь - систему не интересует. Задача системы передать получателю именно те два числа, которые отправил отправитель
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514209
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокТогда уточню: в wparam передается целое, а lparam - указатель, как целое?

RTFM. Оба параметра тупо целые. Кажется, они даже одинакового размера, точно не помню.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514238
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, Dimitry Sibiryakov,
т.е. эти способы передачи
Код: pascal
1.
2.
3.
4.
5.
6.
Msg.lParam:= 555;
SendMessage(Form1.Handle,WM_INT_MSG,0,LPARAM(Msg.lParam));
//или
SendMessage(Form1.Handle,WM_INT_MSG,0,LPARAM(555));
//или
SendMessage(Form1.Handle,WM_INT_MSG,0,555); 


и приема
Код: pascal
1.
2.
Label1.Caption:= 'цифра: ' + IntToStr(Integer(Msg.lParam)) ;
Label1.Caption:= 'цифра: ' + IntToStr(Msg.lParam) ;



равнозначны? и не несут никаких подводных камней?
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514257
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКажется, они даже одинакового размера, точно не помню.
Думаю, да, раз они одинакового типа.
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514701
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКажется, они даже одинакового размера, точно не помню.Одинакового. В машинное слово. Один из параметров знаковый, второй без
Докравнозначны?Абсолютно
YuRockони одинакового типа.Разного. Первый параметр типа WPARAM, а второй типа LPARAM
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514703
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докравнозначны?А нет. На приеме ті вот этим
Док
Код: pascal
1.
Label1.Caption:= 'цифра: ' + IntToStr(Integer(Msg.lParam)) ;

на 64 битной архитектуре потеряешь 32 старших разряда
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514729
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

Кстати, а на 64хбитной системе WParam и LParam - 64-битные или всё также 32х?
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514743
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp_Vasilisk_,

Кстати, а на 64хбитной системе WParam и LParam - 64-битные или всё также 32х?

Кстати 64-битные
https://blogs.msdn.microsoft.com/oldnewthing/20110629-00/?p=10303
...
Рейтинг: 0 / 0
Lazarus: передачи строки посредством SendMessage
    #39514758
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_На приеме ті вот этим
Док
Код: pascal
1.
Label1.Caption:= 'цифра: ' + IntToStr(Integer(Msg.lParam)) ;


на 64 битной архитектуре потеряешь 32 старших разряда
т.е. так кошерно?
Код: pascal
1.
Label1.Caption:= 'цифра: ' + IntToStr(NativeInt(Msg.lParam));


_Vasilisk_Один из параметров знаковый, второй без
Странно, если ты имеешь ввиду отрицательные и положительные значения, то
Код: pascal
1.
SendMessage(Form1.Handle,WM_INT_MSG,-333,-555);


в приемнике выдает соответственно -333 и -555
_Vasilisk_Первый параметр типа WPARAM, а второй типа LPARAM

а можешь в двух словах об их отличии при использовании пользовательских сообщений?
...
Рейтинг: 0 / 0
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
37 сообщений из 37, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передачи строки посредством SendMessage
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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