2017-04-10 127 views
1

我使用Inno setup来构建应用程序安装程序。Inno Setup:自动启动应用程序时注册表设置不更新

在安装期间,我添加了一个注册表项,该注册表项提供了一个PATH,我将存储可能被多个不同应用程序(或同一应用程序的多个版本)使用的公用文件(dll等)。

我使用本文中提出的方法:http://www.codeguru.com/cpp/w-p/dll/article.php/c99/Application-Specific-Paths-for-DLL-Loading.htm

我的问题是,安装完成后,用户可以自动运行的应用程序。在这种情况下,应用程序无法在PATH位置找到dll。如果我关闭应用程序并从资源管理器重新启动它,它工作得很好。

我不想把文件放在标准的共享dll位置,它们不是所有的dll,我想要更好地控制我的应用程序正在使用的dll版本。此外,将文件放入应用程序安装.exe目录也不是一个选项。我也不想将PATH添加到系统环境路径中(即使我这样做,我怀疑我也可能会有同样的问题!)

任何想法?

+0

我认为RTFM的情况! http://www.jrsoftware.org/ishelp/index.php?topic=registrysection 我在[run]部分使用了shellexec命令,它似乎解决了这个问题。 –

+0

这是什么协议?删除问题?我认为这可能对像我这样的其他傻瓜有用。至少我认为关于应用程序特定路径的提示实际上非常有用,并且不会引用过于广泛。 –

+0

我发布了错误的链接:http://www.jrsoftware.org/ishelp/index.php?topic=runsection “shellexec”标志运行程序“与用户双击时的方式相同资源管理器中的文件“。换句话说,它启动了一个新的过程,而不是安装程序的一个子进程,因此它启动了环境变化,我认为它符合你在答案中的内容。 –

回答

1

一些背景和我'当前'的解决方案。关键我想补充的是:

[Registry] 
Root: HKLM; Subkey: "SOFTWARE\Microsoft\..\App Paths\{#ExeName}.exe"; ValueType: string; ValueData: "{app}"; Flags: uninsdeletekey 
Root: HKLM; Subkey: "SOFTWARE\Microsoft\..\App Paths\{#ExeName}.exe"; ValueType: string; ValueName: "Path"; ValueData: "{#CommonPath}"; Flags: uninsdeletekey 

在我的[运行]部分我有:使用

postinstall shellexec skipifsilent 

Inno Setup Help

Filename: {app}\{#ExeName}.exe; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent 

我改变了标志,以shellexec命令:

该文件将被打开...山姆如果用户在资源管理器中双击该文件,方式就是这样。

沿着上面马丁的回答的线,我相信它的作品,因为shellexec产生一个新的进程,其拾取环境的变化,不像如果我启动应用程序的安装程序的过程中的一个孩子。

+0

我在Windows 10上,inno setup 5.5.5如果它使任何differene。我想现在我不得不说,谢谢你的警告。我会在上线前让几个人来测试。希望我不会后悔的! –

相关问题