如何在使用ExternalUI安装MSI文件时获取正在使用的文件列表

时间:2010-12-10 11:45:23

标签: c++ windows windows-installer

我正在写程序女巫在背景上运行msi安装。使用MsiSetExternalUI和MsiSetInternalUI与INSTALLUILEVEL_NONE我可以在安装过程中显示我的进度对话框并捕获错误:

INT CALLBACK ProgressHandler(LPVOID pvContext, UINT uiMessageType, LPCTSTR szMessage)
{
    INSTALLMESSAGE iMessage = (INSTALLMESSAGE)(0xFF000000 & uiMessageType);
    if( INSTALLMESSAGE_PROGRESS == iMessage )
        ShowProgress(...);
    if( INSTALLMESSAGE_FILESINUSE == iMessage )
        MessageBox(NULL, szMessage, _T("Files in use"), MB_OK);
}
...
DWORD dwMessageFilter = INSTALLLOGMODE_PROGRESS | INSTALLLOGMODE_FILESINUSE;
MsiSetExternalUI(&ProgressHandler, dwMessageFilter, NULL);
INSTALLUILEVEL pervousUILevel = MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
UINT res = MsiInstallProduct(sPath, NULL);

问题在于,当某些文件正在使用时,我的回调会收到INSTALLMESSAGE_FILESINUSE消息,但szMessage参数仅包含此文本 - “在继续安装之前应关闭以下应用程序:”。如果我使用完整界面运行msi文件,则在安装可以继续之前有必须关闭的程序列表对话框 如何在没有UI的情况下运行安装程序时,如何获取此列表并将其显示给用户?

1 个答案:

答案 0 :(得分:0)

This thread in the wix-users mailing list建议使用MsiSetExternalUIRecord代替MsiSetExternalUI,可以检索记录字段中的文件名(对应于[1],[2]等) 。请注意中间空的。这表明这些值应该在szMessage中可用,所以我不清楚为什么它们不会可见,除非它们包含NUL并以这种方式结束字符串。