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

前端 未结 2 1573
暖寄归人
暖寄归人 2020-12-10 17:42

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:\\MyPro         


        
相关标签:
2条回答
  • 2020-12-10 18:03

    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.

    0 讨论(0)
  • 2020-12-10 18:10

    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.

    0 讨论(0)
提交回复
热议问题