标签: windows-installer

使用 Wix 在 MSI 中的自定义操作中出现错误时显示最终用户消息

假设我有以下 WIX 标记,指示 MSI 安装程序从包含的 DLL 调用自定义操作:

<CustomAction Id="CA_SetProperties_Finalize" 
        Property="CA_OnInstallFinalize" 
           Value="[Installed],[REINSTALL],[UPGRADINGPRODUCTCODE],[REMOVE]" />

<CustomAction Id='CA_OnInstallFinalize' 
       BinaryKey='CADll' 
        DllEntry='msiOnInstallFinalize' 
         Execute='deferred' Impersonate='no' />

<InstallExecuteSequence>
  <Custom Action='CA_SetProperties_Finalize' 
          Before='InstallFinalize'></Custom>
  <Custom Action='CA_OnInstallFinalize' 
           After='CA_SetProperties_Finalize'></Custom>
</InstallExecuteSequence>

<Binary Id='CADll' SourceFile='Sources\ca-installer.dll' />
Run Code Online (Sandbox Code Playgroud)

DLL 本身具有以下用于自定义操作的 C++ 代码:

<CustomAction Id="CA_SetProperties_Finalize" 
        Property="CA_OnInstallFinalize" 
           Value="[Installed],[REINSTALL],[UPGRADINGPRODUCTCODE],[REMOVE]" />

<CustomAction Id='CA_OnInstallFinalize' 
       BinaryKey='CADll' 
        DllEntry='msiOnInstallFinalize' 
         Execute='deferred' Impersonate='no' />

<InstallExecuteSequence>
  <Custom Action='CA_SetProperties_Finalize' 
          Before='InstallFinalize'></Custom>
  <Custom Action='CA_OnInstallFinalize' 
           After='CA_SetProperties_Finalize'></Custom>
</InstallExecuteSequence>

<Binary Id='CADll' SourceFile='Sources\ca-installer.dll' />
Run Code Online (Sandbox Code Playgroud)

发生的情况是,当我的doWork方法失败时,安装不应继续,因此我返回ERROR_INSTALL_FAILURE。问题是,在这种情况下,安装程序会直接退出,安装 GUI 窗口也会消失。

所以我很好奇,是否有任何方法可以更改 Wix 标记,以便在我的自定义操作返回错误时能够显示用户消息?

windows windows-installer wix

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

运行msi时如何运行.reg文件?

我试图了解我的 setup.msi 在安装时如何插入注册表值。在 Orca 编辑器中我看到这样的,

在此输入图像描述

安装 msi 后,在日志文件中我看到这样的内容,

MSI (s) (A8:B4) [16:27:28:674]: Executing op: ComponentRegister(ComponentId={45667B7F-9DC7-43B7-BE9E-3215ED1B1985},KeyPath=02:\SOFTWARE\myCompany\MySolution\Plugins\MyProduct\ProductCode,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0)
Run Code Online (Sandbox Code Playgroud)

我想做这个机制的逆向工程,有人可以帮助我理解这一点吗?我想使用 WIX 重新创建相同的内容,所以我只是尝试如下

 <Component Id="RegistryEntries" Guid="*">
            <RegistryKey Root="HKLM"
                         Key="Software\Microsoft\MyCompany"
                  Action="createAndRemoveOnUninstall">
              <RegistryValue Type="string" Name="MyApp" Value="[INSTALLLOCATION]" KeyPath="yes"/>
              <RegistryValue Type="string" Name="Configuration Files" Value="[INSTALLLOCATIONCONFIG]"/>
              <RegistryValue Type="string" Name="Configuration Files1" Value="[INSTALLLOCATIONCONFIG1]"/>
            </RegistryKey>
          </Component>
Run Code Online (Sandbox Code Playgroud)

当我构建 msi 并编辑 Orca 时,我会看到如下所示, 在此输入图像描述

我应该怎么做才能获得如上图所示的 msi?

installation windows-installer installshield wix

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

在 Inno Setup 卸载期间卸载 MSI

我安装了一个MSI文件作为 Inno Setup 安装脚本的一部分。有没有办法将其作为我的程序卸载过程的一部分来卸载?

windows-installer inno-setup

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

从环境变量动态设置 WiX 中的安装目录

我是 MSI 开发(使用 WiX 或其他方式)的新手,我正在尝试读取环境变量的值并将其用作安装目录。我的 msi 也没有 GUI,并且不允许用户选择覆盖路径。

我可以使用以下命令成功读取 var:

<SetProperty 
    Id="TARGETINSTALLDIR" 
    Value="[%MY_ENV_VAR]\My\Install\Path" 
    After="LaunchConditions" 
    Sequence="first"  />
Run Code Online (Sandbox Code Playgroud)

我可以在 msi 日志中看到检索到的正确路径。

我已尝试以下方法来设置返回的路径:

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="APPLICATIONROOTDIRECTORY" Name="[TARGETINSTALLDIR]"/>
</Directory>
Run Code Online (Sandbox Code Playgroud)

还,

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="APPLICATIONROOTDIRECTORY" Name="TARGETINSTALLDIR"/>
</Directory>
Run Code Online (Sandbox Code Playgroud)

