如果 Install4j 安装在程序文件路径之外,则无法通过 getApplicationInfoById() 检测之前与其他用户的安装

Install4j is not able to detect the previous installations with another user by getApplicationInfoById() if installed on other than program files path

Install4j 无法通过 getApplicationInfoById 检测之前与其他用户的安装。

我正在使用管理员帐户或用户 1 在 C:\appdir\ 中安装 app1.0.0。 然后我尝试使用管理员帐户或 user2 在 C:\Program files\appdir 中安装相同的 app1.0.0。所以在那之前,我正在检查是否已经安装了相同的应用程序?使用应用程序 ID。 预期的结果是它不应该再次安装在一个新的文件夹中,并给 msg 应用程序已经安装。但是 getApplicationInfoById 无法找到以前的安装。

调查结果: 如果应用程序已经安装在程序文件中,那么新应用程序也可以通过不同用户的 getApplicationInfoById 进行检测。

如果除了程序文件之外已经安装了应用程序,那么新的应用程序也可以在不同的用户中通过 getApplicationInfoByDir 进行检测。

如果除了程序文件之外已经安装了应用程序,那么不同用户的 getApplicationInfoById 也无法检测到新应用程序。

注意:新旧应用的应用ID相同。 注:使用的Install4j 8.0.8版本

// Check if the user has already installed the application

ApplicationRegistry.ApplicationInfo 应用程序信息 = ApplicationRegistry.getApplicationInfoByDir(context.getInstallationDirectory());

if (applicationInfo == null) {
    Util.logInfo(null, "prev installation not found in current installtion dir");
    Util.logInfo(null, context.getApplicationId().toString());

    // if installation not found same path then check everywhere using app Id
    ApplicationRegistry.ApplicationInfo[] applicationInfos =
        ApplicationRegistry.getApplicationInfoById(context.getApplicationId());


    
    for (int i = 0; i < applicationInfos.length; i++) {
        Util.logInfo(null, "prev installation detected with diff path ");
        if (i == 1){
            Util.logInfo(null, "multiple installtion detected");      
        }

        context.setInstallationDirectory(applicationInfos[i].getInstallationDirectory());
        applicationInfo = applicationInfos[i];
        
    }

// The application has never been installed before
if (applicationInfo == null){
        return true;
}

}

安装目录是否在program files目录下并不重要。不同之处在于“请求权限”操作是否已执行。只有这样,安装程序才能将以前的安装目录保存在注册表的 public 部分。否则,必须使用其他用户无法读取的特定于用户的注册表部分。