如何在不打开应用程序的新实例的情况下在运行应用程序中打开新文档?

时间:2009-01-08 14:52:05

标签: c++ windows

我的情况已被SO的其他答案部分涵盖,但我找不到完整的答案。简而言之,我们正在尝试将URL用于我们的特定数据类型,双击时将打开我们的应用程序并将这些数据集加载到该应用程序中。我们有这部分工作。

(例如,网址可能如下所示:resource://shaders/basic_shader.hlsl)

我们想要做的是在双击新网址时阻止打开新的应用程序实例。例如,假设我们有一个在我们的着色器编辑器中打开着色器的URL。单击此资源URL时,它将打开我们的着色器编辑器。单击新的着色器URL时,我们希望能够在当前运行的应用程序中打开着色器,并在编辑器的新选项卡中打开新的着色器。

我们可以轻松检测我们的应用程序的另一个实例是否正在运行。我们不知道如何轻松解决的问题是如何告诉当前运行的应用程序打开这个新文件进行编辑。这种行为与Apple Finder非常相似。

在unix中,您可以通过让应用程序打开一些命名管道来模拟此行为,然后新应用程序可以检查此管道是否处于活动状态,然后将文档数据发送到管道。是否有更标准的Windows方式来实现这种行为?

我们需要一个C / C ++解决方案。感谢。

5 个答案:

答案 0 :(得分:2)

命名管道是最好的方法。 应用程序的第一个实例打开管道并侦听它(使用PIPE_ACCESS_INBOUND作为dwOpenMode,相同的代码也允许您检测正在运行的实例)。 所有后续实例都会检查它们并不是唯一的,将命令行参数发送到管道并关闭。

答案 1 :(得分:1)

在应用程序启动时创建一个命名的互斥锁,正如David Grant所说,然后在显示第二个URL的UI之前,检查这个互斥锁,如果它已经创建,那么只需通过将新URL传递给第一个启动的应用程序退出(有应用程序中的接口设置URL并告诉以编程方式重定向)

答案 2 :(得分:0)

您无法避免与要执行的网址相关联的程序。

“windows”解决方案是发送一条消息(过去通过DDE,但现在可能还有更“现代”的东西)到先前正在运行的应用程序中,然后退出...

答案 3 :(得分:0)

您可以在启动时获取命名的互斥锁并以此方式强制执行。

答案 4 :(得分:0)

通过遵循Joseph Newcomer的教程here,我的C ++ MFC应用程序运行良好。他使用在启动时检查的命名互斥锁,并将一条消息发送到已经运行的应用程序,并打开新资源。