Installation 从RemoveRegistry表中删除记录

Installation 从RemoveRegistry表中删除记录,installation,wix,windows-installer,Installation,Wix,Windows Installer,我有一些注册表资源需要在安装时删除,但如果目标上有其他组件需要它们,则不需要删除。[理想情况下,我会通过将资源与共享组件关联来实现这一点,但我在这里没有这个选项] 我有一些共享代码来运行SQL命令(包括DELETE语句),这在其他任何地方都可以正常运行,但在本例中,DELETE语句似乎运行良好,但记录不会被删除。我编写了一个查询,以在DELETE命令运行后实际检查表的状态,看起来只有数据库记录的第一个元素实际被删除,而记录中的其余字段保持不变。 当我打印出表记录时,我会得到这样的结果,其中第一个

我有一些注册表资源需要在安装时删除,但如果目标上有其他组件需要它们,则不需要删除。[理想情况下,我会通过将资源与共享组件关联来实现这一点,但我在这里没有这个选项]

我有一些共享代码来运行SQL命令(包括DELETE语句),这在其他任何地方都可以正常运行,但在本例中,DELETE语句似乎运行良好,但记录不会被删除。我编写了一个查询,以在DELETE命令运行后实际检查表的状态,看起来只有数据库记录的第一个元素实际被删除,而记录中的其余字段保持不变。 当我打印出表记录时,我会得到这样的结果,其中第一个字段是空的

,2,软件\xxxxxxx安装,版本,YYYYYY

MSI(A8!5C)[16:49:19:628]:数据库字符串池已损坏

我改变了策略,而不仅仅是执行一个DELETE命令,我使用MSIMODIFY_DELETE对每条记录执行了MsiViewModify,但我遇到了同样的问题

最后,我不得不编辑这些记录,以便它们引用一个我知道不存在的不同的值,但出于明显的原因,我不喜欢这样


有人对此有什么建议吗?MSI 1.0中有一个与字符串池相关的非常老的bug,但它与需要提交的MSI数据库文件相关,这不适用于通过调用GetActiveDatabase()获得句柄的自定义操作的上下文.

我记得我在某个地方读到MSI SQL对临时表和行的支持是加法而不是减法的。在SDK文档中,您会注意到只有INSERT INTO命令具有临时选项,DELETE FROM不具有临时选项

您确实需要研究如何更好地组织组件,以便您的注册表资源可以与所有具有依赖于注册表项的资源的组件的各种功能相关联


这是正确的,在安装过程中不能从MSI中删除行。更简单的解决方案是使用自定义操作删除条目。这个自定义操作可以通过一个搜索来确定是否存在其他组件。我不认为DELETE-FROM不起作用,因为我还有其他几种情况下这种方法很有效。此外,如果它不工作,为什么我在尝试执行SQL语句时没有收到错误?正如我在OP中明确指出的,问题不是组织问题。如果是,那么在决定是否删除这些reg值时,让MSI处理组件引用计数将是一件小事。共享资源由非MSI安装所有,因此这实际上不是一个选项。