4

インストーラーに 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 ファイルをダブルクリックするとアプリが起動しますが、作業ディレクトリは .rpl ファイルが配置されているように見えるため、データを読み込めないためにアプリがクラッシュします。レジストリを設定して、起動するアプリだけでなく、ファイルの関連付けの開始/作業ディレクトリを制御することはできますか? それとも、私のアプリ自体がこれを回避できる必要がありますか?

ポイントは、EXE を常にc:\Programs\MyApp などから実行したいということです。ショートカットをクリックするか、手動で実行すると問題ありません。私が見つけた唯一の例外は、アプリに関連付けられたタイプのファイルをダブルクリックすると、Windows が EXE の作業ディレクトリをそのファイルの場所に設定することです。

このすべての背後にある問題は、私の PC に開発ビルドがあり、通常のユーザーと同じようにリリース バージョンもインストールしていることです。レジストリに移動して、インストールされた製品版のファイルへのパスを見つけることなく、開発版を実行できるようにする必要があります。

4

1 に答える 1

5

レジストリでアプリケーション用に別の作業ディレクトリを指定する方法がある場合でも、アプリケーションでこれを修正する必要があります。その理由は、アプリケーションでデータ ファイルを開く方法が複数あり、そのすべてを修正することはできないからです。検討

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

ここで、プログラムはファイルの名前 (UNC パスとして) で開始され、パラメーターとして開かれ、完全に異なるディレクトリで実行されます。私はそのようなことを定期的に行っており、アプリケーションがこれらの状況下で機能することを期待しています。

起動後最初に作業ディレクトリをアプリケーションのルート パスに設定することもお勧めできません。相対パスが間違っているためです。適切な解決策とは、内部で完全修飾パスを使用することにより、現在の作業ディレクトリがどこであっても正しく動作するようにアプリケーションを変更することです。

編集:

あなたがコメントする

しかし、これは私のアプリがレジストリに完全に依存していることを意味します。開発ビルドを実行するたびに、インストールされているバージョンのすべてのファイルをロードしてロードする場合、これは開発テストにとって苦痛です。

しかし、必ずしもそうとは限りません。GetModuleFileName()関数または GUI ライブラリ ( Application.ExeNameDelphi など)の同等のラッパーを使用して、現在実行中の実行可能ファイルへのパスを読み取ることができます。そのパスから作業ディレクトリを設定するのは簡単ですが、作業ディレクトリを変更すると、ユーザーが作業すると予想される相対パスが壊れるため、それは良い考えではないと思います。それは本当ではない

Windows は、ダブルクリックしたファイルの場所から EXE を実行します。これは例外的なケースのようです。それ以外の場合、EXE は常に期待どおりに実行されます。

実行可能ファイル自体へのパスとは異なる作業ディレクトリを使用してアプリケーションを実行する方法は多数あるためです。適切に動作するプログラムは、これらが等しいという仮定を立てません。スクリプトやコマンドラインからアプリケーションを使用するのが非常に難しくなります。

于 2010-04-22T07:58:49.703 に答える