安装前获取功能安装成本

2023-12-09

我们正在为您的安装制作自定义引导程序/外部 UI。

我们希望提供一个“自定义安装”对话框(就像在 MSI 中一样),以允许用户选择他们想要安装或删除的功能。

目前,我们能够从 MSI 数据库本身读取功能(以及其他功能详细信息,例如描述)(通过在 MSI 数据库上运行 SQL 查询)Feature table).

但是,我们还想显示安装功能的成本。 Windows Installer“自定义安装”对话框可以执行此操作。

我认为我们可以通过执行以下操作来模仿该行为:

  1. Pick a Feature你想要得到的成本
  2. 使用FeatureComponents表,得到Component与 1 中的特征相关联
  3. 使用File表,添加FileSize与 2 中标识的组件关联的文件的数量
  4. 3 的总和是功能安装的成本

问题:

  1. 是否有一个 API(来自 DTF 或 MSI.DLL)可供我们在安装之前获取功能的成本? (有一个FeatureInfo.GetCostDTF 中的方法,但不能直接使用它。必须先安装产品才能调用FeatureInfo.GetCost from ProductInstallation)
  2. 如果没有 API,上面给出的程序对于计算功能安装的成本是否合适或正确?

谢谢! :)

更新#1

我认为有一种方法可以在开始安装之前通过 API 获取功能安装的成本。我是这样做的:

Installer.SetInternalUI(InstallUIOptions.Silent);

Session s = Installer.OpenPackage(@"C:\a.msi", false);

foreach (FeatureInfo info in s.Features)
{
    MessageBox.Show(info.Name);
    MessageBox.Show(info.GetCost(false, false, InstallState.Unknown).ToString());
}
s.Close();

calling info.name成功返回功能名称。然而,调用info.GetCost将返回一个InvalidHandlerException并显示一条消息:“选择管理器未初始化”。

这就是我现在所在的地方。

更新#2:

我正在得到InvalidHandlerException因为我没有调用所需的文件成本核算例程在我打电话之前info.GetCost。这是我修改后的代码:

  Installer.SetInternalUI(InstallUIOptions.Silent);

  Session s = Installer.OpenPackage(@"C:\1.msi", false);
  s["ROOTDRIVE"] = @"C:\";
  s.DoAction("CostInitialize");
  s.DoAction("FileCost");
  s.DoAction("CostFinalize");

  foreach (FeatureInfo info in s.Features)
  {
       long cost = info.GetCost(false, false, InstallState.Local);
       MessageBox.Show(info.Title + " " + cost);
  }
  s.Close();

我不再收到无效处理程序异常,但返回的所有文件成本为 -1099511627776。


是的,有一个 API。您需要通过调用 OpenPackage 来获取 MSI 会话。通过这样做,您将可以访问功能列表,从而可以访问 GetCost 方法。

1 Gotcha:在计算成本之前,您需要执行 4 个标准操作:成本初始化, FileCost, 成本最终确定 and 安装验证.

    Installer.SetInternalUI(InstallUIOptions.Silent);

    Session s = Installer.OpenPackage(@"C:\1.msi", false);
    s.DoAction("CostInitialize");
    s.DoAction("FileCost");
    s.DoAction("CostFinalize");
    s.DoAction("InstallValidate");

    foreach (FeatureInfo info in s.Features)
    {
        long cost = info.GetCost(false, false, InstallState.Local);
        MessageBox.Show(info.Title + " " + cost);
    }
    s.Close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安装前获取功能安装成本 的相关文章

