MSI DLL 自定义操作在 installshiled 中运行不正常

MSI DLL Custom Actions is not working well in installshiled

我已经在 InstallShield 2014 中创建了合并模块项目。

我在使用 CustomActions.dll 中添加了自定义操作。

此 CustomAction dll 具有安装功能。

示例:customactions.dll

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

UINT __stdcall Install ( MSIHANDLE hModule )
{
MessageBox(NULL, "Hello world", "CustomAction", MB_OK);
return ERROR_SUCCESS;
}

UINT __stdcall SampleFunction2 ( MSIHANDLE hModule )
{
MessageBox(NULL, "Hello world", "CustomAction", MB_OK);
return ERROR_SUCCESS;
}

之后,

我已经构建了合并模块项目。

我在 Basic MSI 项目中添加了合并模块。

我已经构建了基本项目。

我已经使用新建的安装程序进行安装。

我找不到自定义操作的消息框。这意味着没有执行自定义操作。

图像:https://i.imgsafe.org/0ca963f930.png

我能想到有两件事可能会误导您:

  1. 您的合并模块中的操作未被排序或由消费 msi 以其他方式调用。

    如果您只是将自定义操作定义添加到合并模块,并且在使用 msi 中没有做任何特别的事情,它不知道什么时候 运行 这些操作。您需要通过编辑 msi 并从合并模块插入操作来安排它。

    对于调试,我可能建议将自定义操作(及其调度)直接放在 msi 中,只是为了暂时降低复杂性。

  2. 您的自定义操作 DLL 的入口点可能不是您所想的那样。默认情况下,C++ "decorates" 其函数名称。如果您没有指定原始名称的模块定义文件,或者没有将 extern "C" 应用于函数,它们将被修饰。尝试 运行ning dumpbin /exports customactions.dll 来验证他们的名字。如果它们与您在安装程序项目中输入的内容不匹配,您将不得不更改一个或另一个,直到它们匹配为止。

    (如果找不到路径,请使用 Visual Studio 命令提示符获取 dumpbin。或者使用任何其他可以检查 DLL 导出的工具。)

如果出现这些问题中的任何一个,您将看不到消息框。但是,如果只是后者,当 Windows Installer 找不到入口点时,您应该会看到一个错误。详细的日志可以帮助澄清这一点;如果前者适用,您必须搜索它以查找缺少自定义操作调用。

I am unable to found message-box of custom action. it means custom action is not executed.

C++ MessageBox 不会被 msiexec 执行。无论您将 CustomAction.dll 放在哪里,您都不会看到消息框。这不是确定您的 CA 是否被触发的方法。您的选择是:

最好的方法 是监视详细的安装日志。如果您的 CA 被触发,您会在日志中看到。

在您的 CA 中使用日志记录。以下函数会将 CA 消息记录到 MSI 日志中:

void HelperMsiWriteLog( MSIHANDLE hInstall, LPCWSTR pszMsg )
{
  PMSIHANDLE hRecord = MsiCreateRecord(1);
  MsiRecordSetStringW( hRecord, 0, L"CA Log: [1]" );
  MsiRecordSetStringW( hRecord, 1, pszMsg );
  MsiProcessMessage( hInstall, INSTALLMESSAGE_INFO, hRecord );
}

您可以在您的 CA 函数中调用它,如下所示:

HelperMsiWriteLog( hInstall, L"my CA log message" );

您当然可以使用消息框,但这将是来自 MSI 的消息框,而不是 C++ 消息框。以下函数将生成消息框:

UINT HelperMsiMessageBox( MSIHANDLE hInstall, LPCWSTR pszMsg, DWORD dwOptions )
{
  PMSIHANDLE hRecord = MsiCreateRecord(1);
  MsiRecordSetStringW( hRecord, 0, L"[1]" );
  MsiRecordSetStringW( hRecord, 1, pszMsg );
  return MsiProcessMessage( hInstall, INSTALLMESSAGE( INSTALLMESSAGE_USER | dwOptions ), hRecord );
}

您可以在您的 CA 函数中调用它,如下所示:

HelperMsiMessageBox( hInstall, L"my CA messagebox message", MB_ICONWARNING | MB_OK );
  1. 您需要先在合并模块项目中创建自定义操作。
  2. 构建合并模块并在 Basic MSI 项目中添加此合并模块文件。
  3. 在"Installation Designer"选项卡中提取"Behaviour and Logic"
  4. 在 "Custom Actions and Sequences" 中的序列中插入自定义操作。

PFA:更多信息的截图。

  1. 在 "Merge Module Custom Action" 选项中添加自定义操作 "Insert Action"。

PFA:更多信息的截图

  1. Select 您要在基本项目中添加的自定义操作并单击 "OK"
  2. 您需要设置 after/before 自定义操作执行的顺序。

之后, 我构建了基本 MSI 项目。 当我执行 setup.exe.

时,自定义操作功能(安装功能)命中