1

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

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

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

4

3 回答 3

2

在子程序中:

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

您可以通过进程间通信或通过将某种控制序列发送到子程序的stdin. 如果有消息泵, 发布WM_QUIT或发送到其他进程也应该可以工作。WM_CLOSE

TerminateProcess()将结束程序,但这肯定不是最好的方法。(清理未运行)

Exit(0)这也不是一个坏方法,但它也需要告诉子程序它应该终止。

于 2013-01-08T14:41:09.253 回答
1

最好的方法是正常退出子进程(返回)。这总是比试图从另一个进程中终止要好,因为您永远无法知道子进程处于什么状态。您可以使用像事件这样的内核对象,甚至可以创建一个文件以便子进程看到。这应该发出退出的信号。

于 2013-01-08T14:56:32.943 回答
1

使用 CreateProcess 生成过程会更好。您可以使用进程 ID 优雅地终止生成的进程:

在子进程中,通过调用 SetConsoleCtrlHandler 注册 ctrl handler。在句柄中处理 CTRL_CLOSE_EVENT。

当您准备好终止子进程时,调用 EnumWindows 传递从您作为 LPARAM 传递给 CreateProcess 的 PROCESS_INFORMATION 结构获得的进程 ID。

在枚举 windows 过程中调用 GetWindowThreadProcessId 并与您传递的 LPARAM 进行比较,如果它们匹配,则调用 PostMessage 或 SendMessage,将 windows 句柄、WM_SYSCOMMAND 消息、SC_CLOSE 命令作为 WPARAM 和 0 作为 LPARAM;

您的子进程将收到 CTRL_CLOSE_EVENT 控件类型。在处理程序中,在返回之前调用将执行清理和退出的函数。之后从处理程序返回 TRUE。

于 2013-01-09T14:36:40.303 回答