MSI安装被自定义操作DLL中断

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MSI安装被自定义操作DLL中断相关的知识,希望对你有一定的参考价值。

我使用Visual Studio安装项目来创建MSI。我在Orca中编辑了MSI,以便在首次打开时通过DLL执行自定义操作。当我运行MSI时,msiexec记录以下内容:

MSI (c) (E4:BC) [15:28:14:453]: Doing action: CustomAction1
Action 15:28:14: CustomAction1. 
Action start 15:28:14: CustomAction1.
MSI (c) (E4:BC) [15:28:14:453]: Note: 1: 2235 2:  3: ExtendedType 4: SELECT `Action`,`Type`,`Source`,`Target`, NULL, `ExtendedType` FROM `CustomAction` WHERE `Action` = 'CustomAction1' 
MSI (c) (E4:BC) [15:28:14:453]: Creating MSIHANDLE (13) of type 790542 for thread 3260
MSI (c) (E4:B4) [15:28:14:453]: Invoking remote custom action. DLL: C:DOCUME~1USERNA~1LOCALS~1TempMSIA3.tmp, Entrypoint: SampleFunction
MSI (c) (E4:B4) [15:28:14:453]: Closing MSIHANDLE (13) of type 790542 for thread 3260
Action ended 15:28:14: CustomAction1. Return value 3.
MSI (c) (E4:BC) [15:28:14:468]: Doing action: FatalErrorForm
Action 15:28:14: FatalErrorForm. 
Action start 15:28:14: FatalErrorForm.
MSI (c) (E4:BC) [15:28:14:468]: Note: 1: 2235 2:  3: ExtendedType 4: SELECT `Action`,`Type`,`Source`,`Target`, NULL, `ExtendedType` FROM `CustomAction` WHERE `Action` = 'FatalErrorForm' 

然后,安装程序向导将显示错误消息:The installer was interrupted before MyProduct could be installed. You need to restart the installer to try again.

自定义DLL是用C ++编写的。这是源代码:

自定义Action.c ++:

// MyCustomAction.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

BOOL APIENTRY DllMain(HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

UINT __stdcall SampleFunction(MSIHANDLE hModule)
{
        //This is the function that is called by the MSI
        //It is empty because I just want to check that it can be called without interrupting the installer, then I will add the actual functionality
}

MyCustomAction.def:

; MyCustomAction.def
;
; defines the exported functions which will be available to the MSI engine

LIBRARY      "MyCustomAction" 
DESCRIPTION  'Custom Action DLL'

EXPORTS
    SampleFunction

我还在DLL的附加依赖项中引用了msi.lib。当我目前没有明确告诉它做什么时,为什么自定义操作会中断安装?任何帮助,将不胜感激。

更新:

在Orca中,自定义操作位于Binary表中,并且在CustomAction表中是类型1。自定义动作是Immediate,发生在IsolateComponents之后和WelcomeForm表中的InstallUISequence之前。

答案

您应该更新您的代码和帖子,以表明您实际上正在返回ERROR_SUCCESS。无论是否解决问题,关键是要做到这一点是正确的。如果它没有返回值,则调用序列将失败并出现错误。

您的Dll可能因为缺少依赖项而无法加载。如果您在代码中放入一个简单的消息框调用,您至少会看到代码是否真正开始运行。 C ++将需要运行时支持可能尚未在系统上的Dll。

如果事实证明你有依赖于C ++运行时,那么你需要在运行MSI之前安装它们。这就是选择的先决条件 - 它生成一个setup.exe来安装依赖项,然后安装你的MSI。

以上是关于MSI安装被自定义操作DLL中断的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义操作 DLL (MSI/Wix) 中获取“INSTALLED”属性?

MSI安装的数据持久性

在安装vmware vcenter server 5.0 的时候,发现到最后的时候,安装给中断了

自定义操作中的第三方 exe - installshield

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

WIX 自定义卸载操作失败