Регистрация COM EXE с помощью WIX - PullRequest
1 голос
/ 01 апреля 2019

Я создал решение с двумя новыми проектами: ATLProject1, который является COM DLL и ATLProject2, который является COM EXE. В оба проекта добавлен один и тот же простой класс с одним методом.

Добавлены оба в проект установки WIX (это существующий проект установки, который уже устанавливает другие библиотеки COM. Я просто использую его для этого теста).

Добавлены следующие строки в product.wxs:

        <Component Id="ATLProject1.dll" Guid="{...}">
          <File Id="ATLProject1.dll" Name="ATLProject1.dll" KeyPath="yes" SelfRegCost="0" Source="$(var.TargetDir)\ATLProject1.dll" />
        </Component>
        <Component Id="ATLProject2.exe" Guid="{...}">
          <File Id="ATLProject2.exe" Name="ATLProject2.exe" KeyPath="yes" SelfRegCost="0" Source="$(var.TargetDir)\ATLProject2.exe" />
        </Component>

, а также

  <ComponentRef Id="ATLProject1.dll" />
  <ComponentRef Id="ATLProject2.exe" />

Файл также имеет следующие строки:

<EnsureTable Id="PublishComponent"/>
<EnsureTable Id="Condition"/>
<EnsureTable Id="TypeLib"/>
<EnsureTable Id="Class"/>
<EnsureTable Id="Extension"/>

При запуске установки я получаю сообщение об ошибке: «Модуль ATLProject2.exe не удалось зарегистрировать. HRESULT -2147024769» (hex 0x8007007f указанная процедура не может быть найдена).

Если я удаляю ATLProject2 из установки, он успешно выполняется, и ATLProject1 правильно регистрируется в реестре (это без генерации информации реестра, например, с использованием тепла, это просто работает).

Должен ли компонент exe обрабатываться по-другому?

Я обнаружил в этом 10-летнем посте, в котором говорится, что heat.exe не рассматривает COM exe как COM . Если это проблема, не уверен, что это все еще так?

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Установщик Windows не рекомендует использовать SelfReg для регистрации во время установки. Вместо этого настоятельно рекомендуется добавить регистрацию в свой код .wxs или захват регистрации во время сборки.

Чтобы добавить регистрацию вручную, вы не используете EnsureTable, вы используете связанные с COM элементы (например, Class, ProgId, TypeLib). Это может быть утомительным, но гораздо более надежным, чем попытка самостоятельной регистрации во время установки.

К сожалению, альтернатива захвата регистрации во время сборки с использованием heat.exe (предоставляется в наборе инструментов WiX) не поддерживает захват из исполняемых файлов. Если вы открыты для коммерческого решения, мы (FireGiant) разработали альтернативу heat.exe, которая может захватывать регистрацию исполняемых файлов (и многое другое). Это расширенное решение для сбора урожая имеет больше документации на сайте FireGiant .

0 голосов
/ 01 апреля 2019

Переключатель RegServer : COM-файлы обычно регистрируются через переключатель /RegServer как:

MyBinary.exe /RegServer

Другими словами, файлы EXE не регистрируются с помощью обычного механизма regsvr32.exe.Это инструмент, используемый для регистрации файлов COM DLL и OCX, но он не обрабатывает файлы EXE.Также имеется переключатель /UnRegServer для отмены регистрации файлов EXE COM - для исполняемых файлов, которые поддерживают /RegServer (which is not all COM EXE files - it could be missing as a feature).

Самостоятельная регистрация : Самостоятельная регистрация не идеальна для регистрации COM-файлов, и вот описание того, почему это так: MSIрегистрация dll - самостоятельная регистрация считается вредной .В MSI извлекаются данные реестра COM и заполняется ряд специальных таблиц COM, позволяющих регистрировать сервер COM таким образом, который поддерживает расширенные функции, такие как откат.Мне также не нравится извлечение COM ( риск проблем с самовосстановлением , больше проблем с самовосстановлением ), но это помогает в большинстве случаев - особенно когда есть зависимости, которыеможет вызвать проблемы с регистрацией.Более того, именно так COM-файлы должны регистрироваться в MSI.Это стандарт.Следует отметить, что некоторые параметры COM все еще входят в таблицу Registry - поскольку для них нет выделенных таблиц, связанных с COM.

heat.exe : WiX's ownheat.exe Утилита теперь может извлекать COM-данные из dll-файлов и ocx-файлов (32-битных).Но, похоже, он не работает для EXE COM-файлов - я не уверен, почему:

heat.exe file MyCOMDll.dll -out MyCOMDll.wxs

RegSpy2.exe : есть инструмент, который вы можете использоватьдля извлечения регистрационной информации COM из файлов DLL , OCX и EXE .Его можно скачать здесь: http://www.installsite.org/files/iswi/RegSpy2.zip. На главной странице перечислены многочисленные инструменты .RegSpy tool написано Филом Уилсоном - экспертом MSI и автором Полного руководства по установке Windows ( APress ).

Вот как извлечь данные COM из исполняемого файла COM (если вы не получили данных, попробуйте сначала отменить регистрацию файла, а затем запустить regspy.exe):

RegSpy.exe MyBinary.exe /RegServer >> RegistryOutput.reg

Экспортированный *.reg file может быть преобразован в элементы WiX.Это не легкий процесс.Использование инструмента WiX heat.exe не заполняет надлежащие таблицы COM, а помещает все в Registry table (что будет работать, за исключением ошибок проверки MSI):

heat.exe reg MyCOMRegistryData.reg -out MyWiXFile.wxs -sfrag -suid

Раньше был инструмент под названием Tallow, который конвертировал reg-файлы в регистрацию COM WiX, но этот инструмент больше нигде не найти.Мне неизвестны какие-либо другие способы его генерации, кроме написания его самостоятельно, загрузки другого инструмента развертывания и импорта данных COM или извлечения и декомпиляции созданного MSI с помощью dark.exe* 1096.* и удалите разметку WiX.Или выясните, как heat.exe записывает свой вывод WiX XML с данными COM и адаптирует его для обработки вывода из RegSpy.exe.

ОБНОВЛЕНИЕ : добавление ссылки на Парафин : https://github.com/Wintellect/Paraffin. Это, предположительно, "лучший жир".Я не уверен, что он поддерживает с точки зрения COM-экстракта.Мой быстрый тест показал, что он вообще не поддерживает извлечение COM, но поддерживает автоматическую генерацию разметки WiX и добавление и удаление файлов для обновлений.

Пользовательские действия : Вы можете зарегистрировать ваш COM EXE с помощью специального действия, которое также вызывает переключатель /RegServer, хотя это не рекомендуется по всем причинам, перечисленным в ссылке выше (Самостоятельная регистрация считается вредной ).


Некоторые ссылки :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...