Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How Can I Get My File Association to Open Multiple Files in a Single Program Instance?

I have set up a file extension in the Registry for my program as Windows requires.

In the Registry, under shell/open/command, I've got:

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

This works fine for me. When someone clicks on one or more files associated with my application, my application correctly opens the file(s) but each one is opened in a separate program instance.

Is there any way I can do this and open up all files in one program instance?

like image 862
lkessler Avatar asked Aug 31 '10 03:08

lkessler


2 Answers

This is a rather common question, and it has really nothing to do with Windows file extensions. When you doubleclick a file of your program's custom type, Windows will start the associated application MyProgram.exe and pass the file name %1 as a command-line argument.

Now, if you want only a single instance of your application, you need to do this:

  1. When your program (MyProgram.exe) starts, it should check if there is already an instance of it running.
  2. If there is a previous instance, the new instance of MyProgram.exe should send a message (of some kind, not necessarily a windows message) to the old instance telling it to open the file %1.
  3. The new instance should now terminate itself.

A very simplistic approach

There are several ways of accomplishing this. One of the simplest ways is to set a registry key/value each time your application starts, and remove it when the application exists. Then, when (a new instance of) your application starts, prior to setting this key/value, it should check if it is already set. If, so, follow the steps (2) and (3) above. This might not be the most stable approach (in fact it is a very bad idea, since you cannot guarantee that the app will remove the key/value when it exists if it does so abnormally), but it will give you the basic idea. Other, perhaps better ways, include FindWindow and, even better, the use of mutexes.

Step two might be implemented by sending a windows message (maybe WM_COPYDATA), or by setting a registry value, or, by writing a file, or ... There are many ways of communication between different processess.

The details

Since this is a rather common question, it has been dealt with before. See, for instance, this Delphi-specific article.

like image 90
Andreas Rejbrand Avatar answered Nov 13 '22 22:11

Andreas Rejbrand


You can when using DDE. See http://cc.embarcadero.com/Item/17787 for an example in Delphi.

EDIT:

The link you gave talks about another method: using IDropTarget. This might fit better with your already running drag and drop capabilities.

like image 23
Lars Truijens Avatar answered Nov 13 '22 23:11

Lars Truijens