С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92

Передать строку, между двумя приложениями

10.03.2012, 11:46. Показов 8806. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток! Помогите, пожалуйста, решить вопрос: необходимо передать строку, между двумя приложениями, используя функции WinAPI (sendMessage, getMessage, postMessage). Использую IDE Visual Studio 2010 + Qt 4.7.0. были попытки выполнить через COPYDATASTRUCT, пытался создавать переменные в куче, в стеке... результат один - вылет программы-приемника при попытке скастить msg.lparam к определенному типу данных. Привожу один из вариантов кода:

Функция отправки:
C++
1
2
3
4
5
6
7
8
9
10
11
----------------------------------------------------------------------------------------------
        HWND h=0;
    if(h == 0) h = FindWindow(NULL, L"SheduleServer");
    if(h == 0) {
        QMessageBox::critical(this, "Ошибка", "Не удалось найти хэндл приложения");
        return;
    }
        if (h != NULL)
    {
        ::PostMessage(h,WM_USER+2, 0, (LPARAM) "Hello!!!");
    }
Функция приемки:
C++
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
26
MSG msg;
    while((ret = GetMessage(&msg, NULL, 0, 0)))
    {
        if (ret){
            if(msg.message==WM_USER+2){
                LPCTSTR lpszString = (LPCTSTR)msg.lParam;
                if(!lpszString){
                    QMessageBox::critical(this,"","error!!");
                    continue;
                }
                QMessageBox::information(this, tr("Data"), QString::fromUtf16( (const ushort*) lpszString ));
            }else if(msg.message==WM_COPYDATA){
                              char buffer[25];               // тип принимаемых данных (аналогичен типу передаваемых данных) 
 
                COPYDATASTRUCT *cd;
                cd = (COPYDATASTRUCT *) msg.lParam;
                strcpy(buffer,(char *)cd->lpData);
                QMessageBox::information(this,"",buffer);
                qApp->processEvents();
            }else continue;
 
        
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
Заранее спасибо!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.03.2012, 11:46
Ответы с готовыми решениями:

чат между двумя приложениями
вообщем надо разработать чат работающий между двумя приложениями, у меня в целом это сделать получилось , но у меня обязательно необходимо...

Обмен данными между двумя приложениями
есть 2 приложения. Приложение 1 - Создает Приложение 2 с помощью CreateProcess(); следовательно знает его ThreadId и ProcessId и...

Связь между двумя приложениями
Здравствуйте, у меня такой вопрос: как организовать связь между двумя приложениями написанными на C#. Суть вот в чём одно приложение...

17
375 / 322 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
10.03.2012, 14:03
В MSDN есть же пример Using Data Copy
1
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
10.03.2012, 17:40  [ТС]
Не совсем ясно, куда пристегнуть
C++
1
2
3
 MyDisplay( (LPSTR) ((MYREC *)(pMyCDS->lpData))->s1,
                    (LPSTR) ((MYREC *)(pMyCDS->lpData))->s2,
                    (DWORD) ((MYREC *)(pMyCDS->lpData))->n );
и что я должен делать с параметрами LPSTR, LPSTR, DWORD. Как, к примеру, вывести их в MEssageBox, и что значит первый и второй параметр
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.03.2012, 17:47
judarical, передавть можно посредством SendMessage.К примеру SendMessage(hWndConsumer,WM_COMMAND,wPar am(к примеру пусть будет 777),lParam);
У приложения клиента парсишь своё послание в WndProc
C
1
2
3
4
5
WndProc(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)
{ 
     if(message == WM_COMMAND && wParam == 777)
          MessageBox(hWnd,"Команда пришла","Бинго!",MB_OK);
     ....
Либо можно работать через отображённый в память файл посредством MapViewOfFile. Вариантов море...
0
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
10.03.2012, 19:29  [ТС]
-=ЮрА=-, спасибо, за ответ, но мне не нужны другие варианты: есть конкретная задача с двумя конкретными приложениями. Передавать нужно именно строку и именно через функцию sendMessage (postMessage), принимать = через getMessage().Проблема в том, что я перепробовал множество вариантов, но не могу принять во втором приложении строку. Пример кода я привел. Может подскажете, где именно в коде ошибки?
В этом:
C++
1
QMessageBox::information(this, tr("Data"), QString::fromUtf16( (const ushort*) lpszString ));
и этом
C++
1
QMessageBox::information(this,"",buffer);
местах происходит крэш.
0
10.03.2012, 19:40

Не по теме:

Цитата Сообщение от judarical Посмотреть сообщение
-=ЮрА=-, спасибо, за ответ, но мне не нужны другие варианты: есть конкретная задача с двумя конкретными приложениями.
- если ты читал внимательно и вдумчиво я как раз и показал как решить твою проблему...

0
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
10.03.2012, 19:57  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

- если ты читал внимательно и вдумчиво я как раз и показал как решить твою проблему...

Юрий, спасибо за комменты!
Я совершенно вдумчиво и разборчиво читал ваш ответ, но вы совершенно не осознали суть моей проблемы. Не нужно ни WndProc, ни прочих "примочек". Жестко: прием через getMessage (как в моем коде, это каприз не мой, а постановщика задачи). Проблема заключается в кастинге lParam. Скорее всего, я либо не так передаю, либо не так принимаю (больше не знаю, на что грешить). Где именно не так - вот вопрос. Перефразирую: есть кусок кода в топике, именно в нем необходимо найти и устранить ошибку (с WinAPI я не совсем дружен, потому прошу совета). Может, кому-то ошибка явно бросится в глаза.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
10.03.2012, 21:03
Цитата Сообщение от judarical Посмотреть сообщение
с WinAPI я не совсем дружен, потому прошу совета
- возможно это и не даёт тебе понять что
Цитата Сообщение от judarical Посмотреть сообщение
while((ret = GetMessage(&msg, NULL, 0, 0)))
, извлекает сообщение из очереди сообщений вызывающего потока а мы шлём из ругого потока, поэтому сначала в WindowProc должны "словить" внешнее сообщение, а затем уже выдать за наше. Прости за прямоту - ты упёрся рогом и даже на грамм не хочешь подправить свой код, который я вообще считаю некорректным(он просто не выдерживает критики, по крайней мере на мой взгляд). Ещё раз пишу как передавать сообщения по схеме Send - GetMessage и подкрепляю кодом(если уже и это не возымеет никакого влияния, то помощь прекращу...).

Вот код Sender-а
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <windows.h>
#include <stdio.h>
 
int main()
{
    HWND hWnd = FindWindow(NULL,"MSGConsumer");
    if(!hWnd)
        printf("Can't find Consumer window\n");
    else
    while(1)//Будем постить потребителю постоянно
    {
        SendMessage(hWnd,WM_USER + 7,777,0);
        system("pause");//Ждём нажатия любой клавиши чтобы запостить
    }
    return 0;
}
Вот код Consumer-а
C
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
// project.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
HWND hMain = NULL;
//Стандартная функция обработки сообщений окном
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    UINT nCmd = HIWORD(wParam);
    UINT idCtrl = LOWORD(wParam);
    HWND hChild = (HWND)lParam;
    switch (msg)
    {      
    case WM_USER + 7:
        PostMessage(hWnd,msg,wParam,0);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: 
                return DefWindowProc(hWnd, msg, wParam, lParam); //возвращаем дефолтные значения                
    }
    return 0l;
}
//Главная функция приложения
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{  
    MSG msg;
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.lpszClassName = "MyWndClass"; //Название класса окна
    wc.hInstance = hInst ;
    wc.hCursor   = LoadCursor(NULL, IDC_ARROW); //Курсор в окне
    wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); //Цвет окна
    wc.lpfnWndProc = WndProc;        
    RegisterClass(&wc); //Регистрируем класс окна
    //Создать окно
    hMain = CreateWindow
        (
            wc.lpszClassName, 
            "MSGConsumer", 
            WS_OVERLAPPEDWINDOW, 
            100, 
            100, 
            400, 
            300, 
            0, 
            0, 
            hInst, 
            0
        );  
    ShowWindow(hMain, SW_SHOW); //Показать окно
    UpdateWindow(hMain); //Обновить окно
    //Стандартный цикл обработки сообщение приложением
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if(msg.message == WM_USER + 7 && msg.wParam == 777)
        if(MessageBox(hMain,"MSGSender says wParam == 777","GetMessage",MB_OK))
            msg.message = 0;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (INT)msg.wParam;
}
Убедись что обработка идёт в цикле GetMessage а WindowProc лишь ретранслирует сообщение из вне внутрь очреди сообщений программы
C
1
2
3
4
5
6
7
8
while (GetMessage(&msg, NULL, 0, 0))
    {
        if(msg.message == WM_USER + 7 && msg.wParam == 777)
        if(MessageBox(hMain,"MSGSender says wParam == 777","GetMessage",MB_OK))
            msg.message = 0;
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
Ниже скрины работы и готовые экзешники
Миниатюры
Передать строку, между двумя приложениями  
Вложения
Тип файла: rar MSGSender.exe.rar (14.3 Кб, 52 просмотров)
Тип файла: rar MSGConsumer.exe.rar (8.1 Кб, 50 просмотров)
2
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
28.03.2012, 19:48  [ТС]
Ребята, все же, если есть на этом форуме кто-нибудь, кто может подсказать, как передать через postMessage СТРОКУ (не число, не другого типа переменную, а набор char-ов, СТРОКУ!!!, с другими типами передаст даже ребенок), помогите, пожалуйста, очень нужно!!!

С уважением, Евгений
0
28.03.2012, 21:00

Не по теме:

judarical, займёмся, самому интересно стало...

0
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
28.03.2012, 21:18  [ТС]
Приветствую вас, Юрий!
Благодарю вас за предыдущие попытки мне помочь!

Возможно я не смог сформулировать свои мысли в корректной форме в прошлый раз. Нужно было сильнее акцентировать внимание на СТРОКАХ, в этом моя вина)))
Передавать и получать сообщения я могу без проблем (я имею ввиду, целые числа). А вот над строкой я наколдовался настолько, что уже голова в этом направлении не варит совсем: все время крэшится при получении мессаджа ().
Пишу я все это дело в VS 2010. В качестве инструментария - встроенный Qt.
Не спрашивайте, зачем мне это надо - была бы моя воля, давно уже сделал все через QSharedMemory. Как бы тупо это не звучало, мне нужно именно строковое сообщение и именно WinAPI с post, get.

