Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача текста другому приложению SendMessage(), передаю текст, а принимаются иероглифы 
V
    Опции темы
wallstreet
Дата 31.5.2012, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Всем добрый день. 
Собственно суть моей задачи сводится к освоению коммуникации двух приложений разных процессов путем передачи сообщения SendMessage(). Таким образом я создал два приложения (Sender и Acceptor) в одном из которых (Sender) происходит ввод текста пользователем в едит бокс и передача его другому (Acceptor), которое его принимает и выводит в элемент управления статик текст.
Проблема заключается в том, что передаю я то что ввел, а принимаю иероглифы. Есть предположение что обработка сообщения WM_COPYDATA работает только с ASCII кодировкой.

ссылки для скачивания: =>SENDER  ACCEPTOR

вобщем буду рад любой подсказке   smile 

Это сообщение отредактировал(а) wallstreet - 31.5.2012, 13:00
PM MAIL   Вверх
DarkProg
Дата 31.5.2012, 13:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: нет
Всего: 19



В Delphi есть специальная функция, SendTextMessage, реализация её вот такая 
Код

SendMessage(Handle, Msg, WParam, Windows.LPARAM(PWideChar(LParam)))


На стороне принимающего приложения нужно определить структуру(код делфи, но перевести на структуру не так сложно)

Код

  TTextMessage = packed record
      Msg: Cardinal;
      WParam: Integer;
      LParam: String;
      Result: LRESULT;
    end;


И принимать сообщение типа TTextMessage.

Извиняюсь, что не код на C, но думаю всё получится.


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
feodorv
Дата 31.5.2012, 14:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Вытяну код из многомегабайтных архивов. 

Sender
Код

INT_PTR CALLBACK Dialog1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hText, hEdit;
    static TCHAR *p;
    TCHAR *q;
    COPYDATASTRUCT cds;
    TCHAR text[256];
    switch(message)
    {
    /*case WM_CREATE:
        p = new TCHAR[256];
        break;*/
    /*case WM_COPYDATA:
        p = new TCHAR[((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR)];
        q = (TCHAR*)(((COPYDATASTRUCT*)lParam)->lpData);
        for(int i=0; i<256; ++i)
            text[i] = *q++;
        SetDlgItemText(hDlg, IDC_STATIC, text);
        break;*/
    case WM_INITDIALOG:
        hText = GetDlgItem(hDlg, IDC_STATIC);
        hEdit = GetDlgItem(hDlg, IDC_EDIT1);
        SetDlgItemText(hDlg, IDC_EDIT1, _T(""));
        return TRUE;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDOK:
            GetDlgItemText(hDlg, IDC_EDIT1, text, 256);
            /*for(int y=0; y<256; ++y)
                *p[y] = text[y]; */
            p = &text[256];
            SetDlgItemText(hDlg, IDC_STATIC, text);
            cds.cbData = 256 * sizeof(wchar_t);
            cds.lpData = p;
            SendMessage(FindWindow(NULL, _T("Acceptor")), WM_COPYDATA, 0, (LPARAM)&cds);
            SetFocus(hEdit);
            return TRUE;
        case WM_DESTROY:
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
    default: return FALSE;
    }
    return FALSE;
}


Acceptor
Код

INT_PTR CALLBACK Dialog1(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hText, hEdit;
    static TCHAR *p;
    TCHAR *q;
    int x;
    /*COPYDATASTRUCT cds;*/
    TCHAR text[256];
    switch(message)
    {
    /*case WM_CREATE:
        p = &text[256];
        break;*/
    case WM_COPYDATA:
        p = new TCHAR[((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR)];
        q = (TCHAR*)(((COPYDATASTRUCT*)lParam)->lpData);
        for(int i=0; i<256; i++)
            p[i] = *q++;
    
        SetDlgItemText(hDlg, IDC_STATIC, p);
        break;
    case WM_INITDIALOG:
        hText = GetDlgItem(hDlg, IDC_STATIC);
        hEdit = GetDlgItem(hDlg, IDC_EDIT1);
        SetDlgItemText(hDlg, IDC_EDIT1, _T(""));
        return TRUE;
    case WM_COMMAND:
        switch(LOWORD(wParam))
        {
        case IDOK:
            GetDlgItemText(hDlg, IDC_EDIT1, text, 256);
            SetDlgItemText(hDlg, IDC_STATIC, text);
            /*cds.cbData = 256 * sizeof(TCHAR);
            cds.lpData = p;*/
            /*SendMessage(FindWindow(NULL, _T("Acceptor")), WM_COPYDATA, 0, (LPARAM)&cds);*/
            SetFocus(hEdit);
            return TRUE;
        case WM_DESTROY:
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
    default: return FALSE;
    }
    return FALSE;
}



Цитата(wallstreet @  31.5.2012,  13:59 Найти цитируемый пост)
передаю я то что ввел, а принимаю иероглифы

Цитата

    p = &text[256];

Что это такое???  smile 
И это Вы посылаете? Это не то, что Вы ввели. То, что Вы ввели, находится здесь: &text[0].


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
wallstreet
Дата 31.5.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Цитата(feodorv @  31.5.2012,  14:08 Найти цитируемый пост)
Что это такое???   И это Вы посылаете? Это не то, что Вы ввели. То, что Вы ввели, находится здесь: &text[0]. 

Я в шоке просто. Неделю разбирался и писал все остальное и на такой мелочи попался.

Всех благодарю за помощь. smile  smile  smile 
PM MAIL   Вверх
feodorv
Дата 31.5.2012, 18:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(wallstreet @  31.5.2012,  15:48 Найти цитируемый пост)
и на такой мелочи попался.

Там есть ещё немного мелочёвки))))


Цитата(feodorv @  31.5.2012,  15:08 Найти цитируемый пост)
    case WM_COPYDATA:
        p = new TCHAR[((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR)];
        q = (TCHAR*)(((COPYDATASTRUCT*)lParam)->lpData);
        for(int i=0; i<256; i++)
            p[i] = *q++;
    
        SetDlgItemText(hDlg, IDC_STATIC, p);
        break;

При каждом WM_COPYDATA для p будет выделяться память (а прошлая выделенная - теряться). Зачем её вообще выделять, если выше есть объявление
Цитата(feodorv @  31.5.2012,  15:08 Найти цитируемый пост)
    TCHAR text[256];

Достаточно просто проверить, что данных пришло не слишком много, и они все умещаются в text.
p, кстати, так нигде и не высвобождается...


Далее. Здесь размер присланного ещё как-то учитывается:
Цитата(feodorv @  31.5.2012,  15:08 Найти цитируемый пост)
new TCHAR[((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR)];

Вот тут - 256 символов, и точка:
Цитата(feodorv @  31.5.2012,  15:08 Найти цитируемый пост)
        for(int i=0; i<256; i++)




--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
wallstreet
  Дата 5.6.2012, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Благодарю за подсказку. 
Незнаю правильно или нет, но переделал проблемный кусок и пока все работает как надо.
Код

case WM_COPYDATA:
        if(((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR)<=256)
        {
            q = (TCHAR*)(((COPYDATASTRUCT*)lParam)->lpData);
            for(int i=0; i<((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR); i++)
            {
                text[i] = *q++;
            }
        }
        SetDlgItemText(hDlg, IDC_STATIC, text);
        break;


Теперь необходимость в выделении памяти отпала, как и в ее удалении. smile 
PM MAIL   Вверх
volatile
Дата 5.6.2012, 23:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(wallstreet @  5.6.2012,  16:16 Найти цитируемый пост)
        if(((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR)<=256)
        {
            q = (TCHAR*)(((COPYDATASTRUCT*)lParam)->lpData);
            for(int i=0; i<((COPYDATASTRUCT*)lParam)->cbData/sizeof(TCHAR); i++)
            {
                text[i] = *q++;
            }
        }
        SetDlgItemText(hDlg, IDC_STATIC, text);
        break;

Если данных пришло больше 256, зачем посылать мусор из text[] в IDC_STATIC ?

Зачем вообще столько лишних движений ?
Код

case WM_COPYDATA:
        SetDlgItemText(hDlg, IDC_STATIC, (TCHAR*)(((COPYDATASTRUCT*)lParam)->lpData));
        break;

PM MAIL   Вверх
wallstreet
Дата 6.6.2012, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



О да, супер!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.