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:
- When your program (
MyProgram.exe
) starts, it should check if there is already an instance of it running.
- 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
.
- 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.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…