如何在WIX安装程序中隐藏或禁用“取消”按钮?

时间:2018-08-17 10:34:22

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

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

我已经在Google上进行了搜索,但找不到隐藏“取消”按钮的有用链接。我发现了这一点: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)放在安装程序上并显示状态,它按预期工作,但显示取消按钮。

1 个答案:

答案 0 :(得分:1)

隐藏取消按钮

您找到的链接是最权威的链接。一切都说明了,但是让我在这里为任何发现此问题的未来用户进行总结。

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

如何在MSI安装过程中隐藏“取消”按钮?

  1. msiexec.exe: :您可以通过安装 {{ 1}} 在执行基本用户界面级别安装时指定了以下命令行选项: Cancel 。您可以将批处理文件与MSI一起交付,以进行这样的安装,或在分发系统(SCCM或类似系统)中对其进行配置。

  2. Windows Installer API (在MSI外部运行):您可以通过MSI API COM automation(VBScript和其他脚本)或{{3 }}(C ++)。这里是VBScript:

    !
  3. 自定义操作 (在MSI中运行):您可以通过发送 {{ 1}} 消息:

    msiexec.exe /I Setup.msi /QB-!

WiX样本标记

这不是切成薄片以来最伟大的事情,但是这里有一些快速的WiX标记片段可以插入到WiX源中。我会再看一次,但是您可以尝试一下:

您需要编译到WiX MSI中的实际VBScript(与上面相同)。另存为 Dim Installer As Object Set Installer = CreateObject("WindowsInstaller.Installer") Installer.UILevel = msiUILevelBasic + msiUILevelHideCancel Installer.InstallProduct "example.msi"

INSTALLMESSAGE_COMMONDATA

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

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

如果您遇到HideCancel.vbs的问题,请尝试使用Dim rec : Set rec = Installer.CreateRecord(2) rec.IntegerData(1) = 2 rec.IntegerData(2) = 0 Session.Message 184549376, rec <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'元素。

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

如果您还想禁用设置向导对话框中的 Before='LaunchConditions' 按钮,那么您需要修改WiX对话框控件,这需要更多工作。 FireGiant教程MSI API Win32 installer functionsUI Wizardry