Как я могу заставить свою файловую ассоциацию открывать несколько файлов в одном экземпляре программы? - PullRequest
6 голосов
/ 31 августа 2010

Я установил расширение реестра в моей программе , поскольку Windows требует .

В Реестре под командой shell / open / command я получил:

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

Это прекрасно работает для меня. Когда кто-то нажимает на один или несколько файлов, связанных с моим приложением, мое приложение правильно открывает файлы, но каждый из них открывается в отдельном экземпляре программы.

Есть ли способ сделать это и открыть все файлы в одном экземпляре программы?

Ответы [ 2 ]

4 голосов
/ 31 августа 2010

Это довольно распространенный вопрос, и он не имеет ничего общего с расширениями файлов Windows. Если дважды щелкнуть файл пользовательского типа вашей программы, Windows запустит соответствующее приложение MyProgram.exe и передаст имя файла %1 в качестве аргумента командной строки.

Теперь, если вам нужен только один экземпляр вашего приложения, вам нужно сделать это:

  1. Когда ваша программа (MyProgram.exe) запускается, она должна проверить, есть ли уже запущенный экземпляр.
  2. Если существует предыдущий экземпляр, новый экземпляр MyProgram.exe должен отправить сообщение (какое-то, не обязательно сообщение Windows) старому экземпляру, говорящему ему открыть файл %1.
  3. Новый экземпляр должен завершиться сам.

Очень упрощенный подход

Есть несколько способов сделать это. Один из самых простых способов - установить ключ / значение реестра при каждом запуске приложения и удалить его, когда приложение существует. Затем, когда (новый экземпляр) ваше приложение запускается, прежде чем устанавливать этот ключ / значение, оно должно проверить, установлено ли оно уже. Если это так, выполните шаги (2) и (3) выше. Это может быть не самый стабильный подход (на самом деле это очень плохая идея, поскольку вы не можете гарантировать, что приложение удалит ключ / значение, если оно существует, если оно происходит ненормально), но оно даст вам основную идею. Другие, возможно, лучшие способы включают FindWindow и, что еще лучше, использование мьютексов .

Шаг второй может быть реализован путем отправки сообщения Windows (может быть WM_COPYDATA), или путем установки значения реестра, или путем записи файла, или ... Есть много способов связи между разными процессами.

Подробности

Поскольку это довольно распространенный вопрос, он уже рассматривался ранее. См., Например, эту специфичную для Delphi статью .

1 голос
/ 31 августа 2010

Можно при использовании DDE . См. http://cc.embarcadero.com/Item/17787 для примера в Delphi.

EDIT:

Ссылка, которую вы дали, рассказывает о другом методе: использовании IDropTarget. Это может лучше соответствовать вашим уже работающим функциям перетаскивания.

...