从 MFC UI 打开新进程

Posted

技术标签:

【中文标题】从 MFC UI 打开新进程【英文标题】:Opening new process from MFC UI 【发布时间】:2018-11-16 05:01:18 【问题描述】:

我使用 Visual C++ 开发了一个 UI,应用程序类型是基于 diolog 的。

为了从我的 UI 执行另一个应用程序 (CLI),我使用了 ShellExecute() 函数。 此应用程序完成其工作并随着代码在我的 UI 中运行而消失。

从UI方面,如何知道应用程序是否成功完成了它的工作?

谁能帮忙实现我的可视化 C++ 代码和从该代码打开的另一个外部应用程序之间的通信。

这是我用于执行应用程序的代码 sn-p,

CString cmd = "/C command parameters";
HINSTANCE hinst = ShellExecute(0, "open", "bin\\My application.exe", cmd, 0, SW_SHOW);

在我的application.exe中,如果操作成功,最后一行会打印“成功”,有什么方法可以从UI端读取行。

【问题讨论】:

查找该应用的返回码以确定它是否已成功完成工作。 如果您想等待进程完成,请使用CreateProcess + WaitForSingleObject ***.com/a/42544/4603670,或者使用ShellExecuteEx... 使用CreateProcess,您也可以将redirect the output of My application.exe 连接到您自己的应用程序的管道中,这样您就可以读取输出。 您的意思可能是"/C command parameters";而不是"\C command parameters";,请确认和/或更正。你可以edit你的问题。 cmd.GetBuffer(0) 只是一个解决方案,前提是您了解 CString::GetBuffer 的作用以及它对您的要求。如果不这样做,您只是创建了一个新错误。 【参考方案1】:

返回值可以转换为 int。

  类型:HINSTANCE

如果函数成功,则返回大于 32 的值。如果函数失败,则返回指示失败原因的错误值。返回值被转换为 HINSTANCE 以向后兼容 16 位 Windows 应用程序。然而,这不是一个真正的 HINSTANCE。它只能转换为 int 并与 32 或以下错误代码进行比较。

  返回码                        描述 0                  操作系统内存或资源不足。 ERROR_FILE_NOT_FOUND 找不到指定的文件。 ERROR_PATH_NOT_FOUND 找不到指定的路径。 ERROR_BAD_FORMAT .exe 文件无效(非 Win32 .exe 或 .exe 映像错误)。 SE_ERR_ACCESSDENIED 操作系统拒绝访问指定文件。 SE_ERR_ASSOCINCOMPLETE 文件名关联不完整或无效。 SE_ERR_DDEBUSY 由于正在处理其他 DDE 事务,因此无法完成 DDE 事务。 SE_ERR_DDEFAIL DDE 事务失败。 SE_ERR_DDETIMEOUT 由于请求超时,DDE 事务无法完成。 SE_ERR_DLLNOTFOUND 找不到指定的 DLL。 SE_ERR_FNF 找不到指定的文件。 SE_ERR_NOASSOC 没有与给定文件扩展名关联的应用程序。 如果您尝试打印不可打印的文件,也会返回此错误。 SE_ERR_OOM 内存不足,无法完成操作。 SE_ERR_PNF 找不到指定的路径。 SE_ERR_SHARE 发生共享冲突。

请参阅link。

【讨论】:

希望返回值是shellexecute()是否打开My appliaction.exe失败,而不是My application.exe的返回值。 @TiYan 返回值只表示ShellExecute是否成功。使用这种方法,您不知道应用程序是否成功完成了它的工作。最好改用CreateProcess @zett42 谢谢,但是当我将 CreateProcess() 的第二个参数作为 cmd CString cmd = "\C command parameters"; 给出时出现错误,例如 Cstring 无法转换为 LPSTR,您能否提出解决方案。 解决方案:阅读working with strings,然后阅读CreateProcessW 的文档。如果编译器错误让您感到困惑,浏览The Definitive C++ Book Guide and List 永远不会出错。

以上是关于从 MFC UI 打开新进程的主要内容,如果未能解决你的问题,请参考以下文章

MFC - 获取特定窗口的设备上下文

c/c++,mfc:不将打开的文件/句柄传递给生成的进程

MFC MDI 无打开文档 = 禁用新文件

mfc 中如何打开 关闭一个exe文件

mfc 中如何打开 关闭一个exe文件

Pyside / Pyqt 从窗口打开新窗口(事件循环已在运行)