我是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)放在安装程序上并显示状态,它按预期工作,但显示取消按钮。
答案 0 :(得分:1)
您找到的链接是最权威的链接。一切都说明了,但是让我在这里为任何发现此问题的未来用户进行总结。
在这样做之前,我们必须问您为什么需要这个?这可能表明应该以其他方式解决该问题,以正确避免该问题。
如何在MSI安装过程中隐藏“取消”按钮?
msiexec.exe: :您可以通过安装 {{ 1}} 在执行基本用户界面级别安装时指定了以下命令行选项: Cancel
。您可以将批处理文件与MSI一起交付,以进行这样的安装,或在分发系统(SCCM或类似系统)中对其进行配置。
Windows Installer API (在MSI外部运行):您可以通过MSI API COM automation(VBScript和其他脚本)或{{3 }}(C ++)。这里是VBScript:
!
自定义操作 (在MSI中运行):您可以通过发送 {{ 1}} 消息:
msiexec.exe /I Setup.msi /QB-!
这不是切成薄片以来最伟大的事情,但是这里有一些快速的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 functions和UI Wizardry。