如果失败,我还尝试读取根目录中的目录路径,如下所示

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ROOT" Name="[%MY_ENV_VAR]">
      <Directory Id="My" Name="My">
        <Directory Id="Install" Name="Install">
          <Directory Id="APPLICATIONROOTDIRECTORY" Name="Path"/>
        </Directory>
      </Directory>  
    </Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)

我是否缺少一些语法,或者我从根本上误解了应该如何完成此操作?

windows-installer wix environment-variables

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

为什么 TARGETDIR 目录需要名称?

在wix项目中你通常会看到这样的一行

<Directory Id="TARGETDIR" name="SourceDir">
Run Code Online (Sandbox Code Playgroud)

但为什么需要name设置在这里呢?据我了解,该name属性指定执行安装的计算机上生成的文件夹的名称。但是不会创建 SourceDir 文件夹,那么为什么需要它呢?

windows-installer wix

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

使用 WixUI_Advanced 时如何将 RemoveExistingProducts 更改为 InstallFinalize 之后?

这是我的场景:

  • 使用 Wix 3.6
  • 使用WixUI_Advanced对话框集(添加能够在安装过程中控制单个功能的能力)
  • 设置NeverOverwrite="yes"一个web.config组件(这样的局部变化,安装后不会丢失)

但是,安装程序web.config在升级过程中似乎仍会删除并重新安装该文件。

最好我可以告诉WixUI_Advanced对话框集配置如下:

<InstallExecuteSequence>
     <RemoveExistingProducts After="InstallInitialize"/>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)

以下是安装的日志片段:

MSI (s) (74:8C) [18:37:00:959]: Executing op: ActionStart(Name=InstallInitialize,,)
Action 18:37:00: InstallInitialize. 
...
Action 18:37:00: ProcessComponents. Updating component registration
...
Action 18:37:00: UnpublishFeatures. Unpublishing Product Features
...
UnpublishFeatures: Feature: ProductFeature
...
UnpublishFeatures: Feature: AdditionalFeature
...
MSI (s) (74:8C) [18:37:00:967]: Executing op: ActionStart(Name=RemoveFiles,Description=Removing files,Template=File: [1], Directory: [9])
Action 18:37:00: RemoveFiles. Removing files
MSI (s) (74:8C) [18:37:00:967]: Executing op: ProgressTotal(Total=2,Type=1,ByteEquivalent=175000)
MSI …
Run Code Online (Sandbox Code Playgroud)

windows-installer wix

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

当我们安装.exe文件时不要覆盖现有文件

我已经安装了 .exe 应用程序(例如版本 1.0)。安装应用程序后,我可以在本地路径(C:\Program Files (x86))中看到几个 DLL 和几个 .XML 配置文件。现在,在启动新版本并安装它之后,我不想单独覆盖本地路径中的现有 XML 文件。有什么办法可以做到吗?

我的 EXE 是使用 WIX 安装程序创建的,项目是在 Visual Studio 2015 中构建的。

c# windows-installer wix

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

msi 安装程序中的“修复”选项有何用途?它的真正作用(内部)是什么?

我有一个使用 WIX 部署的软件包。当我安装后再次运行安装程序时,它提供了修复选项,它到底有什么作用?

windows-installer wix

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

如何保护 MSI 不被修改

我想保护 MSI 文件不被修改。使用 ORCA 或 MSI API 可以轻松完成。很难过,因为任何人都可以修改/添加/删除具有管理员权限的 Windows 安装程序自定义操作或属性。

有没有办法将 MSI 文件设置为某种只读模式或以某种方式保护其内容?

c c++ windows-installer custom-action wix

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

在 VS2019 .NET 4.8 中为 C# 项目构建安装程序失败

我在 VS2019 Enterprise 中构建的解决方案中有一个 C# 项目,使用 .NET 4.8,由于这是一个仅供内部使用的工具,1)我将发布的构建日志将被编辑,2)我完全知道将运行它的每台计算机的硬件和 .NET 版本,因为它们都与我自己的完全相同。

该程序集使用硬件密钥进行签名,因为我们使用白名单来确定哪些内容可以在所述笔记本电脑上运行,哪些内容不能运行(因此我必须在本地构建它),并且由于该工具的内存需求,我仅构建了 x64。(是的,我看过它运行,是的,它使用了超过 2GB 的 RAM,不,我对此无能为力。你只需要相信我的话。)

综上所述,我安装了 Microsoft 制造的扩展程序来尝试创建 MSI 安装程序,因为这需要尽可能易于安装,但它一直失败。下面输出。

    1>------ Rebuild All started: Project: MyCSProject, Configuration: Release x64 ------
    1>  MyCSProject -> C:\dev\Source\Repos\MySolution\MyCSProject\bin\x64\Release\MyCSProject.exe
    1>  Done Adding Additional Store
    1>  Successfully signed: C:\dev\Source\Repos\MySolution\MyCSProject\bin\x64\Release\MyCSProject.exe
    1>  
    ------ Starting pre-build validation for project 'MyCSProject Setup' ------ 
    ------ Starting pre-build validation for project 'MyCSProject Setup' ------ 
    ------ Starting pre-build validation for project 'MyCSProject Setup' ------ 
    WARNING: Unable to find dependency 'MICROSOFT.WINDOWSAPICODEPACK' (Signature='(null)' Version='1.1.0.0') of …
Run Code Online (Sandbox Code Playgroud)

c# windows-installer build visual-studio-setup-proje visual-studio-2019

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