Наработки я выкладывал выше (кроме этого пробовал еще по разному изощряться). В общем, на выходе клиента я должен иметь строку (QString, можно ее преобразовать в BSTR и обратно, ну, при желании - в другую сишную строку)...

могу расписать код, а также, как и что я им хотел сделать, если это поможет)
0
28.03.2012, 21:59

Не по теме:

Цитата Сообщение от judarical Посмотреть сообщение
сообщение и именно WinAPI с post, get.
- так это же клиент-серверная пара. Ок в моей голове уже созрело два варианта:
1 - Клиент-сервер
2 - Общаться через отображенный в память файл
Понятное дело написание кода потребует какого-то времени...

0
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
28.03.2012, 22:10  [ТС]
1) Общаться через файл - не вариант (точнее этот вариант я сам способен реализовать и он тут черезчур костыльный буде, как сааамый запасной))))
2) Технология, я бы сказал "говноклиент-говносервер", потому что в реали даже не знаю, куда такой трэш прикрутить.
Вот рабочий код, только с цифрами (припендюрить надо строки сюда):
Говноклиент:
C++
1
2
3
4
if (h != NULL)
    {
        ::PostMessage(h,WM_USER+2, 0, 50);
    }
Говносервер:
C++
1
2
3
4
5
6
7
8
9
10
bool ret;
    MSG msg;
    while((ret = GetMessage(&msg, NULL, 0, 0)))
    {
        if (ret){
                   if(msg.message==WM_USER+2){
                             QMessageBox::information(this, tr("Connected"), QString::number(msg.lParam));
                   }
                }
         }
