如何根据自定义操作中设置的属性安装功能?

2024-03-12

我正在尝试根据应在自定义操作中设置的值安装两个功能之一。
首先,我设置一个属性的值:

UINT __stdcall ConfigurationCheckAction(MSIHANDLE hInstall)
{
    HRESULT hr = S_OK;
    UINT er = ERROR_INSTALL_FAILURE;

    hr = WcaInitialize(hInstall, "ConfigurationCheckAction"); 
    if (condition) {
         MsiSetProperty( hInstall, TEXT("STREAM"), TEXT("RED") );
    }
    else {
         MsiSetProperty( hInstall, TEXT("STREAM"), TEXT("BLUE") );
    } 
    return WcaFinalize(er);
}

其次,我为每两个特征设定两个条件:

<Feature Id='Complete' Level='1'>
     <Feature Id="Red" ConfigurableDirectory="TARGETDIR" Title="F1" Level="0">
     <Condition Level="1">STREAM</Condition>
     </Feature>
     <Feature Id="Blue" ConfigurableDirectory="TARGETDIR" Title="F2" Level="0">
     <Condition Level="1">NOT STREAM</Condition>
     </Feature>
</Feature>

请注意,我之前没有在 wxs 文件内定义属性,因为我想从自定义操作中设置它。

我的自定义操作在 InstallInitialize 之前调用,并且立即执行。

从安装日志中,我确认该属性已设置。 但是,我的条件安装不起作用,因为条件中的内容似乎总是被评估为错误。

我尝试评估条件: 流、流=红色、流=红色、

我不知道该做什么,希望得到帮助。


测试所有这些已经太晚了,但这里提供了一些信息。我明天再回来查看。本质上,我认为问题在于您的自定义操作顺序。在成本计算之前尝试一下。

需要考虑的一些事项:

  • Custom action sequencing: you need to sequence your custom action right and it needs to be present in both silent and interactive installation modes.
    • 您之前是否尝试过对设置属性自定义操作进行排序CostInitialize?您声明您在 InstallInitialize 之前设置它,但在 CostInitialize 之前尝试它(您可能已经尝试过)。
    • 您是否记得将此自定义操作插入到InstallUISequence以及InstallExecuteSequence?您需要插入两个序列,以防安装程序在静默模式下运行。前CostInitialize我相信在这两个序列中。
  • Feature Level: manipulating features via the feature level https://msdn.microsoft.com/en-us/library/windows/desktop/aa368585(v=vs.85).aspx and INSTALLLEVEL https://msdn.microsoft.com/en-us/library/windows/desktop/aa369536(v=vs.85).aspx is just one way to do feature control, you can also set features via the command line or using a custom action.
    • 将功能级别设置为 0 应该会在设置的自定义对话框中隐藏该功能。
    • 将功能级别设置为高于安装程序的 INSTALLLEVEL 将从安装中取消选择该功能。
    • 相反,将功能级别设置为低于或等于安装程序的 INSTALLLEVEL 将选择要安装的功能。
    • 条件语法 https://msdn.microsoft.com/en-us/library/windows/desktop/aa368012%28v=vs.85%29.aspxallowed 非常灵活,可以提供您完全需要的功能 - 但我从未正确使用过它们。这是来自 Installshield 论坛的示例 https://community.flexerasoftware.com/showthread.php?171535-Feature-State-vs-Feature-Action-in-Basic-MSI.
  • 添加本地和删除:您可以通过更改值来操纵特征选择ADDLOCAL https://msdn.microsoft.com/en-us/library/windows/desktop/aa367536%28v=vs.85%29.aspx and REMOVE https://msdn.microsoft.com/en-us/library/windows/desktop/aa371194(v=vs.85).aspx来自自定义操作的属性(技术上也是重新安装和广告) - 这些属性也可以通过命令行设置。
  • Win32:您还可以使用Win32函数MsiGetFeatureState https://msdn.microsoft.com/en-us/library/windows/desktop/aa370117(v=vs.85).aspx and MsiSet功能状态 https://msdn.microsoft.com/en-us/library/windows/desktop/aa370387(v=vs.85).aspx- 来自 C++ 自定义操作 - 设置功能选择。

坦白说,整件事有点疯狂。另请记住,有特征动作状态(某个功能将会发生什么)以及功能安装状态(它处于什么状态)。 Win32函数文档应该有解释。


