Зарегистрируйте ActiveX exe-сервер, используя WiX
У меня есть несколько exe-файлов сервера VB6 ActiveX, которые необходимо зарегистрировать при установке, прежде чем их можно будет использовать.
Я пытался использовать Heat для извлечения информации, но он генерирует только элемент файла.
Эти файлы можно зарегистрировать, вызвав их с параметром /regserver, и отменить регистрацию, вызвав их с параметром /unregserver. Я понимаю, что это не правильный путь к этому. Вместо этого я должен добавить ключи реестра и другие необходимые элементы в мой источник wix.
Мой вопрос заключается в том, как мне узнать, какие ключи реестра и другие элементы мне требуются для регистрации этих exe-файлов ActiveX. Видя, как Жара кажется неспособной собрать эту информацию.
5 ответов
У меня была та же проблема с талловым от WiX 2.0 и мне пришлось реализовать сбор реестра для серверов вне процесса. Вот залатанный жир. Было бы неплохо объединить класс ProcessWithInjectedDll с Heat и, возможно, в какой-то момент сходиться к основному стволу.
Помните, что много суеты из среды выполнения VB6 попадает в сгенерированные ключи реестра. Сгенерированный вывод не может быть использован без каких-либо настроек. Именно тогда CleanupRegInclude.vbs может быть полезным.
Наконец, что не менее важно, абсолютные имена файлов и пути бесполезны. Вместо этого вы должны использовать #YourComponent и $YourComponent (см. Документацию MSI).
Как я узнаю, какие ключи реестра и другие элементы мне нужны для регистрации этих exe-файлов ActiveX
В общем, вы можете обнаружить изменения в реестре следующим образом:
Приведите реестр в чистое состояние, например используйте
myapp.exe /unregserver
Создайте дамп содержимого реестра, как это
c:\WINDOWS\system32\reg.exe export dump1.reg
Запустите команду, которая изменит реестр, например
myapp.exe /regserver
Создайте еще один dump2.reg реестра.
Найдите различия между dump1.reg и dump2.reg с помощью инструмента сравнения (например, TortoiseSVN добавляет команду "diff" в контекстное меню проводника, когда выбраны два файла)
В различиях могут быть некоторые шумы, которые вы должны игнорировать. Типичный пример HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\RNG\Seed
, Этот ключ реестра используется Windows CryptoAPI для хранения постоянно собираемой энтропии. Между прочим, этот ключ иногда появляется в пакетах MSI, сгенерированных генераторами коммерческих установок. Кажется, это указывает на то, что они используют похожую технику перехвата реестра:-)
Элементы управления ActiveX являются просто COM-объектами. Минимальная сумма регистрации, которую вам нужно сделать, выглядит примерно так:
<RegistryKey Root="HKCR" Action="createAndRemoveOnUninstall" Key="CLSID\{YOUR-GUID-HERE}">
<RegistryKey Action="createAndRemoveOnUninstall" Key="InprocServer32">
<RegistryValue Action="write" Value="[INSTALLDIR]YOUR-DLL-HERE.dll" Type="string"/>
<RegistryValue Action="write" Name="ThreadingModel" Value="Apartment" Type="string"/>
</RegistryKey>
</RegistryKey>
Вы можете зарегистрировать идентификатор программы:
<RegistryKey Action="createAndRemoveOnUninstall" Key="ProgID">
<RegistryValue Action="write" Value="YOUR.PROGIDHERE" Type="string"/>
</RegistryKey>
Я думал, что Heat.exe был обновлен, чтобы иметь возможность собирать файлы COM EXE, но я думаю, что он еще не был реализован.
Обычно я использую инструмент RegSpy / RegSpy 2 для извлечения информации COM из EXE-файлов DCOM: http://www.installsite.org/pages/en/tt_analyze.htm.
Использование вышеупомянутого инструмента даст вам reg-файл, но вам все равно придется конвертировать его в формат WIX. Чтобы получить файл reg вы идете:
regspy2.exe myfile.exe >> myfile.reg
Я не думаю, что есть способ автоматически преобразовать reg-файл в формат wxs (я помню, как писал базовый конвертер некоторое время назад, но здесь его нет). Чтобы упростить эту задачу, вы можете извлечь необходимую информацию с помощью Installshield или Wise For Windows Installer, собрать MSI, а затем разобрать формат msi в Wix, используя dark.exe (декомпилятор wix). Полученная разметка Wix может быть добавлена в ваш проект.
Я попробовал и высокую температуру, и regspy, упомянутые @Glytzhkof, но обнаружил, что ни одна из них не сделала полного извлечения всей соответствующей информации реестра для моего COM-сервера. Однако я нашел утилиту RegSpyUI, которая поставляется с InstallShield и прекрасно справилась со своей задачей. Более подробно описано здесь.