Как отправить сообщение из одного консольного приложения Windows в другое?

У меня есть консольное приложение Windows, которое запускает дочерний процесс.
Как я могу отправить сообщение дочернему процессу?
Я нашел такие функции, как PostMessage () / PeekMessage () — это то, что мне нужно, но, как я понимаю, оно используется внутри одного приложения и использует HWND для определения целевого окна (у меня нет окон в приложении).
Также я читал материалы о МПК, например именованные каналы тоже требуют HWND.
Я хочу что-то подобное:

[program 1]

int main()
{
CreateProcess(.., processInfo);
SendMessage(processId, message);
}

[program 2]

int main()
{
while(1)
{
//      do thw work
Sleep(5 * 1000);
//      check message
if(PeekMessage(message,..))
{
break;
}
}
}

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

3

Решение

Попробуйте создать Окно только для сообщений.

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

1

Другие решения

[program 1]
int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

std::string path = "c:\\program2.exe";
CreateProcess(path.c_str(), .. , &si, &pi ) )
Sleep(12 * 1000); // let program2 do some work
PostThreadMessage(pi.dwThreadId, 100, 0, 0);
}

[program 2]
int main(int argc, char * argv[])
{
MSG message;
for(int i = 0; i < 1000; i++)
{
std::cout << "working" << std::endl;
Sleep(2 * 1000);
if(PeekMessage(&message, NULL, 0, 0, PM_NOREMOVE))
{
break;
}
}
}
1

В программе 1 вы должны использовать функцию FindWindow, чтобы получить дескриптор программы 2

а затем использовать функцию SendMessage

[программа 1]
    int main()
{
HWND hwnd=FindWindow(NULL,formText);//formText name of program 2
if(hwnd!=0)
{
COPYDATASTRUCT cd;
cd.dwData = 100;
cd.cbData = 100;
cd.lpData = msg;                //msg additional data
SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)(&cd));
}
}

[program 2]

void handlemessage(MSG *msg)
{
//handle
}int main()
{

MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
handlemessage(&msg);
}
}
0
По вопросам рекламы [email protected]