Вот только, как сделать, чтобы говноклиент отправлял долбанную строку, а говносервер принимал ее? Пример реализации в Builder tcnm))):
C++
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
******************** 4.Отправка пользовательского сообщения другому приложению (PostMessage)***********
 
TMessage mes;
PostMessage(H,WM_GET,mes.LParam,mes.WParam);
 
******************** 5.Отправка пользовательского сообщения другому приложению (SendMessage)***********
 
TMessage mes;
SendMessage(H,WM_GET,mes.LParam,mes.WParam);
 
******************** 6.Отправка сообщения WM_COPYDATA**************************************************
 
        COPYDATASTRUCT cd;
    char buffer[25];                 // тип передаваемых данных
    strcpy(buffer,"Hello Server");   // передаваемые данные
    
        cd.lpData=&buffer;
    cd.cbData= sizeof(buffer);
 
    if (hwnd != NULL)
    {
        ::SendMessage(hwnd,WM_COPYDATA, 0, (LPARAM) &cd);
    }
 
******************** 7.Регистрация функции приема сообщений *********************************************
 
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
   Form1->WindowProc = OnMessage;
}
 
******************** 8.Обработка  входящих сообщений ****************************************************
 
void __fastcall TForm1::OnMessage(TMessage &Message)
{
  if(Message.Msg == WM_GET)      // если сообщение GET
  {
     ....... // выполняем определенные действия
  }
 
    if(Message.Msg == WM_COPYDATA)      // если сообщение WM_COPYDATA
  {
        
        char buffer[25];               // тип принимаемых данных (аналогичен типу передаваемых данных) 
    
    COPYDATASTRUCT *cd;
        cd = (COPYDATASTRUCT *) Message.LParam;
 
    strcpy(buffer,(char *)cd->lpData);     
 
         ....... // выполняем определенные действия
  }
 
  else
    WndProc(Message);
}
Вот. А нужно типа того, но в Visual Studio и еще преобразовать в конце в кьютешную строку. Вот это гавно из гавна, на мой взгляд, а не задача (((((((
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
28.03.2012, 22:17
Цитата Сообщение от judarical Посмотреть сообщение
(точнее этот вариант я сам способен реализовать и он тут черезчур костыльный буде, как сааамый запасной))
- отображённый в память файл MapViewOfFile кто сказал что это файл на диске???Это область в файле подкачки

Добавлено через 39 секунд
Остальное мне не очень нра, сделаю через сокеты

Добавлено через 58 секунд

Не по теме:

PS:Буду писать под студию, билдер не использую при написании программ

0
 Аватар для judarical
5 / 4 / 0
Регистрация: 06.11.2010
Сообщений: 92
28.03.2012, 22:29  [ТС]
Юрий, дело не совсем так, как вы его себе представляете:
важен не тот факт, что я решу задачу, а важно, КАК я ее решу (ну это долбанное неотъемлемое условие). Других вариантов решения масса, я их готов реализовать сам, но по-другому НЕЛЬЗЯ (((

Если вы тоже, как и я, не знаете, как поменять куски моего кода, чтобы через lparam или wparam корректно передать вместо числа указатель на строку, а потом get-ом получить указатель и считать строку, и чтоб ничего не выкрошилось, то лучше не тратьте ваше драгоценное время, я и так безмерно благодарен вам за внимание к моей проблеме (

В крайнем случае я сделаю передачу через sharedMemory, а post, get-ами буду отсылать сигналы о поступлении нового сообщения (тупой и никчемный костыль, тупее, чем сама задача). Но просто одна мысль, что это возможно реализовать, а у меня все крэшится, не дает мне покоя: безмерно хочется извлечь отсюда опыт и научиться это делать.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
29.03.2012, 13:06
judarical, есть такая поговорка если гора не идёт к Магомету, то Магомет идёт к горе, ну так вот если мы не можем впихнуть строку в 1 параметр, почему бы не передавать данную строку посимвольно?
Вот код продвинутого отправителя
C
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
26
27
28
29
30
31
32
33
#include <windows.h>
#include <string.h>
#include <stdio.h>
 
#define WM_SEND  WM_USER + 7
 
int main()
{
    long i, length;
    //Çàõî÷åøü áîëüøåå ñîîáùåíèå
    char msg[1024] = {0};//äåëàé áîëüøå 
    HWND hWnd = FindWindow(NULL,"MSGConsumer");
    if(!hWnd)
        printf("Can't find Consumer window\n");
    else
    while(TRUE)//Áóäåì ñëàòü ñîîáùåíèÿ ïîñòîÿííî
    {
        printf("Enter text to send (less than 1024 chars)\n>");
        scanf("%[^\n]",msg);
        getchar();//óáåð¸ò ^\n îñòàâøååñÿ îò ââîäà
        length = strlen(msg);//Óçíà¸ì äëèííó íàøåãî ñîîáùåíèÿ
        
        //Ïåðåäà¸ì êëèåíòó êàêîé äëèííû ñîîáùåíèå
        SendMessage(hWnd,WM_SEND,length,-1);
        for(i = 0; i < length; i++)
            //Ïåðåäà¸ì êëèåíòó êàêîé ñèìâîë è ñîîáùåíèÿ ïåðåäàëè
            SendMessage(hWnd,WM_SEND,msg[i],i);
        //Ãîâîðèì êëèåíòó ÷òî ïåðåäà÷à îêîí÷åíà
        SendMessage(hWnd,WM_SEND,     0,-1);
    }
    system("pause");
    return 0;
}
Вот код API приёмника
C
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
// project.cpp : Defines the entry point for the application.
//
 
#include "stdafx.h"
#include <stdlib.h>
HWND hMain = NULL;
#define WM_SEND  WM_USER + 7
//Ñòàíäàðòíàÿ ôóíêöèÿ îáðàáîòêè ñîîáùåíèé îêíîì
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {      
        case WM_SEND:
            PostMessage(hWnd,msg,wParam,lParam);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default: 
            return DefWindowProc(hWnd, msg, wParam, lParam); //âîçâðàùàåì äåôîëòíûå çíà÷åíèÿ                
    }
    return 0l;
}
//Ãëàâíàÿ ôóíêöèÿ ïðèëîæåíèÿ
INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int)
{  
    char * str = NULL;//Áóäåò ñîäåðæàòü íàøå ñîîáùåíèå
    MSG msg;
    WNDCLASS wc;
    memset(&wc, 0, sizeof(wc));
    wc.lpszClassName = "MyWndClass"; //Íàçâàíèå êëàññà îêíà
    wc.hInstance     = hInst ;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW); //Êóðñîð â îêíå
    wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); //Öâåò îêíà
    wc.lpfnWndProc   = WndProc;        
    RegisterClass(&wc); //Ðåãèñòðèðóåì êëàññ îêíà
    //Ñîçäàòü îêíî
    hMain = CreateWindow
                (
                        wc.lpszClassName, 
                        "MSGConsumer", 
                        WS_OVERLAPPEDWINDOW, 
                        100, 
                        100, 
                        400, 
                        300, 
                        0, 
                        0, 
                        hInst, 
                        0
                );  
    ShowWindow(hMain, SW_SHOW); //Ïîêàçàòü îêíî
    UpdateWindow(hMain); //Îáíîâèòü îêíî
    //Ñòàíäàðòíûé öèêë îáðàáîòêè ñîîáùåíèå ïðèëîæåíèåì
    while (GetMessage(&msg, NULL, 0, 0))
    {
        if(msg.message == WM_SEND)
        {
            switch(msg.lParam)
            {
                case -1:
                    if(msg.wParam)
                    {
                        if(!(str = (char *)malloc((1 + msg.wParam)*sizeof(char))))
                            MessageBox(hMain,"Allocation memory error",NULL,MB_OK);
                        else
                            str[(msg.wParam)] = '\0';
                    }
                    else
                    {
                        if(str)
                        {
                            SetForegroundWindow(hMain);
                            MessageBox(hMain,str,"Incoming message",MB_OK);
                            free((void *)str);
                        }
                    }
                    break;
                default:
                    if(str)
                        str[(msg.lParam)] = (char)msg.wParam;
                    break;
                };
            }
        else
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return (INT)msg.wParam;
}
Всем читающим данный топик буду признателен за реализацию консолького приёмника, как показала практика такой вариант отказывается работать даже если реализую в отправителе не SendMessage а SendMessageTimeout
Почему-то не работающий консольный вариант
C
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <windows.h>
#include <string.h>
#include <stdio.h>
 
#define WM_SEND  WM_USER + 7
 
int main()
{
    MSG msg;
    char * str    = NULL;
    HWND hConsole = GetForegroundWindow();
    if(!SetConsoleTitle("MSGConsumer"))
        MessageBox(NULL,"SetTitle error",NULL,MB_OK);
    else
    while(TRUE)//Постоянный цикл обработки
    {
        if(PeekMessage(&msg,hConsole,0,0,PM_REMOVE))
        {
            if(msg.message == WM_SEND)
            {
                switch(msg.lParam)
                {
                    case -1:
                        if(msg.wParam)
                        {
                            if(!(str = (char *)malloc(msg.wParam*sizeof(char))))
                                printf("Allocation memory error\n");
                            else
                                str[msg.wParam] = '\0';
                        }
                        else
                        {
                            if(str)
                            {
                                SetForegroundWindow(hConsole);
                                printf("Incoming message :\n>%s\n",str);
                                free((void *)str);
                                system("pause");
                            }
                        }
                        break;
                    default:
                        //system("cls");
                        printf("get char %c",(char)msg.wParam);
                        if(str)
                            str[msg.lParam] = (char)msg.wParam;
                        break;
                };
            }
        }
    }
    return 0;
}
Миниатюры
Передать строку, между двумя приложениями  
Вложения
Тип файла: rar Sender2.exe.rar (17.0 Кб, 41 просмотров)
Тип файла: rar MSGConsumer.exe.rar (8.2 Кб, 33 просмотров)
2
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
30.03.2012, 10:32
А разве не получится так:
C++
1
2
3
        static char txt[]="Строка";
        ...
        PostMessage(hWnd,WM_USER + 2,777,(LPARAM)txt);
Разница по сравнению с исходным кодом в том, что строка остается в памяти
после вызова PostMessage();
Однако я не уверен, что это не вызовет ошибку защиты памяти, т.к. это разные
приложения.

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
case WM_SEND: PostMessage(hWnd,msg,wParam,lParam);
Не понимаю этого:
Окну пришло сообщение WM_SEND и оно снова отправляется этому же окну с теми же параметрами.
Мне кажется - это зацикливание.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
30.03.2012, 11:15
Цитата Сообщение от zss Посмотреть сообщение
Окну пришло сообщение WM_SEND и оно снова отправляется этому же окну с теми же параметрами.
Мне кажется - это зацикливание.
- оно то пришло но нужно его ещё в очередь сообщений конкретного окна поставить, как видишь без ретрансляции с момощью PostMessage коносльный вариант не работает...
Цитата Сообщение от zss Посмотреть сообщение
(LPARAM)txt
- внутри приложения да, другому окну, не думаю, я даже не рассматривал такой вариант так как уверен он не пройдёт...

Добавлено через 2 минуты
zss, если есть желание поэксперементировать накинь на SendMessage if и посмотри что ни одно сообщение как бы не отправилось, другое дело PostMessage в Consumere подхватило эти сообщения и поставило в очередьсообщений конкретного окна Consumer (т.е PostMessage рентранслировал сообщения уже в очередь) , но сам SendMessage ни одного сообщения так в очередь и не вклинил.
Мне не понятно почему ТС молчит, хоть бы какой то фидбек дал на последний код...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2012, 11:15
Помогаю со студенческими работами здесь

Чат между двумя приложениями
Здравствуйте, подскажите как сделать чат между двумя разными приложениями android

Общение между двумя приложениями
В процессе разработки приложения wpf я окончательно убедился что моя программа не совместима с wpf всего по одной причине , не достаточно...

Диалог между двумя приложениями
Всем добро :senor: Возникла необходимость научить два моих ЕХЕ, а именно чекить чекбоксы передавать данные с Мемо и ляблов. Если кому не...

Взаимодействие между двумя приложениями
Я читал возможные варианты и из того, что нашел, если верно понял не подходит ничего (отрицать не буду, еще не отоспался после сданного...

Обмен между двумя приложениями
Добрый день! Столкнулась с проблемой. Есть программа на VB6. Для нее пишется программа отдельное дополнение (тоже на VB). Нужно как-то их...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru