Как «извлечь информацию о Com» из OCX без InstallShield? - PullRequest
1 голос
/ 09 марта 2012

В одном из проектов, над которым работает наша команда, мы пытаемся создать автоматизированную систему развертывания для существующего настольного приложения.Для этого нам нужно понять, как InstallShield устанавливает приложение для начала.

У нас есть доступ к манифесту InstallShield, но есть файл OCX , который мы не можем выяснить, как установить вручную (без InstallShield).Этот конкретный файл OCX установлен на « Извлечение COM-информации ».

Вот снимок экрана:

InstallShield Properties Dialog

Другие OCX в этом приложении регистрируются самостоятельно, поэтому их можно зарегистрировать с помощью Regsvr32.exe.Но OCX, с которым у нас проблемы, не может быть зарегистрирован таким образом.

Как вручную установить файл OCX, для которого установлено значение «Извлечение информации COM» в манифесте InstallShield?

Ответы [ 2 ]

4 голосов
/ 09 марта 2012

RegSvr32.exe вызывает API LoadLibrary для загрузки вашей DLL, а затем вызывает точку входа DllRegisterServer внутри вашей DLL. Код внутри этой функции выполняет фактическую регистрацию COM. Если RegSvr32 не работает, это обычно означает, что зависимость вашей DLL отсутствует или недействительна.

InstallShield делает все это вместе с очень низким уровнем взлома битов, чтобы виртуализировать все это и затем собрать его. Старая статья на эту тему:

Шпионаж в записях реестра

InstallShield фактически не использует этот метод, скажем так (у них есть несколько методов, большинство из которых не документированы, и различные фильтры и механизмы преобразования для очистки данных). Если вы просто ищете способ сделать это без InstallShield, посмотрите на инструмент командной строки «Heat» XML-файла установщика Windows. Это может "собирать" метаданные COM в XML-элементы WxS.

Также WiX является открытым исходным кодом, поэтому, если вам действительно интересно, вы можете посмотреть их код.

2 голосов
/ 10 марта 2012

Как упоминал Кристофер, InstallShield извлекает информацию COM из вашего .ocx, просматривая то, что она регистрирует, когда вызывается аналогично regsvr32.exe, и будет вызывать ее.Его различные формы перенаправления (для целей захвата) имеют дополнительное преимущество, заключающееся в обходе нескольких потенциальных проблем с разрешениями во время регистрации файла в вашей среде сборки.Однако, если я не пропущу суть вашего вопроса, это «почему regsvr32.exe your.ocx не работает на целевой машине?»

Это немного укол в темноте, как вы не поняли 'т включил достаточно информации.Хотя отсутствующие зависимости могут быть причиной этого, я предполагаю, что вы видите этот сбой только в Windows Vista / Server 2008 или более поздней версии.Если это так, есть большая вероятность, что ваше приложение пытается записать данные в разделы реестра, которые защищены Windows Resource Protection (WRP), или у вас возникла проблема с регистрацией библиотек типов для пользователя.

Когда подпрограмма саморегистрации с плохим поведением сталкивается с WRP, она пытается записать в раздел реестра, который не имеет разрешения на изменение, а затем не проходит всю регистрацию.Я не уверен, что случится с ключами, которые он написал до этого момента, но все те, кто после этого определенно не дойдут до машины.Вы должны быть в состоянии подтвердить, так ли это с таким инструментом, как Process Monitor .

Что вы делаете, если это так?Ну, вы можете придерживаться подхода извлечения, подобного InstallShield (который, как вы говорите, вы хотите оставить).Вы можете исправить файл так, чтобы он не пытался записывать на защищенные ключи (которые, как вы говорите, не можете изменить).Или вы могли бы использовать Application Compatibility Toolkit (ACT) для упрощения работы, но я не понимаю, как вы вообще можете сделать это в нисходящем направлении.Вообще говоря, я бы порекомендовал исправить файл или продолжать использовать рабочий подход.

...