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

我有一个已被其他答案部分覆盖的情况,但我找不到一个完整的答案。 简而言之,我们试图将URL用于特定的数据types,当双击时会打开我们的应用程序并将这些数据集加载到该应用程序中。 我们有这部分工作。

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

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

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

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

我们需要一个C / C ++解决scheme。 谢谢。

如David Grant所说,在应用程序启动时创建一个已命名的互斥体,然后在显示第二个URL的UI之前,检查该互斥体是否已经创建,然后通过将新URL传递给第一个已启动的应用程序应用程序来设置网址并告诉编程方式重定向)

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

你不能避免与url相关的程序被执行。

“窗口”的解决方案将发送一个消息(通过在过去的DDE,但也许有更现代的东西)到以前运行的应用程序的URL然后退出…

你可以在启动时获得一个有名的互斥锁,并以这种方式强制执行。

按照Joseph Newcomer的教程,我在C ++ MFC应用程序中得到了很好的工作。 他使用一个在启动时检查的已命名的互斥锁,并将一个消息发送到已经运行的应用程序,同时打开新的资源。