c++ - 如何隐藏或禁用 WIX 安装程序中的取消按钮?

标签 c++ wix custom-action windows-installer

我是 WiX 安装程序的新手。当进度条运行时,我需要在 WIX 安装程序中隐藏禁用取消按钮

我用谷歌搜索但没有找到一些有用的链接来隐藏取消按钮。我发现了这个:Hiding the Cancel Button During an Installation ,但仍然不知道如何使用自定义操作。有没有人可以给我一些指导来实现这一目标?

我已执行以下操作来隐藏取消按钮,但它不起作用。 首先,我根据上面提到的链接用 C++ 编写了自定义操作。让我展示一下我为自定义操作所做的工作。

打开 visual studio -> 创建新项目 -> 选择 C++ 中的自定义操作并选择类型 DLL。

它将使用 cpp 文件创建一个新项目。我将 cpp 文件命名为自定义操作并编写了以下代码:

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <Shellapi.h>
#include <msi.h>
#include <Msiquery.h>


UINT __stdcall HideCancelButton(MSIHANDLE hInstall)
{
    PMSIHANDLE hRecord = MsiCreateRecord(2);
    if (!hRecord)
        return ERROR_INSTALL_FAILURE;

    if (ERROR_SUCCESS != MsiRecordSetInteger(hRecord, 1, 2)
        || ERROR_SUCCESS != MsiRecordSetInteger(hRecord, 2, 0))
        return ERROR_INSTALL_FAILURE;

    MsiProcessMessage(hInstall, INSTALLMESSAGE_COMMONDATA, hRecord);

    return ERROR_SUCCESS;
}


// DllMain - Initialize and cleanup WiX custom action utils.
extern "C" BOOL WINAPI DllMain(
    __in HINSTANCE hInst,
    __in ULONG ulReason,
    __in LPVOID
    )
{
    switch(ulReason)
    {
    case DLL_PROCESS_ATTACH:
        WcaGlobalInitialize(hInst);
        break;

    case DLL_PROCESS_DETACH:
        WcaGlobalFinalize();
        break;
    }

    return TRUE;
}

这是 .def 文件代码:

LIBRARY "HideCancelButton"

EXPORTS
    HideCancelButton

现在我构建项目并创建了 HideCancelButton.dll 文件。

现在进入我的 WIX 项目。 添加自定义操作:

 <Binary Id="HideCancelButtonDll" SourceFile="C:\Users\umer\Desktop\HideCancelButton.dll"/>
    <CustomAction Id="CAhidecancel" BinaryKey="HideCancelButtonDll" Execute="immediate" Impersonate="no" DllEntry="HideCancelButton" Return="check"/>

在安装执行顺序中添加以下行

 <Custom Action='CAhidecancel' Before='CreateSSISCatalog'></Custom>

这就是我所做的一切,但它不起作用。我检查了日志,它显示返回值为 1。但仍然显示取消按钮。要检查功能是否正在调用,我将 sleep (10000)放在安装程序上并显示状态,它按预期工作,但显示取消按钮。

最佳答案

隐藏取消按钮

您找到的链接是目前能找到的最权威的链接。它说明了一切,但让我在这里总结一下,以供将来发现此内容的用户使用。

在这样做之前,我们必须问你为什么需要这个?它可能表示应该以其他方式解决的问题才能正确避免。

如何在 MSI 安装期间隐藏“取消”按钮?

  1. msiexec.exe:您可以通过使用 Cancel 命令安装来隐藏 ! 按钮执行基本用户界面级别安装时指定的行选项: msiexec.exe /I Setup.msi /QB-! 。您可以随 MSI 一起提供批处理文件以像这样安装,或在您的分发系统(SCCM 或类似系统)中配置它。

  2. Windows Installer API(在 MSI 外部运行):您可以通过 MSI API COM automation(VBScript 和其他脚本)或 MSI API Win32 installer functions (C++) 调用安装。这里是 VBScript:

    Dim Installer As Object
    Set Installer = CreateObject("WindowsInstaller.Installer")
    Installer.UILevel = msiUILevelBasic + msiUILevelHideCancel
    Installer.InstallProduct "example.msi"
    
  3. 自定义操作(在 MSI 中运行):您可以在安装的实际文件复制期间通过发送 INSTALLMESSAGE_COMMONDATA < 隐藏取消按钮/strong> 讯息:

    Dim rec : Set rec = Installer.CreateRecord(2)
    rec.IntegerData(1) = 2
    rec.IntegerData(2) = 0
    Session.Message 184549376, rec
    

WiX 示例标记

这不是自切片面包以来最伟大的事情,但这里有一些快速的 WiX 标记片段可以插入到您的 WiX 源中。我会再看看这个,但你可以试一试:

您需要编译到 WiX MSI 中的实际 VBScript(同上)。另存为 HideCancel.vbs :

Dim rec : Set rec = Installer.CreateRecord(2)
rec.IntegerData(1) = 2
rec.IntegerData(2) = 0
Session.Message 184549376, rec

以及实际的 WiX 标记(插入到您的主 WiX 项目中):

<Binary Id='HideCancel.vbs' SourceFile='HideCancel.vbs' />
<CustomAction Id='HideCancel.vbs' VBScriptCall='' BinaryKey='HideCancel.vbs' 
              Execute='immediate' Return='ignore'/>

<!-- You can leave out this element -->
<InstallUISequence>
  <Custom Action='HideCancel.vbs' Before='AppSearch' />
</InstallUISequence>

<!-- Required element -->
<InstallExecuteSequence>
  <Custom Action='HideCancel.vbs' Before='AppSearch' />
</InstallExecuteSequence>

如果您在使用 Before='AppSearch' 时遇到问题,可以尝试使用 Before='LaunchConditions'Before='FindRelatedProducts' 。严格来说,您似乎不需要上面的 InstallUISequence 元素。

令人惊讶的是,似乎无法禁用对话框向导中的“取消”按钮(不确定这是否是 WiX 特定的,可能不是),但您可以在安装程序实际运行文件后将其隐藏在安装进度对话框中复制或安装操作本身 - 希望这是您需要的?

如果您还想在设置向导对话框中禁用 Cancel 按钮,那么您需要修改WiX 对话框控件,这需要更多工作。 FireGiant 教程:UI WizardryUser Interface Revisited

关于c++ - 如何隐藏或禁用 WIX 安装程序中的取消按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51893497/

相关文章:

installation - 如何在wix安装程序中添加复选框

c++ - 如何在安装向导中运行我自己的C++源文件?

c++ - 链表插入,指针困惑

c++ - 如何在C/C++中将 double 或浮点型可变数字存储在数组中

c++ - 不对其进行操作时变量更改事件的值

installation - 如何最好地在 WiX 中定义自定义操作?

wix - 如何在使用 WiX 安装期间复制文件夹(而不是文件)?

C++从ifstream中拆分字符串并将它们放在单独的数组中

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

c# - 文件夹权限 : Full control granted to all users