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

时间:2017-01-19 14:12:38

标签: dll installshield merge-module

我在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 Project中添加了合并模块。

我已经建立了基础项目。

我已使用新构建的安装程序安装。

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

installshield

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

3 个答案:

答案 0 :(得分:0)

我可以想到两件可能会让你失望的事情:

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

    如果您刚刚将自定义操作定义添加到合并模块,并且在使用msi时没有做任何特殊操作,则它不知道何时运行这些操作。您需要通过编辑msi并从合并模块插入操作来安排它。

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

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

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

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

答案 1 :(得分:0)

  

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

msiexec不会执行C ++ MessageBox。无论你把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的Message Box,而不是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 );

答案 2 :(得分:0)

  1. 您需要先在合并模块项目中创建自定义操作。
  2. 构建合并模块,并在Basic MSI Project中添加此合并模块文件。
  3. 在“安装设计器”选项卡中提取“行为和逻辑”。
  4. 在“自定义操作和序列”中的序列中插入自定义操作。
  5. PFA:屏幕截图了解更多信息。 Insert Custom Action

    1. 在“插入操作”中的“合并模块自定义操作”选项中添加自定义操作。
    2. PFA:屏幕截图了解更多信息 enter image description here

      1. 选择要在基本项目中添加的自定义操作,然后单击“确定”
      2. 您需要在自定义操作执行之后/之前设置哪些序列。
      3. 之后, 我建立了基础MSI项目。 执行setup.exe时命中了自定义动作功能(安装功能)。