Привет всем!
Задача:
Обеспечить возможность использования СOM-компонентов (DLL-серверов) инсталлированных локально в каталоге приложения без (обязательной) предварительной регистрации в реестре.
С такими COM-компонентами должны работать клиенты, написанные с помощью
ATL/MFC.По возможности, должна обеспечиваться поддержка любых других COM-клиентов и
COM-серверов выполняющиеся в адресном пространстве приложения без необходимости внесения изменения в их код, например таких как .NET COM Interop (RCW/CCW в CLR), VB6-контролы, использующие другие ActiveX'ы и т.п.
Операционные системы: Win9x,NT,2000,XP,2003
Мотивация:
упрощение развертывания (включая возможность запуска приложений непосредственно с CD)
решение известных проблем версионности COM
обеспечение возможности одновременной работы с различными версиями ActiveX но с одинаковыми GUID-ами коклассов или progid.
Видимый вариант решения:
Перехват системного CoCreateInstance, по схеме "Detours".
Написание собственного CustomCoCreateInstance, который читает некоторые метаданные хранимые в каталоге .exe (аналогичные по структуре записям реестра для COM-компонентов), если находит информацию — загружает вручную DLL и выполняет цепочку действий для инстанциации COM-объекта и получения интерфейса. В случае отсутствия информации — обращается к системной CoCreateInstance.
Какие будут идеи, замечания, альтернативные предложения, дополнительные мотивации, другие пути решения?
--
Regards, xhalt