У меня есть консольное приложение 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;
}
}
}
Дочерний процесс должен получить сообщение о том, что он должен завершить свою работу, не завершать немедленно, а завершить текущую итерацию. Вот почему я не использую сигналы, и блокировка «получать сообщения» тоже не подходит.
Попробуйте создать Окно только для сообщений.
Это окно, которое используется только для отправки и получения сообщений. Вы можете создать его, указав HWND_MESSAGE
как родитель окна.
[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 вы должны использовать функцию 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);
}
}