1

我使用 WinZip 自解压存档 (SFX) 分发我的软件。
我知道这个那个。但这些似乎不适用于 SFX 场景。

安装时,SFX 解压缩并启动一个包含的程序(由我编写),用于安装。这包括在 Windows 控制面板下为程序列表创建注册表项。此外,该程序具有清单。所以它应该是“Vista-aware”的。SFX 可执行文件还包括一个清单。

问题是程序兼容性助手(PCA) "This program might not have installed correctly"无论如何都会抛出它的消息。所以我的客户告诉我我是一个糟糕的程序员......

我搜索了很多,并阅读了很多关于 PCA 的信息,包括许多 Microsoft 网站。
那些告诉我要做:

  1. 嵌入清单
  2. 在 Windows 控制面板下为程序列表创建注册表项

我的清单如下所示:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet class="System.Security.PermissionSet" version="1" Unrestricted="true" ID="Custom" SameSite="site" />
      </applicationRequestMinimum>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

那么我哪里出错了?
PCA还有其他事情要做吗?
SFX 可执行文件是否必须包含其他一些内容?

4

2 回答 2

3

我们通过将PE 标头中的版本字段设置为 6.0 来修复NSIS 中的类似问题。我相信这适用于我们的卸载程序,但它也可能适用于您的场景。

于 2012-02-10T16:19:27.027 回答
2

如另一个答案中所述,关键是在文件的 PE(可移植可执行文件)部分中正确设置标题。我们在尝试使用 SFX 文件和 7-zip 构建自解压可执行文件时遇到了这个问题。

可移植可执行文件 (PE) 格式是用于 32 位和 64 位版本的 Windows 操作系统中的可执行文件、目标代码、DLL、FON 字体文件和其他文件的文件格式。PE 格式是一种数据结构,它封装了 Windows 操作系统加载程序管理打包的可执行代码所需的信息。

注意: PE文件格式类似于Linux 下的ELF 。

构建这些文件很顺利,但是当我们尝试在 Win7 上运行生成的文件时,我们会得到以下对话框。

                                 #1

这里最大的提示是这个对话框是由 PCA - Program Compatibility Assistant 抛出的。抛出此错误是因为 PCA 检测到:

  1. 没有条目被添加到添加/删除程序
  2. PE 可执行文件的版本字段已正确设置

使用 PE 工具进行修复

在我们的案例中,似乎是#2导致了问题。所以我们下载了PE Tools并打开了 7-zip SFX 文件。注意:我们加载了文件7zS.sfx.

加载后,我们将以下版本信息从 a 更改4为 a 6

                      SS#2

参考

于 2014-03-31T19:02:09.943 回答