|
|
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Отправляю строку так Код: pascal 1. 2. 3. 4. 5. 6. принимаю так Код: pascal 1. 2. 3. 4. Мне, лапотнику-гуманитарию, кто-нибудь на пальцах сможет объяснить, есть тут какие-то ограничения при использовании (длина строки, разрядность ОСи или еще что)? Или способ универсальный и может применяться везде без выделения памяти и проч. сложностей? ================= Док. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 21:57:06 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Докесть тут какие-то ограничения при использовании (длина строки, разрядность ОСи или еще что)? Или способ универсальный и может применяться везде без выделения памяти и проч. сложностей? Это работает только с SendMessage и только в пределах одного процесса. Во всех остальных случаях - облом. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 22:13:26 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Док Код: pascal 1. Переделай на NativeInt на всякий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 22:45:39 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 22:48:08 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокИли способ универсальный и может применяться везде без выделения памяти и проч. сложностей? Если между разными модулями (dll/exe <-> dll) или, не дай бог, приложениями, то ИМХО лучше WM_COPYDATA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.08.2017, 23:01:57 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Док, более api-шно и немного быстрей: Код: pascal 1. 2. 3. SendMessage(MyWnd внутри GUI потока не нужно, а из других - тормозит твой второй поток, что тоже не хорошо. Поэтому такая конструкция удивляет. Но если лень делать свой межпоточный обмен, то сойдёт и так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 01:36:13 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Я передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 09:39:18 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
alekcvpДокИли способ универсальный и может применяться везде без выделения памяти и проч. сложностей? Если между разными модулями (dll/exe <-> dll) или, не дай бог, приложениями, то ИМХО лучше WM_COPYDATA. Вся память процесса доступна его всем его потокам и всем его модулям. M_COPYDATA только для межпроцессорного обмена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 09:40:31 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
schialekcvpпропущено... Если между разными модулями (dll/exe <-> dll) или, не дай бог, приложениями, то ИМХО лучше WM_COPYDATA. Вся память процесса доступна его всем его потокам и всем его модулям. M_COPYDATA только для межпроцессорного обмена. Доступна, только если потом попадётся dll написанная, например, на C, будет неприятно, потому что она ничего не знает про тип string. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 11:04:38 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
alekcvpна C, будет неприятно, потому что она ничего не знает про тип string.Но знает про PChar ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 11:26:49 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Bred eFeMПоэтому такая конструкция удивляетна практике - пересылка из доп.потока в основной чччДДок, используешь виндовый апи и, под линухом наверное такого нет за ссылку спасибо Dimitry SibiryakovВо всех остальных случаях - облом. а ограничений по длине передаваемой строки нет? У меня как раз в рамках одного процесса (приложения) YuRockПеределай на NativeInt на всякий а в чем цимес? schiЯ передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание. так можно применять и между процессами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 13:14:11 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Дока ограничений по длине передаваемой строки нет? У меня как раз в рамках одного процесса (приложения) Нет. В любом случае там передаётся только целое. То, что ты его интерпретируешь как указатель - чисто твои заморочки, системе всё равно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 13:21:41 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокYuRockПеределай на NativeInt на всякий а в чем цимес? Если будешь компилить под x86_64, то там sizeof(NativeInt) = sizeof(Pointer), а sizeof(LongInt) <> sizeof(Pointer) и тогда вот этим LongInt(s) ты обрежешь 4 старших байта указателя на свою строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 13:55:25 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокschiЯ передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание. так можно применять и между процессами?Нет. Указатель же выделяется в одном процессе. В другом процессе в этом месте может быть все, что угодно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 14:24:28 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДока ограничений по длине передаваемой строки нет? У меня как раз в рамках одного процесса (приложения) Нет. В любом случае там передаётся только целое. То, что ты его интерпретируешь как указатель - чисто твои заморочки, системе всё равно. Тогда уточню: в wparam передается целое, а lparam - указатель, как целое? YuRockты обрежешь 4 старших байта указателя на свою строку. Спасибо, не знал. Попробую. _Vasilisk_Нет. Указатель же выделяется в одном процессе. В другом процессе в этом месте может быть все, что угодно Тогда, имхо, нет смысла - тут ещё за освобождением памяти надо будет следить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 15:31:42 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокschiЯ передаю указатель на строку (NewStr), в приемнике освобождаю. Во избежание. так можно применять и между процессами? Между процессами надо делать разделенную копию передаваемых данных, доступную обоим процессам. Для системных сообщений и для WM_COPYDATA этим занимается система, для остальных ты можешь имитировать, создав общедоступную проекцию файла, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 15:32:36 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокТогда уточню: в wparam передается целое, а lparam - указатель, как целое?Это два целых, каждое равное машинному слову. Что-ты туда запихнешь - систему не интересует. Задача системы передать получателю именно те два числа, которые отправил отправитель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 16:35:00 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокТогда уточню: в wparam передается целое, а lparam - указатель, как целое? RTFM. Оба параметра тупо целые. Кажется, они даже одинакового размера, точно не помню. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 16:36:29 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Dimitry Sibiryakov, т.е. эти способы передачи Код: pascal 1. 2. 3. 4. 5. 6. и приема Код: pascal 1. 2. равнозначны? и не несут никаких подводных камней? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 17:22:01 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКажется, они даже одинакового размера, точно не помню. Думаю, да, раз они одинакового типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.09.2017, 18:18:33 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovКажется, они даже одинакового размера, точно не помню.Одинакового. В машинное слово. Один из параметров знаковый, второй без Докравнозначны?Абсолютно YuRockони одинакового типа.Разного. Первый параметр типа WPARAM, а второй типа LPARAM ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 14:21:27 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Докравнозначны?А нет. На приеме ті вот этим Док Код: pascal 1. на 64 битной архитектуре потеряешь 32 старших разряда ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 14:23:23 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_, Кстати, а на 64хбитной системе WParam и LParam - 64-битные или всё также 32х? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 18:54:16 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
alekcvp_Vasilisk_, Кстати, а на 64хбитной системе WParam и LParam - 64-битные или всё также 32х? Кстати 64-битные https://blogs.msdn.microsoft.com/oldnewthing/20110629-00/?p=10303 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 19:50:59 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_На приеме ті вот этим Док Код: pascal 1. на 64 битной архитектуре потеряешь 32 старших разряда т.е. так кошерно? Код: pascal 1. _Vasilisk_Один из параметров знаковый, второй без Странно, если ты имеешь ввиду отрицательные и положительные значения, то Код: pascal 1. в приемнике выдает соответственно -333 и -555 _Vasilisk_Первый параметр типа WPARAM, а второй типа LPARAM а можешь в двух словах об их отличии при использовании пользовательских сообщений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 20:21:19 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Дока можешь в двух словах об их отличии при использовании пользовательских сообщений? Ты тоже ссылку постом выше почитай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 20:43:19 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
schiТы тоже ссылку постом выше почитай почитал уже. Т.о. это имеет только историческое значение. Я тут читаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 20:54:49 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокschiТы тоже ссылку постом выше почитай почитал уже. Т.о. это имеет только историческое значение. Я тут читаю :) Что-то после фразы "В 16-разрядной Windows передача сообщения в окно всегда осуществляется синхронно отправитель не может продолжить работу, пока окно не обработает полученное сообщение " доверие к переводу несколько падает, потому что очередь сообщений и функция PostMessage были еще в 16-разрядной Windows... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 22:05:37 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Докт.е. так кошерно? Код: pascal 1. Кошерно. Но зачем? Чем не строило Код: pascal 1. Докв приемнике выдает соответственно -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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 22:48:39 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
_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 т.е., все равно никаких, кроме итсторического происхождения их названия? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 23:02:28 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_Чем не строило Код: pascal 1. решил выяснить все до конца. Привычка :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2017, 23:11:17 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокschiТы тоже ссылку постом выше почитай почитал уже. Т.о. это имеет только историческое значение. При отправке сообщений из 32х битного приложения в 64х битное, то WPARAM просто дополняется 0ми, т.е. если отправлялся Код: pascal 1. то в 64х битном приложении мы получим NativeInt(WPARAM) = 4294967295 и NativeInt(LPARAM) = -1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 10:33:23 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
alekcvpто в 64х битном приложении мы получим NativeInt(WPARAM) = 4294967295 и NativeInt(LPARAM) = -1. хорошо, а если так Код: pascal 1. 2. 3. где 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. а справка говорит Код: pascal 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 12:47:41 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Похоже, тема всех утомила. Попробую резюмировать: 1. если данные передаются в пределах приложений одной разрядности , то WParam = LParam = тип DWord(x32) и Int64(x64) 2. если данные передаются в пределах приложений разной разрядности , то WParam - тип DWord(x32) или QWord(x64) LParam - аналогично п.1 Все правильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 15:08:15 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
Док2. если данные передаются в пределах приложений разной разрядности , то Даже не пробовал так никогда, если честно. По идее вообще сработать вряд ли должно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 16:35:10 |
|
||
|
Lazarus: передачи строки посредством SendMessage
|
|||
|---|---|---|---|
|
#18+
ДокПохоже, тема всех утомила. Попробую резюмировать: 1. если данные передаются в пределах приложений одной разрядности , то ... то неважно как их интерпретировать, как Int или как UInt соотв. разрядности, т.к. они передаются "Как есть". Док2. если данные передаются в пределах приложений разной разрядности , то То преобразование происходит так: из х64 в х86: просто отбрасываются 32 старших разряда; из х86 в х64: для WParam просто дорисовываются 32 нуля слева, что превращает WPARAM в UInt64, при этом получаются сюрпризы если там предполагалось отрицательное число со знаком; Для LPARAM - идёт расширение со знаком, т.е. значение интерпретируется как Int32, после этого расширяется до Int64 с сохранением знака. Если там предполагалось беззнаковое число больше MaxInt[32], то снова получаются сюрпризы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2017, 20:45:17 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041860]: |
0ms |
get settings: |
5ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 186ms |
| total: | 426ms |

| 0 / 0 |
