Установить реестр для управления рабочим каталогом при сопоставлении типа файла с приложением - PullRequest
4 голосов
/ 22 апреля 2010

Я использую Inno для установщика и хочу связать тип файла с моим приложением:

Root: HKCR; Subkey: ".rpl"; ValueType: string; ValueName: ""; ValueData: "MyReplay"; Flags: uninsdeletevalue;
Root: HKCR; Subkey: "MyReplay"; ValueType: string; ValueName: ""; ValueData: "Replay File"; Flags: uninsdeletekey;
Root: HKCR; Subkey: "MyReplay\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\bin\MyApp.ico,0"; Flags: uninsdeletekey;
Root: HKCR; Subkey: "MyReplay\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\bin\MyApp.exe"" ""%1"""; Flags: uninsdeletekey;

Прямо сейчас, двойной щелчок по файлу .rpl запускает приложение, но работаетПохоже, что dir находится там, где находится файл .rpl, поэтому приложение аварийно завершает работу, поскольку оно не может загрузить какие-либо данные.Можно ли настроить реестр для управления стартовым / рабочим каталогом для ассоциаций файлов, а также для запускаемого приложения?Или само мое приложение должно иметь возможность обойти это?

Дело в том, что я всегда хочу, чтобы мой EXE запускался, например, из c: \ Programs \ MyApp.Если вы нажмете ярлык или запустите его вручную, это нормально.Единственное исключение, которое я могу найти, - когда вы дважды щелкаете по файлу типа, связанного с приложением, Windows устанавливает рабочий каталог EXE в соответствии с местоположением этого файла.

Проблема всего этого заключается в том, чтоу меня есть сборка для разработки на моем ПК, и я также устанавливаю выпущенную версию как обычный пользователь.Мне нужно иметь возможность запускать версию dev, не заходя в реестр и не находя пути к файлам установленной рабочей версии.

1 Ответ

4 голосов
/ 22 апреля 2010

Даже если есть способ указать другой рабочий каталог для вашего приложения, указанный в реестре - вы должны действительно исправить это в приложении. Причина в том, что существует несколько способов открыть файл данных с вашим приложением, и вы просто не можете исправить это для всех из них. Рассмотрим

D: \> c: \ Programs \ MyApp \ MyApp.exe \\ public \ foo \ data.ext

где программа запускается с именем файла (в виде UNC-пути), который открывается в качестве параметра и выполняется в совершенно другом каталоге. Я регулярно делаю подобные вещи и ожидаю, что приложения будут работать в таких условиях.

Обратите внимание, что установка рабочего каталога на корневой каталог приложения после запуска не очень хорошая идея, поскольку относительные пути будут неправильными. Правильное решение означает изменение приложения таким образом, чтобы оно работало корректно, независимо от того, каким является текущий рабочий каталог, путем использования полностью определенных путей внутри.

Edit:

Ваш комментарий

Но тогда это означает, что мое приложение полностью зависит от реестра. Что является трудным для тестирования разработки, если каждый раз, когда я запускаю свою сборку dev, она загружает все файлы для установленной версии

но это не обязательно так. Вы можете прочитать путь к исполняемому в данный момент исполняемому файлу, используя функцию GetModuleFileName() или ее эквивалентную оболочку в библиотеке GUI (например, Application.ExeName в Delphi). Установить рабочий каталог по этому пути легко, я просто не думаю, что это хорошая идея, так как изменение рабочего каталога нарушает относительные пути, которые пользователь может ожидать от работы. Это не совсем правда, что

Windows запускает EXE из файла, который вы дважды щелкнули. Это, кажется, исключительный случай, в других случаях EXE всегда запускается там, где я ожидаю.

потому что может быть много способов, как приложение может быть выполнено с другим рабочим каталогом, чем путь к самому исполняемому файлу. Хорошее поведение программы не предполагает, что они равны. Это делает использование приложения в скриптах или из командной строки намного сложнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...