我有一个启动子进程的Windows控制台应用程序。 如何向子进程发送消息? 我找到了像PostMessage()/PeekMessage()这样的函数 - 这就是我所需要的,但据我所知,它在一个应用程序中使用,并使用HWND来识别目标窗口(我在应用程序中没有窗口)。 此外,我还阅读了有关ipc的资料,例如命名管道也需要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;
}
}
}
子进程需要获得它应该完成其工作的消息,而不是立即终止,而是完成当前迭代。这就是为什么我不使用信号和阻止'接收消息'也不合适。
答案 0 :(得分:3)
[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)
尝试创建Message-Only Window。
这是一个仅用于发送和接收消息的窗口。您可以通过将HWND_MESSAGE
指定为窗口父级来创建它。
答案 2 :(得分:0)
在程序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);
}
}