我正在尝试在这里完成客户端请求,但我并不完全确定我能够实际执行此操作。我有一个MFC应用程序,它依赖于ShellExecute在适当的查看器中打开文件,如果你试图一个接一个地打开多个文件,它会产生多个查看器。如果您打开一个.txt文档,然后再打开另一个文档,则会按预期显示两个记事本副本。
客户希望我们更改此功能 - Windows的功能 - 只是将文件位置传递给可能已经打开的任何查看器。单击的第一个图像应该打开图像查看器,但只应在该现有过程中打开任何其他图像。
这种应用程序间的控制/通信是否可行?我可以将文件一般“传递”到现有流程吗?我认为不行。使用文件作为参数执行程序是一回事,但将文件传递给正在运行的进程则完全不同。我不确定你是否可以做到这一点,我不认为Windows API中的任何功能都可以。
但是,我可能错了。答案 0 :(得分:0)
如果查看器不支持同一实例中的多个打开文件,则无法执行此操作。
在您的示例中:记事本将为每个文件启动一个新版本,而Notepad ++(一个免费编辑器)将在新选项卡中的同一实例中打开。
答案 1 :(得分:0)
您应该尝试的第一件事是使用新参数再次调用程序。如果程序以这种方式编写,它会将新参数委托给现有实例。记事本不这样做,但图像查看器可能会这样做。
您可以尝试的另一件事是通过自己跟踪句柄来管理应用程序的生命周期。您调用CreateProcess,因此您创建并拥有此进程的句柄。在下一次调用CreateProcess时,枚举打开的窗口并尝试找到最后一个句柄。如果找到手柄,请将其关闭并继续打开过程。您应该只获得一个打开的应用程序。对于最可靠的解决方案,将其放在一个单独的线程中并等待句柄(以及新的请求事件)以避免任何竞争条件。