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.ExeName在 Delphi 中)读取当前运行的可执行文件的路径。从该路径设置工作目录很容易,我只是认为这不是一个好主意,因为更改工作目录会破坏用户可能期望工作的相对路径。这不是真的

Windows 从您双击的文件的位置运行 EXE。这似乎是例外情况,在其他情况下,EXE 总是从我期望的地方运行。

因为可以通过多种方式使用与可执行文件本身的路径不同的工作目录来执行应用程序。一个表现良好的程序不会假设这些是相等的。它使得在脚本或命令行中使用应用程序变得更加困难。

于 2010-04-22T07:58:49.703 回答