代码之家  ›  专栏  ›  技术社区  ›  Mark

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

  •  1
  • Mark  · 技术社区  · 16 年前

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

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

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

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

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

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

    5 回复  |  直到 16 年前
        1
  •  1
  •   Vinay    16 年前

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

        2
  •  2
  •   Konstantin Spirin    16 年前

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

        3
  •  0
  •   siukurnin    16 年前

    无法避免与要执行的URL关联的程序。

    “Windows”解决方案是(在过去通过DDE,但现在可能有更“现代”的东西)向以前运行的应用程序发送一条消息,然后使用URL退出…

        4
  •  0
  •   David Grant    16 年前

    您可以在启动时获取一个命名的互斥体,并以这种方式强制执行它。

        5
  •  0
  •   jacobsee    16 年前

    通过Joseph Newcomer的教程,我为C++的MFC应用程序工作得很好。 here . 他使用一个在启动时被检查的命名互斥体,并向已经运行的应用程序发送一条消息,其中包含要打开的新资源。