我在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中添加了合并模块。
我已经建立了基础项目。
我已使用新构建的安装程序安装。
我无法找到自定义操作的消息框。这意味着不会执行自定义操作。
答案 0 :(得分:0)
我可以想到两件可能会让你失望的事情:
合并模块中的操作未按消耗msi排序或以其他方式调用。
如果您刚刚将自定义操作定义添加到合并模块,并且在使用msi时没有做任何特殊操作,则它不知道何时运行这些操作。您需要通过编辑msi并从合并模块插入操作来安排它。
对于调试,我可能会建议将自定义操作(及其调度)直接放在msi中,只是为了暂时降低复杂性。
自定义操作DLL的入口点可能与您的想法不同。默认情况下,C ++"装饰"它的功能名称。如果您没有指定其原始名称的模块定义文件或应用于该函数的extern "C"
,则会对其进行修饰。尝试运行dumpbin /exports customactions.dll
来验证他们的名字。如果它们与您在安装程序项目中输入的内容不匹配,则必须更改其中一个,直到它们为止。
(如果您无法找到它,请使用Visual Studio命令提示符在您的路径上获取dumpbin。或者使用任何其他可以检查DLL导出的工具。)
如果其中任何一个问题适用,您将看不到消息框。但是,如果它只是后者,则当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)