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 项目中添加了合并模块。
我已经构建了基本项目。
我已经使用新建的安装程序进行安装。
我找不到自定义操作的消息框。这意味着没有执行自定义操作。
我能想到有两件事可能会误导您:
您的合并模块中的操作未被排序或由消费 msi 以其他方式调用。
如果您只是将自定义操作定义添加到合并模块,并且在使用 msi 中没有做任何特别的事情,它不知道什么时候 运行 这些操作。您需要通过编辑 msi 并从合并模块插入操作来安排它。
对于调试,我可能建议将自定义操作(及其调度)直接放在 msi 中,只是为了暂时降低复杂性。
您的自定义操作 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 );
- 您需要先在合并模块项目中创建自定义操作。
- 构建合并模块并在 Basic MSI 项目中添加此合并模块文件。
- 在"Installation Designer"选项卡中提取"Behaviour and Logic"
- 在 "Custom Actions and Sequences" 中的序列中插入自定义操作。
PFA:更多信息的截图。
- 在 "Merge Module Custom Action" 选项中添加自定义操作 "Insert Action"。
PFA:更多信息的截图
- Select 您要在基本项目中添加的自定义操作并单击 "OK"
- 您需要设置 after/before 自定义操作执行的顺序。
之后,
我构建了基本 MSI 项目。
当我执行 setup.exe.
时,自定义操作功能(安装功能)命中
我已经在 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 项目中添加了合并模块。
我已经构建了基本项目。
我已经使用新建的安装程序进行安装。
我找不到自定义操作的消息框。这意味着没有执行自定义操作。
我能想到有两件事可能会误导您:
您的合并模块中的操作未被排序或由消费 msi 以其他方式调用。
如果您只是将自定义操作定义添加到合并模块,并且在使用 msi 中没有做任何特别的事情,它不知道什么时候 运行 这些操作。您需要通过编辑 msi 并从合并模块插入操作来安排它。
对于调试,我可能建议将自定义操作(及其调度)直接放在 msi 中,只是为了暂时降低复杂性。
您的自定义操作 DLL 的入口点可能不是您所想的那样。默认情况下,C++ "decorates" 其函数名称。如果您没有指定原始名称的模块定义文件,或者没有将
extern "C"
应用于函数,它们将被修饰。尝试 运行ningdumpbin /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 );
- 您需要先在合并模块项目中创建自定义操作。
- 构建合并模块并在 Basic MSI 项目中添加此合并模块文件。
- 在"Installation Designer"选项卡中提取"Behaviour and Logic"
- 在 "Custom Actions and Sequences" 中的序列中插入自定义操作。
PFA:更多信息的截图。
- 在 "Merge Module Custom Action" 选项中添加自定义操作 "Insert Action"。
PFA:更多信息的截图
- Select 您要在基本项目中添加的自定义操作并单击 "OK"
- 您需要设置 after/before 自定义操作执行的顺序。
之后, 我构建了基本 MSI 项目。 当我执行 setup.exe.
时,自定义操作功能(安装功能)命中