交联方便检索:

  • 正在安装未选择的功能 https://stackoverflow.com/questions/50515993/unselected-feature-being-installed/50556535#50556535
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据自定义操作中设置的属性安装功能? 的相关文章

  • 如何将包含 5000 条记录的 Excel 文件插入到 documentDB 中?

    我有一个 Excel 文件 最初约有 200 行 我能够将 Excel 文件转换为数据表 并且所有内容都正确插入到 documentdb 中 Excel 文件现在有 5000 行 在插入 30 40 条记录后不会插入 其余所有行不会插入到
  • C# 创建函数队列

    我写了一个名为 QueueManager 的类 class QueueManager Queue functionsQueue public bool IsEmpty get if functionsQueue Count 0 return
  • 如何从RichTextBox中获取显示的文本?

    如何获得显示的RichTextBox 中的文本 我的意思是 如果 RichTextBox 滚动到末尾 我只想接收那些对我来说可见的行 P S 获得第一个显示的字符串就足够了 您想使用 RichTextBox GetCharIndexFrom
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 静态类变量与外部变量相同,只是具有类作用域吗?

    在我看来 静态类变量与外部变量相同 因为你只需要declare它在static int x extern int x语句 并在其他地方实际定义它 通常在 cpp 文件中 静态类变量 h file class Foo static int x
  • 如何在 Asp.net Gridview 列中添加复选框单击事件

    我在 asp 中有一个 gridview 其中我添加了第一列作为复选框列 现在我想选择此列并获取该行的 id 值 但我不知道该怎么做 这是我的 Aspx 代码
  • Paradox 表 - Oledb 异常:外部表不是预期的格式

    我正在使用 Oledb 从 Paradox 表中读取一些数据 我遇到的问题是 当我将代码复制到控制台应用程序时 代码可以工作 但在 WinForms 中却不行 两者都以 x86 进行调试 我实际上只是复制代码 在 WinForms 应用程序
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 手动将 ClientBase 集合类型从 Array[] 更改为 List<>

    我将自己的 WCF 代理与 Client Base 一起使用 我想做一些类似于 svc util 中的 ct 属性的操作 并告诉代理返回 List 集合类型 我不能使用 List 因为实体由 nhibernate 管理 所以我必须使用 IL
  • C#中Enum中定义的value__是什么

    What value 可能在这里 value MSN ICQ YahooChat GoogleTalk 我运行的代码很简单 namespace EnumReflection enum Messengers MSN ICQ YahooChat
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 相当于 C# 中 Java 的“ByteBuffer.putType()”

    我正在尝试通过从 Java 移植代码来格式化 C 中的字节数组 在 Java 中 使用方法 buf putInt value buf putShort buf putDouble 等等 但我不知道如何将其移植到 C 我尝试过 MemoryS
  • 如何将对象转换为传递给函数的类型?

    这不会编译 但我想做的只是将对象转换为传递给函数的 t public void My Func Object input Type t t object ab TypeDescriptor GetConverter t ConvertFro
  • C++ [Windows] 可执行文件所在文件夹的路径[重复]

    这个问题在这里已经有答案了 我需要访问一些文件fstream在我的 Windows 上的 C 应用程序中 这些文件都位于我的exe文件所在文件夹的子文件夹中 获取当前可执行文件的文件夹路径的最简单且更重要的 最安全的方法是什么 Use 获取
  • g++ C++0x 枚举类编译器警告

    我一直在将可怕的 C 类型安全伪枚举重构为新的 C 0x 类型安全枚举 因为它们是way更具可读性 不管怎样 我在导出的类中使用它们 所以我明确地将它们标记为导出 enum class attribute visibility defaul

