Inno Setup:自动启动应用程序时注册表设置不更新

时间:2017-04-10 18:47:26

标签: deployment installer inno-setup

我使用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添加到系统环境路径中(即使我这样做了,我怀疑我可能会遇到同样的问题!)

有什么想法吗?

1 个答案:

答案 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产生了一个新的过程,可以检测环境的变化,就像我将应用程序作为安装程序的子进程启动一样。