Установщик Windows: MsiDoAction () возвращает ERROR_FUNCTION_NOT_CALLED - PullRequest
0 голосов
/ 24 февраля 2011

Я пишу загрузчик для продукта с несколькими предпосылками. Чтобы определить, какие предварительные требования для установки, я использую MSI AppSearch.

Загрузчик открывает пакет myproduct.msi с ::MsiOpenPackageEx(), затем вызывает ::MsiDoAction("AppSearch") для загрузки свойств и, наконец, выбирает интересующие свойства, чтобы определить, какие предварительные требования требуют загрузки. Затем я закрываю сеанс prereqs (::MsiCloseHandle()), чтобы он не мешал сеансам MSI, используемым установщиками prereqs. В конечном итоге (после установки предварительных требований) загрузчик запускает msiexec /i myproduct.msi.

Я хочу расширить это, вызвав настраиваемое действие ::MsiDoAction("MyExtendedAppSearch"), которое заполняет дополнительные свойства MSI во время сеанса prereqs, используя WMI для поиска, который MSI AppSearch не может выполнить. Однако когда я вызываю это действие, оно возвращает ERROR_FUNCTION_NOT_CALLED. То же действие, когда оно вызывается в сеансе установки real , работает просто отлично.

Я пробовал это как с C .dll, так и с VBScript (встроенный, таблица Binary, не имеет значения). По-видимому, в реальной установке выполняется какая-то инициализация, которой я не делаю. Также или альтернативно, я не устанавливаю правильные биты флага в действии, или должен планировать его в InstallExecuteSequence (или нет, или что-то в этом роде).

Ваше руководство будет высоко ценится. Заранее спасибо.

1 Ответ

1 голос
/ 28 февраля 2011

@ Cosmin Pirvu: это не запланировано вообще, ни в какой таблице последовательности.Он существует только в таблице CustomAction и явно вызывается программой-цепочкой.

Неважно, ребята.Программист ложной тревоги / неаккуратного обращения.

Мета-решение: внимательно прочитайте код вашего предшественника и еще более внимательно прочитайте документы.

Решение: ::MsiOpenPackageEx() вызывается с флагом MSIOPENPACKAGEFLAGS_IGNOREMACHINESTATE,Согласно документации MSI, использование этого флага возвращает ограниченный дескриптор сеанса, который не может вызывать пользовательские действия .dll, .exe или сценария.

Не , передающий этот флаг -или, что эквивалентно, вызов ::MsiOpenPackage() (без Ex) - возвращает неограниченный дескриптор, который может .dll, .exe или настраиваемые действия сценария.

...