我使用Inno设置来构建应用程序安装程序。
在安装过程中,我添加了一个注册表项,它提供了一个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 :(得分:1)
一些背景和我的“当前”解决方案。我想补充的关键是:
private boolean hasKey(JSONObject jsonObject, String key) {
return jsonObject != null && jsonObject.has(key);
}
try {
JSONObject jsonObject = new JSONObject(yourJson);
if (hasKey(jsonObject, "labelData")) {
JSONObject labelDataJson = jsonObject.getJSONObject("LabelData");
if (hasKey(labelDataJson, "video")) {
String video = labelDataJson.getString("video");
}
}
} catch (JSONException e) {
}
在我的[run]部分,我有:
[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
我将标志更改为:
Filename: {app}\{#ExeName}.exe; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent
根据Inno Setup Help使用shellexec命令:
文件将被打开...就像用户在资源管理器中双击文件一样。
按照上面Martin的回答,我相信它的工作原理是因为shellexec产生了一个新的过程,可以检测环境的变化,就像我将应用程序作为安装程序的子进程启动一样。