Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Программный выбор dll с com-классами   Найти похожие ветки 

 
hellmachine   (2003-11-27 11:50) [0]

Добрый день, мастера! Есть несколько библиотек, с одним com-классом в каждой; каждый com-класс реализует один и тот же интерфейс (имя, guid задан). Вопрос: возможно ли в run-time выбирать библиотеку и создавать экземпляр com-класса, описанного в ней? И что кроме пути к библиотеке нужно обязательно знать о создаваемом ком-классе?


 
me   (2003-11-27 13:56) [1]

Это противоречит концепции СОМ - каждый СОМ-сервер должен реализовать СВОЙ интерфейс и регистрировать его в системном реестре (так что на один guid не "повесить" хотя бы два сервера). И как раз о пути к серверу клиент ничего не знает - СОМ-среда все ещет и грузит сама, глядя в рестр.


 
hellmachine   (2003-11-27 14:47) [2]

ты не понял; guid задан для абстрактного интерфейса, который реализует каждый из набора классов; разумеется, у каждого класса в наборе будет свой guid - связывать их будет только то, что они реализуют(implements) общий интерфейс;

задача - каким-то образом определить доступные(зарегистрированные) классы и выбрать один из них;


 
Nikolay M. ©   (2003-11-27 15:25) [3]

Это случайно не похоже на сосуществование нескольких версий офиса?
Excel.Application.8, Excel.Application.9 и проч., а Excel.Application - по умолчанию последняя версия?


 
hellmachine   (2003-11-27 16:40) [4]

нет; попытаюсь объяснить еще раз:
Допустим, есть простое приложение, которое должно вычислять какую-то функцию. Предположим мы хотим обобщить это приложение таким образом, чтобы оно вычисляло несколько разных функций, причем таким образом, что на этапе компиляции приложения мы не будем знать, какие это будут функции. Тогда делаем следующим образом: договариваемся какие аргументы будет принимать функция и какие возвращать, помещаем функцию в динамическую библиотеку, кладем библиотеку в оговоренный каталог. Приложение на запуске просматривает оговоренный каталог, выбирает все dll и вызывает функцию из них, использую «явный вызов».
В моем случае, надо организовать что-то подобное, только вместо функции будет класс. Поэтому я выбрал технологию com. Создал общий класс с интерфейсом, затем несколько разных классов, которые реализуют интерфейс общего класса (в других библиотеках). Теперь стоит следующая проблема: что надо оговорить, чтобы находить библиотеки с классами, реализующие этот интерфейс и создавать представители классов, описанных в них.


 
dimmu   (2003-11-27 16:43) [5]

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


 
me   (2003-11-27 17:11) [6]

Если имеется возможность разрабатывать все это в рамках СОМ, то можно использовать COM Components Categories - подробности в MSDN


 
Бином Ньютоныч   (2003-11-27 17:14) [7]

Интерфейс у них один, но clsid - то разный. А его-то и надо указывать в CoCreateInstance. Али чего?
Но можно и конкретную реализацию если есть несколько либ с классами с одинаковыми clsid: LoadLibrary + DllGetClassObject..


 
hellmachine   (2003-11-27 18:26) [8]

Да действительно; Я вроде начал постепенно разбираться как это должно работать;

Я подключил _TLB от общего класса, и программно подменяю ClassId в CreateComObject();

Осталось решить проблему как искать библиотеки, реализующие заданный интерфейс. Можно конечно самому в реестре ClassId посмотреть и записать их в .ini, но уж больно неэлегантно :)

Посоветуете что-нибудь по поиску?


 
Бином Ньютоныч   (2003-11-27 18:46) [9]

А вот тут как раз Components Categories будут к месту, по категории и будешь считывать. Хотя можешь и в свою ветку реестра заодно записывать классы при регистрации, смотри ClassFactory.Updateregistry. Но я бы сделал стандартно, через Components Categories, в системе все уже есть.


 
Саша   (2003-11-28 21:11) [10]

А реализация нескольких интерфейсов для одного объекта не подойдет?
А если функции одинаковые, но различие в параметрах, не про ще ли воспользоваться перегрузкой?



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
14-1100779938
Baks
2004-11-18 15:12
2004.12.05
Кнопки


14-1100775154
syte_ser78
2004-11-18 13:52
2004.12.05
С первым снегом, харьковчане!


6-1096520266
Slonco
2004-09-30 08:57
2004.12.05
Как заставить сетевой комп запустить приложение командой сервера?


1-1100685529
Lola
2004-11-17 12:58
2004.12.05
Вывести список файлов из папки, в имени которой есть побел


1-1100808505
xkiller
2004-11-18 23:08
2004.12.05
Как программно свернуть popupmenu?