Тест завершен успешно, ошибка при загрузке DLL-шлюза, проверьте правильность пути распространения
Обновлено: 21.11.2024
У меня есть метод, который проверяет пароль в .dll и должен возвращать код ошибки в случае сбоя. Он имеет следующий прототип:
Я ожидаю, что когда этот метод вернет код ошибки (например, ERROR_INSTALL_USEREXIT = 1602 ), весь процесс установки завершится (никакие другие настраиваемые действия после этого выполняться не будут), но это не так.
Кроме того, в Wix у меня есть следующий фрагмент:
1 Ответ 1
-
(минимальный проект WiX Visual Studio). Рекомендации по быстрому запуску WiX. (для нативного кода/С++ просто подключите отладчик к msiexec.exe ). . .
Предполагаемые причины:
Перечисление некоторых предложений вверху здесь.
- 1 ) Неправильная конфигурация кода настраиваемого действия C++, часто забывают создать файл CA.def для определения экспорта dll. Я также всегда использую __stdcall (MSI — старая девочка).
- 2) Неверный путь к dll настраиваемого действия в разметке WiX (недействительная dll в MSI).
- 3) Забыли включить проверку кодов ошибок в разметке WiX (*.WXS) и тогда ЦС не заканчивает настройку. В вашем случае это выглядит правильно (Return='check') .
- 4 ) Забыли вставить настраиваемое действие в последовательность установки.
- Есть еще несколько, не могу вспомнить о них в данный момент. Может добавить позже. На ум приходят проблемы с разрядностью (x86/64).
- Зависимости файлов и среды выполнения – классическая причина отказов.
- Попробуйте статически связать все, что сможете.
- Библиотеки DLL для развертывания должны быть минимальными зависимостями, поскольку они должны работать в любой системе, на любом языке, в любом состоянии, в любой версии ОС и т. д.
- Один из немногих случаев, когда статическая ссылка действительно рекомендуется и всегда является правильным выбором.
Предостережение: Избегайте лицензирования при установке? Я бы порекомендовал вам поместить проверку лицензии в ваше приложение, а не в настройку. Вот некоторые мысли по этому поводу: Установщик с онлайн-регистрацией для приложений Windows (рекомендуется к прочтению).
Технические проблемы:
FileName.def: я не специалист по C++, но есть ли в вашем проекте файл FileName.def для объявления экспортируемых функций для dll? Если нет - добавьте один (шаги/процедура ниже). Убедитесь, что он в правильном формате (добавьте через Visual Studio, я думаю, что это UTF8 без BOM). Скомпилируйте и проверьте с помощью Dependency Walker правильность экспорта:
Проверьте DLL-файл MSI: вам следует проверить скомпилированный MSI-файл, чтобы убедиться, что в нем есть правильная DLL-библиотека с правильным экспортом. Следовательно; убедитесь, что DLL благополучно попала в двоичную таблицу MSI:
- Откройте скомпилированный файл MSI с помощью Orca (или его аналога).
- Двоичная таблица, дважды щелкните столбец данных для записи DLL.
- Выберите «Записать двоичный файл в имя файла» и сохраните на рабочем столе (или в другом месте).
- Используйте Dependency Walker (depends.exe), чтобы убедиться, что у вас есть допустимая библиотека DLL, как показано на изображении выше. Распространенная проблема заключается в том, что вы вообще не видите экспортов ( MyImmediateCA , MyTestFail , MyTestSuccess и т. д.).
- Проверьте версии файла и продукта, а также в свойствах файла.
Обработка ошибок: можно настроить настраиваемое действие для подавления ошибок. Ваша разметка выглядит правильно с установленным атрибутом возврата: (Return='check') . Ваш фрагмент:
Последовательность. Также проверьте правильность последовательности. В целом вам нужно указать на DLL двоичной таблицы, объявить пользовательское действие, а затем также вставить его в правильную последовательность. Макет разметки WiX:
C++ DLL: И собственно C++ DLL (вспомните файл *.def). Фрагмент в нижнем сегменте кода из MSI API Custom Action Security:
Предлагаемые шаги для Visual Studio 2017:
- Создайте новый проект DLL VC+ — Dynamic-Link Library (DLL).
- Скопируйте приведенный ниже код в основной файл *.cpp (я избегаю dllmain.cpp ).
- Добавьте файл *.def!
- Щелкните правой кнопкой мыши «Исходные файлы» => «Добавить» => «Новый элемент». => Код => Файл определения модуля (.def) => Подойдет любое имя. (допускается только один файл def)
- Добавьте имена функций экспорта:
Закройте и снова откройте файл, чтобы проверить наличие ошибок формата. Выберите исправить, если появится предупреждение. Думаю, UTF8 без спецификации не требуется.
Еще один ответ по MsiGetProperty (получение значений свойств). В C++ это немного сложнее - с буферами и всем остальным. Прокрутите вниз, чтобы найти исходный код.
Двоичный файл C++ в режиме выпуска теперь не должен зависеть ни от каких библиотек DLL среды выполнения MSVC:
Вот скриншот того, как DLL зависит от dll среды выполнения MSVC без этой настройки — не обращайте внимания на красные значки — это древний инструмент обхода зависимостей, который не обновляется для современных зависимостей, но отлично показывает зависимости в старом стиле. :
Обратите внимание, что библиотеки DLL режима отладки могут зависеть от файлов, отличных от двоичных файлов режима выпуска. Двоичные файлы режима выпуска — это те, которые важны. Очевидно, никогда не распространяйте двоичные файлы в режиме отладки!
Найдена первопричина:
------------------------------------------
Восстановление при загрузке пыталась несколько раз, но все равно не может определить причину проблемы.
---------------------------
---------------- -----------
Детали сеанса
-------------
Системный диск = \Device\Harddisk0
Каталог Windows = D:\WINDOWS
Запуск AutoChk = 0
Количество основных причин = 1
Выполнен тест:
------------------------------------------
Название: Проверить наличие обновлений
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Тест системного диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Диагностика сбоя диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 296 мс
Выполнен тест:
------------------------------------------
Название: Тест метаданных диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 594 мс
Выполнен тест:
------------------------------------------
Название: Тест метаданных диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 250 мс
Выполненный тест:
------------------------------------------
Название: Тест целевой ОС
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 63 мс
Выполнен тест:
------------------------------------------
Название: Проверка содержимого тома
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Диагностика диспетчера загрузки
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 1500 мс
Выполнен тест:
-----------------------------------------
Название: Диагностика журнала загрузки системы
>Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Диагностика журнала событий
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Проверка внутреннего состояния
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Проверка наличия установленного LCU
>Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 5218 мс
Найдена основная причина:
------------------------------------------
Недавно обслуживаемый загрузочный двоичный файл поврежден.
---------------------------
---------------- -----------
Детали сеанса
-------------
Системный диск = \Device\Harddisk0
Каталог Windows = D:\WINDOWS
Запуск AutoChk = 0
Количество основных причин = 1
Выполнен тест:
------------------------------------------
Название: Проверить наличие обновлений
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Тест системного диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
------------------------------------------
Название: Диагностика сбоя диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 266 мс
Выполнен тест:
------------------------------------------
Название: Тест метаданных диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 1453 мс
Выполнен тест:
------------------------------------------
Название: Тест метаданных диска
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 187 мс
Выполненный тест:
------------------------------------------
Название: Тест целевой ОС
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 79 мс
Выполнен тест:
------------------------------------------
Название: Проверка содержимого тома
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 984 мс
Выполнен тест:
------------------------------------------
Название: Диагностика диспетчера загрузки
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 0 мс
Выполнен тест:
-----------------------------------------
Название: Диагностика журнала загрузки системы
>Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 31 мс
Выполнен тест:
------------------------------------------
Название: Диагностика журнала событий
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 47 мс
Выполнен тест:
------------------------------------------
Название: Проверка внутреннего состояния
Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 63 мс
Выполнен тест:
------------------------------------------
Название: Проверка наличия установленного LCU
>Результат: завершено успешно. Код ошибки = 0x0
Затраченное время = 10687 мс
Найдена основная причина:
------------------------------------------
Недавно обслуживаемый загрузочный двоичный файл поврежден.
Эта тема заблокирована. Вы можете подписаться на вопрос или проголосовать за него как полезный, но вы не можете отвечать в этой теме.
Читайте также: