从主程序结束使用ShellExecute函数启动的c ++程序的最佳方法是什么?像..
ShellExecute(hwnd, TEXT("open"), TEXT("c:\\tools\\123\\myProgram.exe"),
TEXT(""), NULL, 0);
在这种情况下,启动的程序是“我的Program.exe”,我想结束它们。主程序&用vc ++编写的已启动的程序控制台应用程序。
答案 0 :(得分:2)
在子计划中:
int main(/*...*/) {
//...
return 0;
}
您可以通过进程间通信或通过向子程序的stdin
发送某种控制序列来告诉它从主程序执行此操作。如果有消息泵,则将WM_QUIT
或WM_CLOSE
发布到其他进程也应该有效。
TerminateProcess()
将结束该计划,但这肯定不是最好的方式。 (不运行清理)
Exit(0)
也不是一个坏的方法,但它也要求子程序告诉它应该终止。
答案 1 :(得分:1)
最好的方法是从子流程(返回)正常退出。它总是比尝试从另一个终止进程更好,因为你永远不知道子进程处于什么状态。您可以像事件一样使用内核对象,甚至可以创建文件以便子进程看到。这应该标志着它退出。
答案 2 :(得分:1)
使用CreateProcess进行产卵过程会更好。您可以使用进程ID优雅地终止生成的进程:
在子进程中,通过调用SetConsoleCtrlHandler来注册ctrl处理程序。 在手柄中处理CTRL_CLOSE_EVENT。
当您准备终止子进程时,请调用EnumWindows传递从您传递给CreateProcess的PROCESS_INFORMATION结构获得的进程ID作为LPARAM。
在枚举windows过程中调用GetWindowThreadProcessId并与您传递的LPARAM进行比较,如果它们匹配,则调用PostMessage或SendMessage,将Windows句柄,WM_SYSCOMMAND消息,SC_CLOSE命令作为WPARAM传递,将0作为LPARAM传递;
您的子进程将收到CTRL_CLOSE_EVENT控件类型。在处理程序中,在返回之前调用将执行清理并退出的函数。之后从处理程序返回TRUE。