如何获得我的文件关联在单个程序实例中打开多个文件?

我在Windowsregistry中为我的程序build立了一个文件扩展名。

在registry中,在shell / open / command下,我有:

"C:\MyProgramPath\MyProgram.exe" "%1" 

这对我来说很好。 当有人点击与我的应用程序相关联的一个或多个文件时,我的应用程序正确地打开文件,但是每个文件都在单独的程序实例中打开。

有什么办法可以做到这一点,并打开一个程序实例中的所有文件?

您可以在使用DDE时使用。 在Delphi中参见http://cc.embarcadero.com/Item/17787

编辑:

你给的链接谈到另一种方法:使用IDropTarget。 这可能更适合您已经运行的拖放功能。

这是一个相当常见的问题,它与Windows文件扩展名无关。 双击程序自定义类型的文件时,Windows将启动关联的应用程序MyProgram.exe ,并将文件名称%1作为命令行参数传递。

现在,如果您只需要应用程序的单个实例,则需要执行以下操作:

  1. 当您的程序( MyProgram.exe )启动时,它应该检查是否已经有一个正在运行的实例。
  2. 如果有以前的实例, MyProgram.exe的新实例应该向旧实例发送一条消息(某种类型的消息,不一定是Windows消息),告诉它打开文件%1
  3. 新实例现在应该自行终止。

一个非常简单的方法

有几种方法来完成这一点。 最简单的方法之一是每次启动应用程序时设置注册表项/值,并在应用程序存在时将其删除。 然后,当您的应用程序的(新实例)启动时,在设置此键/值之前,应检查它是否已被设置。 如果,那么按照上面的步骤(2)和(3)。 这可能不是最稳定的方法(实际上这是一个非常糟糕的想法,因为如果它存在异常,你不能保证应用程序将会删除键值),但它会给你一个基本的想法。 其他的,也许更好的方法,包括FindWindow ,甚至更好地使用互斥体 。

第二步可能是通过发送一个Windows消息(也许WM_COPYDATA ),或者通过设置一个注册表值,或者通过编写一个文件来实现,或者…在不同的进程之间有很多的通信方式。

细节

由于这是一个相当普遍的问题,之前已经处理过。 例如,参见这篇Delphi特有的文章 。