随机推荐

  • Node.js Express 未收到请求

    我正在使用 Express Web 框架并尝试从 AngularJS 发出 http 请求 我正在将数据传递给客户端的请求 但服务器由于某些未知原因未收到请求 请帮忙 服务器 js var express require express v
  • 如何使用iPhone SDK创建PDF文档? [复制]

    这个问题在这里已经有答案了 如何使用iPhone SDK创建PDF文档 任何教程和示例都会有所帮助 Thanks Quartz 2D 苹果教程 http developer apple com library mac documentati
  • 使用 Newtonsoft 将 Json 值转换为 Integer

    我使用以下代码向 xml 添加属性 以指定该节点在使用 JsonConvert SerializeXmlNode 时应返回 Integer 值 我已将 Newtonsoft 的更新合并到我引用的 dll 中 我使用以下代码来添加属性 ele
  • 可以从设备内核调用 CULA 例程吗?

    因此 我试图看看使用 GPU 通过同时求解一组问题来求解小型超定方程组是否可以获得显着的加速 我当前的算法涉及使用 CULA Dense 库中的 LU 分解函数 该函数还必须在 GPU 和 CPU 之间来回切换以初始化和运行 CULA 函数
  • 通过 user32.dll 中的 SendInput 发送密钥

    我在用这个板作为演示目的的键盘 无论如何 长话短说 除了极少数情况外 一切正常 我发送击键发送输入函数位于 user32 dll 中 所以我的程序看起来像 static void Main string args Console Write
  • 确定 PHP 中的 Referer

    确定哪个页面发送或调用 通过 AJAX 当前页面的最可靠 最安全的方法是什么 我不想使用 SERVER HTTP REFERER 由于 缺乏 可靠性 我需要调用的页面仅来自我网站上的请求 编辑 我希望验证是否正在从我的网站上的页面调用执行一
  • ValueError:没有为任何变量提供渐变:['conv2d/kernel:0', 'conv2d/bias:0', 'conv2d_1/kernel:0', 'conv2d_1/bias:0',

    系统信息 Colab张量流2 2 0 描述当前行为 当我尝试解决自己的数据问题 即多标签语义分割 时 我遇到了这个错误 下面是代码 import tensorflow as tf import tensorflow keras backen
  • Springfox - 更改 swagger-ui 的路径

    现在大摇大摆的服务来自http localhost 8080 myContextRoot swagger ui html 我可以配置 swagger 及其要提供服务的资源吗http localhost 8080 myContextRoot
  • 从 Ansible 事实创建变量

    我有四个系统 在这些系统中我需要提取事实 然后将它们用作 jinja 2 模板上的变量 在 Ansible 中我有 vars office1 web01 myip 10 10 10 10 or fact peer 10 10 10 20 w
  • 无法使用 htmlunit 以编程方式登录 facebook

    我已经尝试过给出的代码HTMLunit Facebook 登录 and 使用 HTMLUnit 使用 Java 以编程方式登录 Facebook 不过我没有登录脸书 启用 JavaScript 后 webClient setJavaScri
  • GoogleTest CMake 无法识别 TEST_F:就像它无法识别 GTest 一样

    好吧 我承认 这是一个特殊的案例 当我们构建应用程序时 我们使用 make 因此我将测试包含在 src 下的测试文件夹中 然后 在与发布文件夹相同的级别 我们创建了一个单元测试文件夹 其中包含所有源文件和测试源文件 但我的IDE是CLion
  • 使用 ROCR 和 pROC (R) 计算平均 AUC 的差异

    我正在使用来自 SVM RFE 模型的交叉验证数据 10 倍重复 5 次 caret包裹 我知道caret包适用于pROC计算指标时包 但我需要使用ROCR包以获得平均 ROC 然而 我注意到使用每个包时的平均 AUC 值并不相同 所以我不
  • 使用 python 在 os.system 的参数中使用行“找不到命令”

    我是 python 新手 正在从事一些 xyz 项目 其中我正在获取第一天日期的报告 获取数据并将其重定向到 Linux 机器上的另一个文件中 这是我的代码 usr bin python import os cur date os pope
  • WCF Web 服务从 SoapUI 超时

    我在 WCF 项目 Net 4 0 中有以下内容 ServiceContract public interface EchoService OperationContract void Ping ServiceBehavior public
  • 使用 Spring Batch 的复杂 XML; StaxEventItemWriter ; Jaxb2Marshaller

    我需要使用 Spring Batch 编写稍微复杂的 XML 谁能帮我进行适当的 Spring 配置吗 以下是该过程所需的输出
  • 在 R 中查找排序向量中的值索引

    我在 R 中有一个由唯一整数组成的有序向量 我想找到最接近但小于或等于某个值的元素的索引 例如 对于向量4 8 15 16 23 42和搜索值17 我希望函数返回4 指数16 在Python中 我会使用bisect模块 R中有类似的东西吗
  • 即使使用 strip_cdata=False 之后,CDATA 也会在 lxml 中被剥离

    我有一个要求 我需要读取 XML 文件并用特定值替换字符串 XML 包含 CDATA 元素 我需要保留它 我尝试使用解析器并将 strip data 设置为 false 这是行不通的 需要帮助找出实现它的方法 import lxml etr
  • PostgreSQL 连接问题

    我的应用程序有一个非常奇怪的问题 有时在连接到 postgres 时会出现以下错误 这种情况的发生没有任何模式 当我运行一些广泛的硒测试时经常发生 警告 pg connect function pg connect 无法连接到 Postgr
  • 如何在 Web 应用程序前端强制 fetch 接受自签名证书?

    我正在制作一个简单的 Web 应用程序前端原型 它需要从我的服务器获取 JSON 数据 服务器本身工作正常 我可以单击链接 JSON 数据就会显示在浏览器中 但以下简单脚本失败了 fetch https x x x x 8000 MY UR
  • 安装前获取功能安装成本

    我们正在为您的安装制作自定义引导程序 外部 UI 我们希望提供一个 自定义安装 对话框 就像在 MSI 中一样 以允许用户选择他们想要安装或删除的功能 目前 我们能够从 MSI 数据库本身读取功能 以及其他功能详细信息 例如描述 通过在 M