随机推荐

  • ID动态文档firestore

    如何在firestore中制作该文档的IDQEoevSjHlswgk44nVTsr动态的 即根据该集合中的 ID 进行更改 我正在使用 angularfire2 5 0 0 rc 11 这就是我所拥有的 firebase service t
  • 如何在Svelte中动态渲染组件?

    我试图循环遍历一个数组来渲染具有以下值的组件type each contents as content lt content type gt each 期望的输出
  • 为什么Activity结束时会抛出NPE?

    我有一个错误 这几天来一直让我发疯 不幸的是 我无法向您展示代码 原因有两个 我的老板不会欣赏它 并且代码库太大而无法共享 每当活动完成时就会发生该错误 无论是因为我调用 finish 还是因为操作系统破坏了它 问题是 是什么 或可能 导致
  • FullCalendar Scheduler 列标题格式

    我正在使用 FullCalendar 和调度程序 最新版本 我想将列标题格式替换为 DM dddd 我尝试使用 columnHeaderFormat 但它似乎不起作用 我也尝试使用旧的 即columnFormat 但它仍然不起作用 docu
  • 对 getchar 和 scanf 感到困惑

    我真的很困惑的用法getchar and scanf 这两者有什么区别 我知道scanf 和家人 从用户 或文件 处获取一个字符一个字符并将其保存到一个变量中 但它是立即执行还是在按下某些内容后执行此操作 Enter 我不太理解这段代码 我
  • 使用新的 Flutter Apk 更新 Android 应用程序 (Google Play)

    我一年前创建了一个 Android 应用程序 我想用新的 apk 版本更新它 但是用 flutter 构建 这可能吗 如何 谢谢 是的 这是完全可能的 您需要做的三件事 使用与旧应用程序相同的包名称 应用程序 ID 使用与旧应用程序相同的签
  • 如何使用 Sqlite.swift 获取列名称列表?

    出于调试目的 我试图获取 SQLite 表中列名的简单列表 我正在使用SQLite swift框架 https github com stephencelis SQLite swift 我的问题比如何在 sqlite3 iPhone 上获取
  • 使用ffmpeg删除重复的帧和连接的音频

    使用 ffmpeg 我能够使用以下命令从视频中删除重复的帧ffmpeg i in mp4 vf mpdecimate setpts N FRAME RATE TB out mp4 然而 音频比视频持续的时间更长 显然是因为该命令仅删除了视频
  • 无法使用 Axios 或 SuperAgent 从 React 应用程序进行基本身份验证

    我尝试使用 axios 发出 GET 请求 但总是收到 401 仅当我从 React 应用程序发送请求时才会发生这种情况 axios get http localhost 8080 vehicles withCredentials true
  • 无法将类型“System.Collections.Generic.IEnumerable”隐式转换为“System.Collections.Generic.List

    我有下面的代码 List
  • 如何转义parameters.yml symfony2中的“%”

    我想逃脱一个角色 在文件 parameters yml中 因为我的密码以 database driver3 pdo sqlsrv database host3 192 168 10 10 database port3 1455 databa
  • 使用python在json中递归搜索

    我有一个像这样的 json result timestamp 1234567890 textsList text some text here 0 otherList type Nothing type Recursive data tim
  • 从 SSIS 中的 CSV 导入 yyyyMMdd 日期

    我有 12 列使用yyyymmdd格式 在里面数据流任务 我有一个平面文件源 a 派生列任务 and an OLE DB 目标 我将以下表达式应用于派生列任务 DT DBDATE SUBSTRING DT STR 10 1252 Date
  • 使用“IFRAME”的沙箱模式时,无法获取在 Google Apps 脚本中工作的链接

    在 Google Apps 脚本中 下面的代码在默认沙箱模式下适用于我 但是当我将沙箱模式更改为 IFRAME 时 该代码不起作用 在 IE11 中 单击第一个按钮后出现空白页面 在 Chrome 中 第一个按钮可以工作 但单击后续按钮会显
  • 多列的唯一约束

    我正在使用 SEAM 2 Hibernate 以及 PostgreSQL 9 数据库 我有下表 Active Band active band id serial active band user text active band date
  • 改变线性布局android中的视图顺序

    如您所知 线性布局中视图的顺序与 xml 文件中视图的顺序相关 是否可以通过索引之类的方法用java代码更改该顺序 我会尝试删除所有视图removeView view http developer android com reference
  • 将图像传递给另一个活动

    感谢这个网站 我弄清楚了如何在活动之间传递字符串值 但是我在传递图像时遇到了麻烦 我想要做的是让用户单击一个按钮来打开图库并允许选择图片 然后我有另一个按钮可以打开另一个显示 ImageView 的活动 我希望能够从上一个活动中选择 Ima
  • 如何解决CWE-259:使用硬编码密码?

    我向 Veracode 安全扫描工具提交了我的应用程序 EAR 并在下面的代码中发现了这个缺陷 private String url jdbc mysql localhost 8081 sql private String userName
  • 制作自定义片段后应用程序中出现错误

    我制作了一个测验应用程序 其中我将问题存储在数据库中 然后以列表的形式从数据库中取出 我正在制作自定义片段以从数组列表上传问题 但每个片段上只得到 1 个问题 这是我的数据库代码 package com example android vi
  • 如何根据自定义操作中设置的属性安装功能?

    我正在尝试根据应在自定义操作中设置的值安装两个功能之一 首先 我设置一个属性的值 UINT stdcall ConfigurationCheckAction MSIHANDLE hInstall HRESULT hr S OK UINT e