如果您说明您使用的语言会有所帮助...
如果您使用的是托管代码...请注意限制(以下引用自 WiX 文档)
在选择使用托管代码而不是传统的本机 C++ 代码编写自定义操作之前,您应该仔细考虑以下事项:
显然,它引入了对 .NET Framework 的依赖。您的 MSI 包可能应该有一个 LaunchCondition 以在发生其他任何事情之前检查是否存在正确版本的 .NET Framework。
如果自定义操作在卸载时运行,那么如果 .NET Framework 不存在,即使您的产品卸载也可能会失败。这意味着如果用户在您的产品之前卸载 .NET Framework,他们可能会遇到问题。
托管自定义操作应配置为针对特定版本的 .NET Framework 运行,并且该版本应与您的实际产品运行的版本相匹配。允许版本“浮动”到最新安装的 .NET Framework 可能会导致与未来版本的兼容性问题。.NET Framework 提供并行功能是有充分理由的——使用它。
此外,您还应该阅读为什么VBScript(和 JScript)MSI CustomActions 很烂
无论如何,忽略所有这些......这是我很久以前在某处找到的用于记录的一些示例 C++ 代码。您可能能够找出应该以您选择的语言调用的正确函数。
#define _USE_RTM_VERSION
void LogString(MSIHANDLE hInstall, TCHAR* szString)
{
PMSIHANDLE newHandle = ::MsiCreateRecord(2);
TCHAR szTemp[MAX_PATH * 2];
sprintf_s(szTemp, MAX_PATH * 2, "-- MSI_LOGGING -- %s", szString);
MsiRecordSetString(newHandle, 0, szTemp);
MsiProcessMessage(hInstall, INSTALLMESSAGE(INSTALLMESSAGE_INFO), newHandle);
}
UINT __stdcall MyCustomAction ( MSIHANDLE hModule )
{
LogString(hModule, "Whoa! I am a custom action..");
return ERROR_SUCCESS;
}