Тест завершен успешно, ошибка при загрузке DLL-шлюза, проверьте правильность пути распространения

Обновлено: 07.07.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 правильность экспорта:

MSI DLL

Проверьте DLL-файл MSI: вам следует проверить скомпилированный MSI-файл, чтобы убедиться, что в нем есть правильная DLL-библиотека с правильным экспортом. Следовательно; убедитесь, что DLL благополучно попала в двоичную таблицу MSI:

  1. Откройте скомпилированный файл MSI с помощью Orca (или его аналога).
  2. Двоичная таблица, дважды щелкните столбец данных для записи DLL.
  3. Выберите «Записать двоичный файл в имя файла» и сохраните на рабочем столе (или в другом месте).
  4. Используйте Dependency Walker (depends.exe), чтобы убедиться, что у вас есть допустимая библиотека DLL, как показано на изображении выше. Распространенная проблема заключается в том, что вы вообще не видите экспортов ( MyImmediateCA , MyTestFail , MyTestSuccess и т. д.).
  5. Проверьте версии файла и продукта, а также в свойствах файла.

Обработка ошибок: можно настроить настраиваемое действие для подавления ошибок. Ваша разметка выглядит правильно с установленным атрибутом возврата: (Return='check') . Ваш фрагмент:

Последовательность. Также проверьте правильность последовательности. В целом вам нужно указать на DLL двоичной таблицы, объявить пользовательское действие, а затем также вставить его в правильную последовательность. Макет разметки WiX:

C++ DLL: И собственно C++ DLL (вспомните файл *.def). Фрагмент в нижнем сегменте кода из MSI API Custom Action Security:

Предлагаемые шаги для Visual Studio 2017:

  1. Создайте новый проект DLL VC+ — Dynamic-Link Library (DLL).
  2. Скопируйте приведенный ниже код в основной файл *.cpp (я избегаю dllmain.cpp ).
  3. Добавьте файл *.def!
  • Щелкните правой кнопкой мыши «Исходные файлы» => «Добавить» => «Новый элемент». => Код => Файл определения модуля (.def) => Подойдет любое имя. (допускается только один файл def)
  • Добавьте имена функций экспорта:

Закройте и снова откройте файл, чтобы проверить наличие ошибок формата. Выберите исправить, если появится предупреждение. Думаю, UTF8 без спецификации не требуется.

Еще один ответ по MsiGetProperty (получение значений свойств). В C++ это немного сложнее - с буферами и всем остальным. Прокрутите вниз, чтобы найти исходный код.

Многопоточный /MT

Двоичный файл 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 мс

Найдена основная причина:
------------------------------------------
Недавно обслуживаемый загрузочный двоичный файл поврежден.

Эта тема заблокирована. Вы можете подписаться на вопрос или проголосовать за него как полезный, но вы не можете отвечать в этой теме.

Читайте также: