结束C ++程序的最佳方法是什么?使用ShellExecute函数启动?

时间:2013-01-08 14:16:26

标签: c++ c visual-c++

从主程序结束使用ShellExecute函数启动的c ++程序的最佳方法是什么?像..

 ShellExecute(hwnd, TEXT("open"), TEXT("c:\\tools\\123\\myProgram.exe"),
              TEXT(""), NULL, 0);

在这种情况下,启动的程序是“我的Program.exe”,我想结束它们。主程序&用vc ++编写的已启动的程序控制台应用程序。

3 个答案:

答案 0 :(得分:2)

在子计划中:

int main(/*...*/) {
    //...
    return 0;
}

您可以通过进程间通信或通过向子程序的stdin发送某种控制序列来告诉它从主程序执行此操作。如果有消息泵,则将WM_QUITWM_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。