In a Delphi 10.4.2 win-32 VCL Application associated with graphic file formats in Windows 10, I get parameter files selected in Windows File Explorer. Here I watch the files passed to my app right after Application.Initialize;:
CodeSite.Send('AppInstances: ParamCount', ParamCount);
When I select ONE file in Explorer and then press the ENTER key, this file gets loaded in my application. So far so good.
But when I select THREE files in Explorer and then press the ENTER key, my app gets started THREE times each time with ONE of the 3 file parameters:
Is it possible that Explorer would start my app only ONCE and pass the 3 selected files at once to my app when I press the Enter key?

On Windows 7 and later 1, you can register a
MultiSelectModelvalue (eitherDocumentorPlayer) with your file association verb(s) in the Registry. This is the easiest way to allow Explorer to send multiple files at a time to a single instance of your app, such as in separate command-line parameters.1: I don't know exactly when this feature was first introduced.
Prior to
MultiSelectModel, other ways to handle this included:implementing the
IDropTargetinterface in your app, and then registering theDropTargetwith your file association verb(s). The Shell can then construct anIDataObjectcontaining information about the files(s), and pass it to yourIDropTargetimplementation (also see this article). This is the preferred method, as it does not suffer from limitations that other methods have (includingMultiSelectModel!), and it allows for more flexibility as the sameIDropTargetimplementation can accept multiple files executed in Explorer, files dropped onto your app's window, even dropped onto the app's.EXEfile itself. It is just a matter of registering the sameIDropTargetwith the appropriate APIs.Implementing a DDE server in your app, and then registering the server with your file association verb(s). The Shell can then start a DDE conversation with your app and send the file paths over to it using your specified command(s).
just accepting the Shell starting a separate process for each file. Before your app creates its UI, have its startup code check for a file path on its command-line, and if found then look for another instance of your app already running, and if found then use an Inter-Process Communication mechanism of your choosing (ie,
WM_COPYDATA, named pipe, socket, mailslot, etc) to send the file path to that existing instance, and then exit.