【问题标题】:Passing a file location to an external process using Win32/MFC使用 Win32/MFC 将文件位置传递给外部进程
【发布时间】:2010-07-14 04:20:22
【问题描述】:

我正在尝试在这里满足客户的要求,但我并不完全确定我是否真的能做到。我有一个 MFC 应用程序,它依赖于 ShellExecute 在其适当的查看器中打开文件,如果您尝试一个接一个地打开多个文件,则会产生多个查看器。如果您打开一个 .txt 文档,然后再打开另一个,则会按预期显示两个记事本副本。

客户希望我们更改此功能 - Windows 的功能 - 仅将文件位置传递给可能已经打开的任何查看器。单击的第一个图像应打开图像查看器,但其他任何图像都应在该现有进程中打开。

这种应用程序间控制/通信可能吗?我可以一般地将文件“传递”到现有进程吗?我不认为我可以。以文件作为参数执行程序是一回事,但将文件传递给正在运行的进程则完全是另一回事。我不确定您是否可以通用地做到这一点,我认为 Windows API 中的任何地方都没有这种功能。

不过,我可能是错的。

【问题讨论】:

    标签: c++ c windows


    【解决方案1】:

    如果查看器不支持在同一实例中打开多个文件,则这是不可能的。

    在您的示例中:记事本将为每个文件启动一个新版本,而 Notepad++(免费编辑器)将在新选项卡中的同一实例中打开。

    【讨论】:

    • 嗯,他们很好,不在同一个实例中打开多个文件。如果打开 FileB.txt 导致记事本关闭 FileA.txt,这是可以接受的。我只是不认为这是可能的。
    【解决方案2】:

    您应该尝试的第一件事是使用新参数再次调用程序。如果程序以这种方式编写,它将把新参数委托给现有实例。记事本不这样做,但图像查看器可以。

    接下来您可以尝试通过自己跟踪句柄来管理应用程序的生命周期。您调用 CreateProcess,因此您创建并拥有该进程的句柄。在下一次调用 CreateProcess 时,枚举打开的窗口并尝试找到您的最后一个句柄。如果找到句柄,请将其关闭并继续您的打开过程。您应该只获得一个打开的应用程序。要获得最可靠的解决方案,请将其放在单独的线程中并等待句柄(以及新的请求事件)以避免任何竞争条件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2015-03-11
      • 2019-07-09
      相关资源
      最近更新 更多