Я поддерживаю приложение 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, указанная в манифесте, не будет отображаться в окне ссылок в проектах, которые фактически не ссылались на компонент.
В проектах, которые ссылались на компонент, он будет отображаться в каталоге в следующем порядке:
- The pathname recorded in the project file (if the file was still present)
- Путь, как если бы он находился в той же папке, что и проект (vbp)
Если файл не находится ни в одной из этих папок, проект не будет компилироваться (простой запуск кода вызывает внутреннюю компиляцию в VB6) с сообщением «Не удается найти проект или библиотеку».
Очевидно, что VB6 действительно сканирует реестр в поисках компонентов COM и проверяет во время компиляции, что они существуют там, где, по их словам, они существуют. Я не уверен, что это может означать, если я действительно хочу использовать VB6.exe.manifest для перенаправления создания экземпляра COM-компонента. Возможно, наличие фиктивных файлов компонентов в каком-то заранее определенном месте может заставить VB6 поверить в то, что все в порядке, хотя для использования был загружен совершенно другой набор компонентов.
Дальнейшее обновление:
Я проверил это последнее предположение, и оно оказалось ложным. Компонент должен действительно присутствовать, чтобы проект скомпилировался. Он должен даже правильно загружаться (фиктивные файлы нулевой длины не принимаются!). Теперь я даже не уверен, работает ли манифест. Это более трудоемкий тест (требуется компонент с двумя версиями, которые дают разные результаты, одна для проекта, а другая для манифеста).