Как получить список файлов, используемых при установке файла MSI с ExternalUI - PullRequest
0 голосов
/ 10 декабря 2010

Я пишу программу, которая запускает 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-файл с полным интерфейсом, появляется диалоговое окно со списком программ, которые должны быть закрыты, прежде чем установка может быть продолжена.
Как получить этот список и отобразить его пользователю при запуске программы установки без пользовательского интерфейса?

1 Ответ

0 голосов
/ 14 декабря 2010

Эта тема в списке рассылки wix-пользователей предлагает использовать MsiSetExternalUIRecord вместо MsiSetExternalUI, позволяя извлекать имена файлов в полях записи (что соответствует [1], [2].], и так далее).Просто следите за пустыми в середине.Это говорит о том, что эти значения должны быть доступны в szMessage, поэтому мне неясно, почему они не будут видны уже, если, возможно, они не содержат NUL и не завершают строку таким образом.

...