powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передачи строки посредством SendMessage
25 сообщений из 37, страница 1 из 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
25 сообщений из 37, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Lazarus: передачи строки посредством SendMessage
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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