Разработка COM-приложения Reg-Free с VB6

Я поддерживаю приложение VB6 со многими компонентами COM (DLL и OCX). Чтобы упростить разработку и развертывание, я хотел бы использовать reg-free com. Проблема с разработкой заключается в том, что приложение работает в экземпляре VB6.EXE. Как я могу обмануть VB6, чтобы он использовал мои (незарегистрированные) компоненты? Для меня очень важно, чтобы при переключении между ветвями не приходилось проходить регистрацию / отмену регистрации компонентов. Создание файла .manifest для VB6 не исключено, но есть ли другой, более оптимальный способ указать файл .manifest при запуске VB6.EXE?

Примечание. API контекста активации не помогает, даже если используется из среды разработки.

Решения, которые я подумал:

  • Служебное приложение, которое активирует контекст из манифеста и запускает VB6 как дочерний процесс (не работает; процессы не наследуют контекст активации)
  • Внедрение активации контекста в процесс VB6 при запуске (слишком сложно; для этого необходимо взломать исполняемый файл)
  • Хостинг VB6 в моем собственном процессе после активации правильного контекста (даже не могу узнать, возможно ли это)
  • Использование надстройки VB6 или другой утилиты, которая работает в VB6, для активации контекста (пробовал, но, похоже, не работает)

Обновление 16 января

Как было предложено wqw, я провел некоторое тестирование с VB.exe.manifest. VB6.exe.manifest работал с некоторыми оговорками:

  • DLL SxS, указанная в манифесте, не будет отображаться в окне ссылок в проектах, которые фактически не ссылались на компонент.
  • В проектах, которые ссылались на компонент, он будет отображаться в каталоге в следующем порядке:

    1. The pathname recorded in the project file (if the file was still present)
    2. Путь, как если бы он находился в той же папке, что и проект (vbp)

    Если файл не находится ни в одной из этих папок, проект не будет компилироваться (простой запуск кода вызывает внутреннюю компиляцию в VB6) с сообщением «Не удается найти проект или библиотеку».

Очевидно, что VB6 действительно сканирует реестр в поисках компонентов COM и проверяет во время компиляции, что они существуют там, где, по их словам, они существуют. Я не уверен, что это может означать, если я действительно хочу использовать VB6.exe.manifest для перенаправления создания экземпляра COM-компонента. Возможно, наличие фиктивных файлов компонентов в каком-то заранее определенном месте может заставить VB6 поверить в то, что все в порядке, хотя для использования был загружен совершенно другой набор компонентов.

Дальнейшее обновление:

Я проверил это последнее предположение, и оно оказалось ложным. Компонент должен действительно присутствовать, чтобы проект скомпилировался. Он должен даже правильно загружаться (фиктивные файлы нулевой длины не принимаются!). Теперь я даже не уверен, работает ли манифест. Это более трудоемкий тест (требуется компонент с двумя версиями, которые дают разные результаты, одна для проекта, а другая для манифеста).


person Doc    schedule 09.01.2013    source источник
comment
Вы пробовали ручной файл VB6.exe.manifest для одной DLL / OCX без регенерации? Я не думаю, что это сработает так, как ожидалось.   -  person wqw    schedule 09.01.2013
comment
Вообще-то, нет. Но люди сообщают, что сделали это успешно. Я попробую и вернусь к вам по этому поводу.   -  person Doc    schedule 10.01.2013
comment
Я пытаюсь запустить VB6 с манифестом для отладки dll regfreecom, но при запуске выдает ошибку - каково содержимое вашего vb6.exe.manifest, которое сработало?   -  person Carl Onager    schedule 17.05.2013
comment
@doc У меня работает. было бы хорошо, если бы вы добавили ответ с подробным описанием того, как у вас работает ваш   -  person Carl Onager    schedule 20.05.2013
comment
Большая часть вашей проблемы заключается в том, что вы пытаетесь использовать технологию упаковки и развертывания в качестве технологии разработки.   -  person Bob77    schedule 29.06.2013
comment
@ Bob77 Неплохой способ выразиться   -  person Doc    schedule 16.07.2013


Ответы (1)


Наш подход к этой проблеме состоял в том, чтобы написать вспомогательную программу сборки, которая регистрировала и не регистрировала компоненты, запускала компилятор VB6 и даже перезаписывала файлы проекта с обновленными идентификаторами GUID при изменении интерфейсов. Вы передадите это группе проектов VBG, а она сделает все остальное.

Я полагаю, мы также могли бы добавить режим, который отменяет регистрацию компонентов при переключении веток.

Соблюдаете ли вы практику использования двоичных файлов "совместимости"? Вы не должны использовать двоичный файл в месте сборки для ссылок на совместимость - вы должны передать отдельную копию в систему контроля версий и настроить свой проект так, чтобы он считался «совместимой» версией - изменяйте этот файл только тогда, когда вы нарушаете интерфейсы.

person Adrian    schedule 27.06.2013