Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, столкнулся с проблемой при отправке сообщений при помощи wm_copydata У меня есть родительский процесс, у которого есть line edit. Есть дочерний процесс, у дочернего процесса есть label. Задача, чтоб при написании текста в line edit он отобразился в дочернем процессе в поле label. Вот мой код у родителя: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. здесь я использую слот textChanged() Вот код у дочернего процесса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Но когда я ввожу в line edit в родителе строку в дочернем процессе появляется только одна буква(самая первая, которую ввел в родительском процессе). Почему может так получаться? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 11:29 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtus, Это Код: plaintext 1. очевидно неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 12:42 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. а вместо char* не wchar_t* должен быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 13:27 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtusПочему может так получаться? Потому что какой-то диверсант перед отправкой перевёл char* в WCharArray. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 13:39 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
m_Sla, если делать с wchar_t*, то ругается компилятор: " error: conversion from 'wchar_t*' to 'QChar' is ambiguous emit CopyData(QString((wchar_t*)pdata->lpData)); " ^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 15:36 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, спасибо! Переписал немного код родителя: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Так стали отправляються буквы, но только 4, после четырех букв появляются либо иероглифы, либо пусто. Больше нельзя отправлять, либо где-то ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 15:45 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
MasterZiv, а почему тут ошибка? Вот я поправил немного код: Код: plaintext 1. 2. 3. 4. 5. и получается, что только я напечатал букву она пересылается дочернему потоку. и размер буквы равен размеру char. Или в данном коде уже так нормально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 15:49 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtusстали отправляються буквы, но только 4 Угадай с трёх раз sizeof(char*), чудик. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 16:07 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, спасибо Вам большое=). И правда sizeof(char*) = 4 байта и поэтому отправляются 4 буквы=) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 16:11 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtusMasterZiv, а почему тут ошибка? Вот я поправил немного код: Код: plaintext 1. 2. 3. 4. 5. и получается, что только я напечатал букву она пересылается дочернему потоку. и размер буквы равен размеру char. Или в данном коде уже так нормально? Потому что должно быть что-то типа Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2014, 17:05 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtus, чтоб ты там не делал ты должен понимать что data.lpData -это указатель на ячейку памяти, начиная с которой у тебя лежит твое слово А слово состоит из буков. 1 буква=1байт (0-255) - по крайней мере в ansi Причем когда ты пишешь эти байты в память например С Л О В О - 5 букв, ты должен дописать 6-й байт /0 (0) И data.cbData у тебя в этом случае =6 (но в любом случае не меньше 6) - это твоя так сказать гарантия что эти 6 байт не сотрутся из памяти, пока другая сторона их не прочитает и не вернет результат на SendMessage в посылающее приложение. Если напишешь 4, то больше 4 байтов скорее всего не прочтешь. И кстати, на принимающей стороне, если ты не забываешь писать 0-байт на конце, то на data.cbData можешь не обращать внимание вообще, а тупо читать байты из памяти data.lpData, data.lpData+1, data.lpData+2, пока не уткнешься в завершающий \0 -это и будет конец твоего слова. Просто когда в VB6 я начинал с этим работать, у меня были точно такие проблемы, пока я не осознал как это работает и не написал 2 ф-ции: 1) которая кладет байты + \0 и возвращает адрес памяти 2) которая читает байты начиная с этого адреса вплоть до \0. С тех пор проблем нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 00:27 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtusm_Sla, если делать с wchar_t*, то ругается компилятор: " error: conversion from 'wchar_t*' to 'QChar' is ambiguous emit CopyData(QString((wchar_t*)pdata->lpData)); " ^тогда так Код: plaintext 1. и отправку можно проще сделать Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 07:17 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
m_Sla, data.cbData = ui->lineEdit->text().size() * 2; Вот это что за хрень? Почему на два? Это либо utf8, либо utf16, и в любом случае надо вычислять реальный размер строки в байтах. И он может быть некратен двум. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 10:26 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
Дмитрий77, спасибо за подробный ответ! Я понял, что нужно перед отправкой добавлять нулевой символ к слову, чтоб читалась информация только до него. У меня поэтому появляются на принимающей стороне мои быквы + различные иероглифы. Отправляющий процесс: Код: plaintext 1. 2. 3. 4. 5. 6. Я так понимаю, мне здесь нужно добавить '\0' символ? А к char* можно его добавлять, либо нужно по-другому писать? А когда захожу в дебаггере у меня остановка происходит после каждой введенной буквы, а на принимающей стороне только иероглифы. А на принимающей стороне у меня так: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 10:36 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
MasterZiv, спасибо! Теперь понял, в это поле мы храним размер данных, которые нужно отправить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 10:39 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
MasterZivm_Sla, data.cbData = ui->lineEdit->text().size() * 2; Вот это что за хрень? Почему на два? Это либо utf8, либо utf16, и в любом случае надо вычислять реальный размер строки в байтах. И он может быть некратен двум. ui->lineEdit->text().data() возвращает указатель на QChar: The QChar class provides a 16-bit Unicode character. Только про '\0' забыл. data.cbData = ui->lineEdit->text().size() * 2 + 2 ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 10:50 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
mr_virtusMasterZiv, спасибо! Теперь понял, в это поле мы храним размер данных, которые нужно отправить. Дошло наконец ! О! Я щаслиф! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 11:04 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
m_SlaMasterZivm_Sla, data.cbData = ui->lineEdit->text().size() * 2; Вот это что за хрень? Почему на два? Это либо utf8, либо utf16, и в любом случае надо вычислять реальный размер строки в байтах. И он может быть некратен двум. ui->lineEdit->text().data() возвращает указатель на QChar: The QChar class provides a 16-bit Unicode character. Только про '\0' забыл. data.cbData = ui->lineEdit->text().size() * 2 + 2 ; 16-bit Unicode character -- это utf-16, размер символа от 2 до 6 (если не ошибаюсь) байт. В любом случае во всём юникоде размер символов переменный. Постоянный только в UTF-32 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 11:05 |
|
||
|
отправка сообщений между процессами WM_COPYDATA
|
|||
|---|---|---|---|
|
#18+
Ни в одной из кодировок юникода нет постоянного размера символов. Просто потому, что есть составные символы и канонические представления. Если речь про коды (code points), то в рамках базовой плоскости и UTF-16 и UTF-32 используют фиксированное число байт на код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.03.2014, 15:39 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38582914&tid=2019626]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 281ms |
| total: | 421ms |

| 0 / 0 |
