Windows 如何将多个文件同时传递到我注册的应用程序?

Windows 如何将多个文件同时传递到我注册的应用程序?,windows,delphi,delphi-10.4-sydney,microsoft-file-explorer,Windows,Delphi,Delphi 10.4 Sydney,Microsoft File Explorer,在与Windows 10中的图形文件格式相关联的Delphi 10.4.2 win-32 VCL应用程序中,我在Windows文件资源管理器中选择了参数文件。在这里,我观看了Application.Initialize之后传递到我的应用程序的文件: CodeSite.Send('AppInstances: ParamCount', ParamCount); 当我在资源管理器中选择一个文件,然后按ENTER键时,该文件将加载到我的应用程序中。到目前为止还不错 但是,当我在资源管理器中选择三个文件

在与Windows 10中的图形文件格式相关联的Delphi 10.4.2 win-32 VCL应用程序中,我在Windows文件资源管理器中选择了参数文件。在这里,我观看了
Application.Initialize之后传递到我的应用程序的文件

CodeSite.Send('AppInstances: ParamCount', ParamCount);
当我在资源管理器中选择一个文件,然后按
ENTER键时,该文件将加载到我的应用程序中。到目前为止还不错

但是,当我在资源管理器中选择三个文件,然后按ENTER键时,我的应用程序会启动三次,每次启动三个文件参数中的一个:

当我按Enter键时,浏览器是否可能只启动我的应用程序一次,并将3个选定的文件一次传递给我的应用程序?

在Windows 7和更高版本1上,您可以在注册表中使用文件关联动词进行赋值(或
Document
Player
)。这是允许Explorer一次向应用程序的单个实例发送多个文件的最简单方法,例如在单独的命令行参数中

1:我不知道这个功能是什么时候开始使用的

MultiSelectModel
之前,处理此问题的其他方法包括:

  • 在应用程序中实现接口,然后使用文件关联谓词。然后,Shell可以构造一个包含文件信息的
    IDataObject
    ,并将其传递给
    IDropTarget
    实现(另请参阅)。这是首选方法,因为它不受其他方法的限制(包括
    MultiSelectModel
    !),并且它允许更大的灵活性,因为相同的
    IDropTarget
    实现可以接受在资源管理器中执行的多个文件,这些文件会被放到应用程序的窗口中,甚至连应用程序的
    .EXE
    文件本身都被删除了。只需使用适当的API注册相同的
    IDropTarget

  • 在应用程序中实现DDE服务器,然后使用文件关联谓词。然后,Shell可以启动与应用程序的DDE对话,并使用指定的命令将文件路径发送到应用程序

  • 只是接受Shell,为每个文件启动一个单独的进程。在你的应用程序创建UI之前,让它的启动代码在命令行上检查文件路径,如果找到,则查找已经运行的应用程序的另一个实例,如果找到,则使用你选择的进程间通信机制(即,
    WM_COPYDATA
    ,命名管道、套接字、邮箱等)将文件路径发送到该现有实例,然后退出

在Windows 7及更高版本1上,您可以使用注册表中的文件关联谓词进行赋值(或
文档
播放器
)。这是允许Explorer一次向应用程序的单个实例发送多个文件的最简单方法,例如在单独的命令行参数中

1:我不知道这个功能是什么时候开始使用的

MultiSelectModel
之前,处理此问题的其他方法包括:

  • 在应用程序中实现接口,然后使用文件关联谓词。然后,Shell可以构造一个包含文件信息的
    IDataObject
    ,并将其传递给
    IDropTarget
    实现(另请参阅)。这是首选方法,因为它不受其他方法的限制(包括
    MultiSelectModel
    !),并且它允许更大的灵活性,因为相同的
    IDropTarget
    实现可以接受在资源管理器中执行的多个文件,这些文件会被放到应用程序的窗口中,甚至连应用程序的
    .EXE
    文件本身都被删除了。只需使用适当的API注册相同的
    IDropTarget

  • 在应用程序中实现DDE服务器,然后使用文件关联谓词。然后,Shell可以启动与应用程序的DDE对话,并使用指定的命令将文件路径发送到应用程序

  • 只是接受Shell,为每个文件启动一个单独的进程。在你的应用程序创建UI之前,让它的启动代码在命令行上检查文件路径,如果找到,则查找已经运行的应用程序的另一个实例,如果找到,则使用你选择的进程间通信机制(即,
    WM_COPYDATA
    ,命名管道、套接字、邮箱等)将文件路径发送到该现有实例,然后退出


文件关联应包括Open verb的MultiSelectModel。MSDN描述了如何,而不是如何将多个选定文件实际传递给应用程序。Shell可以通过许多不同的方式将文件传递给注册表中的应用程序(命令行、DropTarget、DDE等),我的应用程序使用此打开命令注册:
“C:\DELPHI\MyApp\MyApp.exe”“%1”
我应该使用其他打开命令吗?我已经制作了几个应用程序,它们都使用DDE和文件关联。它使用一些TDDE。。。组件和某些特定的注册表文件关联注册。@R.Hoek:好吧,Raymond Chen在2007年写道,MSDN说。文件关联应该包括一个用于打开谓词的MultiSelectModel。MSDN描述了如何,但不是如何将多个选定文件实际传递给应用程序。Shell可以通过许多不同的方式将文件传递给注册表中的应用程序(命令行、DropTarget、DDE等),我的应用程序使用此打开命令注册:
“C:\DELPHI\MyApp\MyApp.exe”“%1”
我应该使用其他打开命令吗?我已经制作了几个应用程序,它们都使用DDE和文件关联。它使用一些TDDE。。。组件和某些特定的注册表文件关联注册。我明天会查的。@R.Hoek:Raymond Chen在2007年写道,MSDN说。你链接到
MultiSelectModel
do