小编Ste*_*mul的帖子

手动创建MSI补丁(.msp)?

我们的团队最近一直在考虑向用户推出一个小的注册表修复程序来修改一个特定的有问题的密钥.非常简单的东西,只需更新注册表中的1个键/值.

所以目前,我们正在使用Wix为该产品构建.msi安装程序.在研究Wix对生成.msp补丁文件的支持时,似乎创建.msp的唯一方法是一个有点过于复杂的多步骤过程:

  1. 获取原始MSI的副本,并编译固定MSI的新副本
  2. 编写一个指向两个安装程序的新Wix文件
  3. 将Wix文件编译为带有Candle到.psp的.wixobj
  4. 在原始安装程序和.psp的快照之前/之后运行Torch/Pyro,或者使用MsiMsp.exe运行

现在我的问题是,我不能简单地将注册表更改描述为Wix文件并将其直接编译到.msp中,而没有第1步和第4步 - 这只需要一个简单的更改就可以付出巨大的努力?

windows installer windows-installer wix msp

7
推荐指数
1
解决办法
1万
查看次数

默认情况下,将子功能设置为不安装

我有一个带有功能和两个子功能的WIX安装.我希望该功能是必需的,并且两个子功能是可选的,但默认情况下不安装.这是我的功能树:

<Feature Id="A" Level="3" AllowAdvertise="no" TypicalDefault="install" 
         InstallDefault="local" Absent="disallow" >
  <Feature Id="A1" Level="1" AllowAdvertise="no" />
  <Feature Id="A2" Level="1" AllowAdvertise="no" />
</Feature>
Run Code Online (Sandbox Code Playgroud)

我想添加:

<Property Id="INSTALLLEVEL" Value=3 />
Run Code Online (Sandbox Code Playgroud)

将设置主要功能安装和子功能不安装.情况并非如此; 默认情况下安装所有功能.

我正在使用WixUI_FeatureTree.我想知道这是否会搞乱INSTALLLEVEL属性.

那么我正在尝试甚至可能吗?如何默认禁用这两个子功能?

编辑:有趣.我重新设置INSTALLLEVEL=1000并尝试了,所有功能仍然设置为安装.WixUI_FeatureTree会破坏INSTALLLEVEL吗?

installer windows-installer wix

7
推荐指数
2
解决办法
6233
查看次数

在WiX中的对话框(InstallUISequence)之间插入自定义操作

我有两个自定义对话框(加上所需的项目ExitDlg,FatalErrorDlg等),第一个设置使用Edit控件的属性,第二个显示了使用文本控件这个属性.这是有意义的代码:

<Dialog Id="DialogA" ...>
  <Control Id="ControlEdit" Type="Edit" Property="MY_PROPERTY" .../>
  <Control Id="ControlNext" Type="PushButton" ...>
    <Publish Event="EndDialog" Value="Return" /></Control>
</Dialog>
Run Code Online (Sandbox Code Playgroud)

然后是第二个对话框:

<Dialog Id="DialogB" ...>
  <Control Id="ControlText" Type="Text" Text="[MY_PROPERTY]" .../>
  <Control Id="ControlBack" Type="PushButton" ...>
    <Publish Event="EndDialog" Value="Return" /></Control>
  <Control Id="ControlNext" Type="PushButton" ...>
    <Publish Event="EndDialog" Value="Return" /></Control>
</Dialog>
Run Code Online (Sandbox Code Playgroud)

动作顺序:

<InstallUISequence>
   <Show Dialog="DialogA" Before="MyCustomAction" />
   <Custom Action="MyCustomAction" Before="DialogB" />
   <Show Dialog="DialogB" Before="ExecuteAction" />
</InstallUISequence>
Run Code Online (Sandbox Code Playgroud)

自定义操作会更改值MY_PROPERTY.我的问题是如何使返回按钮DialogB回来DialogA.使用NewDialog很简单,但是我无法在对话框之间执行自定义操作,或者我可以吗?


编辑 - 2013-05-02

在@caveman_dick的答案之后,我试图改变它DialogA几乎就像他说的那样,但是EndDialog我没有使用,而是改为 …

installer windows-installer custom-action wix

7
推荐指数
1
解决办法
1万
查看次数

Wix修改现有的ini文件

我试图在Wix中修改.ini文件

如果它不存在,则msi无法完成....

  1. 我该如何检查
  2. 我真的想修改它

是的我在google上查看了其他stackoverflow问题/答案

我正在尝试这个......

      <Component Id="TestIni" Guid="*">
        <CreateFolder />

        <IniFile Id="Ini1"
                 Action="createLine"
                 Directory="INSTALLLOCATION"
                 Section="Test"
                 Name="Minimal.ini"
                 Key="TestKey"
                 Value="TestValue" />

        <IniFile Id="Ini2"
                 Action="createLine"
                 Directory="WindowsFolder"
                 Section="Test"
                 Name="Minimal.ini"
                 Key="TestKey"
                 Value="WindowsFolder TestValue" />

      </Component>
Run Code Online (Sandbox Code Playgroud)

installer ini windows-installer wix

7
推荐指数
1
解决办法
5490
查看次数

卸载软件

我的产品有一个帮助程序可执行文件来卸载所有相关的子产品.我根据所有子产品的升级代码卸载.

首先,我使用MsiEnumRelatedProducts函数从升级代码中获取产品代码.然后我尝试使用MsiConfigureProductEx函数卸载产品.

问题MsiConfigureProductEx是返回错误.

调用函数:MsiConfigureProductsEx
返回代码:1605(0x00000645)
描述:此操作仅对当前安装的产品有效.

为什么MsiEnumRelatedProducts返回无效的产品代码?我搜索了Windows注册表,看看是否存在这样的产品代码.没有.如何调试问题?

编辑:添加了重现问题的最小代码.

// UpgradeCodes is an array having upgrade codes of all modules.

TCHAR lpProductCode[GUID_STR_LENGTH];
const TCHAR tszNoReboot[] = _T("REMOVE=ALL REBOOT=ReallySuppress DISABLE_REBOOT_PROMPT=1");

for (size_t i = 0; i < sizeof(UpgradeCodes) / sizeof(UpgradeCodes[0]); i++)
{
   tstring tstrUpgradeCode = UpgradeCodes[i];

   DWORD dwIndex = 0;
   size_t status;

   // for each of the upgrade code, get all the products
   do
   {
       status = MsiEnumRelatedProducts(UpgradeCodes[i], 
                                       0, 
                                       dwIndex, 
                                       lpProductCode);
       if (ERROR_SUCCESS == …
Run Code Online (Sandbox Code Playgroud)

windows installer winapi windows-installer

7
推荐指数
2
解决办法
1736
查看次数

ICE64:目录ApplicationProgramsFolder位于用户配置文件中,但未在RemoveFile表中列出

我发现StackOverflow上列出了类似的问题,但我无法使这些建议的修复工作.请参阅下面的代码部分.我是新来的,我不确定我错过了什么.我试图按照WIX文档中的示例进行操作.谢谢您的帮助.

<Fragment>
 <Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
   <Directory Id="INSTALLFOLDER" Name="MedusaPerf" />
  </Directory>
  <Directory Id="ProgramMenuFolder">
   <Directory Id="ApplicationProgramsFolder" Name="MedusaPerf"/>
  </Directory>
 </Directory>
</Fragment>

<Fragment>
 <DirectoryRef Id="ApplicationProgramsFolder">
  <Component Id="ApplicationShortcut" Guid="*">
   <Shortcut Id="ApplicationStartMenuShortcut"
             Name="MedusaPerf"
             Description="MedusaPerf multi-query stress test tool."
             Target="[#MedusaPerfApp.exe]"
             WorkingDirectory="INSTALLFOLDER"/>
   <RemoveFolder Id="RemoveProgramFilesFolder" 
                 Directory="ProgramFilesFolder" On="uninstall"/>
   <RemoveFolder Id="RemoveApplicationProgramsFolder" 
                 Directory="ApplicationProgramsFolder" On="uninstall"/>
   <RegistryValue Root="HKCU" Key="Software\Microsoft\MedusaPerf" 
                  Name="installed" Type="integer" Value="1" KeyPath="yes"/>
  </Component>
</DirectoryRef> 
</Fragment>
Run Code Online (Sandbox Code Playgroud)

c# windows-installer wix wix3.8

7
推荐指数
1
解决办法
4364
查看次数

WiX RemoveFolderEx不工作?

我希望WiX在卸载时删除AppData文件夹,所以我查看了RemoveFolderEx并按照一些帖子/指南介绍了如何使其正常工作.据我所知,我的实现应该有效,但事实并非如此.我正在使用以下内容:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="AppDataFolder">
        <Directory Id="PRIVATEDATAFOLDER" Name="MyApp"/>
    </Directory>
</Directory>
<Property Id="PRIVATEDATAFOLDER">
    <RegistrySearch Root="HKCU" Key="Software\AppCo\MyApp" Type="raw" 
                    Id="APPLICATIONFOLDER_REGSEARCH" Name="PrivateDir" />
</Property>
<DirectoryRef Id='PRIVATEDATAFOLDER'>
    <Component Id="PrivateData" Guid="myGuid">
        <CreateFolder Directory="PRIVATEDATAFOLDER"/>
        <util:RemoveFolderEx Property="PRIVATEDATAFOLDER" On="uninstall"/>
        <RemoveFolder Id="PRIVATEDATAFOLDER" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\AppCo\MyApp" Name="PrivateDir" 
                       Type="string" Value="[PRIVATEDATAFOLDER]" KeyPath="yes"/>
    </Component>
</DirectoryRef>
Run Code Online (Sandbox Code Playgroud)

我有什么问题吗?

编辑:检查详细日志后,我收到错误:

WixRemoveFoldersEx: 错误0x80070057:缺少文件夹属性:PRIVATEDATAFOLDER

installer windows-installer wix

7
推荐指数
1
解决办法
4034
查看次数

使用 WiX 创建的 MSI 的数字文件名

当我运行 WiX 安装程序时,它会触发用户访问控制,要求确认运行 MSI,MSI 文件名显示为“7 位数字.msi”(例如“3858264.msi”)。

有没有办法将该名称更改为其他名称?

installation windows-installer wix

7
推荐指数
1
解决办法
1640
查看次数

正确处理SmtpClient使用的资源

我有一个C#服务,它持续运行用户凭证(即不是本地系统 - 我不能改变这个,虽然我想).在大多数情况下,服务似乎运行正常,但是它经常被轰炸并重新启动,没有明显的原因(服务器管理器设置为在崩溃时重新启动服务).

我在做大量的事件日志,我有一个分层的方法,以异常处理,我认为它可以使至少某种意义:

  • 基本上我得到了顶级泛型异常,null异常和启动异常处理程序.
  • 然后我在" 命令级别 " 获得了各种处理程序(即服务运行的特定操作)
  • 最后,我处理了在类级别处理的一些异常

我一直在看是否有任何资源没有正确发布,我开始怀疑我的邮件代码(发送电子邮件).我注意到我没有为MailMessage对象调用Dispose,现在我已经重写了SendMail代码,如下图所示.

基本问题是:

  • 这段代码会正确释放用于发送邮件的所有资源吗?
  • 我不明白的方式来处理的的SmtpClient对象
  • (对于记录:我没有使用对象初始化器来使样本更容易阅读)
    private static void SendMail(string subject, string html)
    {
        try
        {
            using ( var m = new MailMessage() )
            {
                m.From = new MailAddress("service@company.com");
                m.To.Add("user@company.com");
                m.Priority = MailPriority.Normal;
                m.IsBodyHtml = true;
                m.Subject = subject;
                m.Body = html;
                var smtp = new SmtpClient("mailhost"); …
Run Code Online (Sandbox Code Playgroud)

email send smtpclient mailmessage

6
推荐指数
1
解决办法
6639
查看次数

Wix - 自定义安装目录

我正在使用Wix 3.x,用户应该能够选择目标目录.我的Setup.wxs目前在这里:http://pastebin.com/uH1EjbDQ

询问用户自定义目标目录的最简单方法是什么?(INSTALLDIR/TARGETDIR ?!)我看过人们建立自己的对话框页面的例子,但这不是必需的,是吗?

更新:

当我添加

<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"/>
<UIRef Id="WixUI_InstallDir" />
Run Code Online (Sandbox Code Playgroud)

之后<UIRef Id="WixUI_Mondo" />但在</Product>我收到以下错误之前:

The primary key 'ExitDialog/Finish/EndDialog/Return/1' is duplicated in table 'ControlEvent'. Please remove one of the entries or rename a part of the primary key to avoid the collision. (LGHT0130) - C:\delivery\Dev\wix30_public\src\ext\UIExtension\wixlib\WixUI_Mondo.wxs:44

现在,当我删除时,<UIRef Id="WixUI_Mondo" />我可以构建设置.但是不再显示"选择安装类型"(完整,典型,自定义)对话框.还有一个奇怪的事情:有时弹出一个对话框,说明它计算磁盘空间(它有一个取消按钮),但最终它永远不会自动关闭.当我关闭它时,我仍然可以继续.有没有办法以简单的方式解决这个问题?

谢谢,菲利普

.net installer windows-installer wix wix-gui

6
推荐指数
1
解决办法
2万
查看次数