Форум: "Corba";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
ВнизПостроение приложения Найти похожие ветки
← →
kblc © (2005-06-12 20:23) [0]Здраствуйте уважаемые мастера.
Недавно я занялся проектированием приложения, но столкнулся с множеством проблем. Мои мысли и ваши советы привели меня на то, что я должен в своём приложении использовать COM технологию, с которой я знаком не так уж и сильно.
Поэтому я бы хотел спросить вашего совета по поводу "как такое реализовать?".
Смысл программы приблизительно в следующем:
1) существует приложение, которое начинает загрузку (инициализацию) и отображает ход этой самой загрузки
2) это приложение загружает в память мои классы-серверы (я их просто так назвал): сервер логов, сервер криптографии, сервер переменных, снрвер библиотек. (все они унаследованы от одного класса TServer)
немного опишу их:
сервер логов: просто ведёт лог, т.е. записывает в файл то, что ему передают в качестве параметра (TServer.ExecFunc(const Param: string))
сервер гриптографии: зашифровывает/расшифровывает строки
сервер переменных: загружает переменные из реестра, имеет возможность добавлять, изменять, удалять переменные (данные переменные доступны для сервера библиотек), перед уничтожением сохраняет их в реестр.
сервер библиотек: сканирует директорию на наличие библиотек, инициализирует их. Библиотек имеют сво-во Type которое означет: "Загрузчик/Клиент/Плагин". Загружает "загрузчик". Загрузчик в свою очередь принимает на себя работу. Он выдаёт список "клиенто" и "плагинов", нажав на иконку которых он (клиент/плагин) запускаеться.
(это всё было реализовано в версии, где я не использовал COM).
Не могли бы вы помочь мне, посоветовать КАК это реализовать при помощи COM.
Очень жду ваших советов.
← →
-=XP=- © (2005-06-14 10:13) [1]Спроектировать интерфейсы для всех этих "серверов".
Привязать (и реализовать) эти интерфейсы к соответствующим классам (свой интерфейс - к своему "серверу").
Потом - только создавать экземпляры классов, запрашивать у них интерфейс - и пользоваться, не вникая в подробности реализации.
Ответить на Ваш вопрос в двух словах невозможно.
COM - это идеология.
Найдите хорошую книгу по COM, или почитайте статьи в интернете - много интересного найдете.
Удачи! :о)
← →
kblc © (2005-06-15 06:30) [2]Я бы хотел задать ещё 4 вопроса:
1) А можно ли использовать один интерфэйс и от него уже наследовать классы?
2) Нужна ли для этих классов регистрацияComFactory.Create(***)
? или можно просто и легко всё сделать без неё (скажем унаследовать класс от(TInterfacedObject,*)
)
3) И как потом получить список МОИХ зарегестрированных серверов? я не хочу заранее "знать" все GIUD"ы серверов, я хочу что бы они сами "определялись/находились". Как это сделать?
4) Что бы вы посоветовали к прочтению про СОМ технологию? книги, статьи, авторы ?
← →
-=XP=- © (2005-06-15 11:59) [3]1) А можно ли использовать один интерфэйс и от него уже наследовать классы?
Классы от интерфейсов не наследуются. Классы могут реализовывать интерфейс. Грубо говоря, в описании класса должно быть указано, что он реализует какой-то интерфейс. Тогда компилятор затребует наличия всех методов этого интерфейса, причем объявленых только так, как это задекларировано в интерфейсе. Что эти реальные методы класса будут делать - это уже Ваша забота, как разработчика. Хоть пустые методы. Хоть абстрактные. Но рекомендуется (во избежание избиения пользователями), чтобы выполняемые ими действия соответсвовали контексту интерфейса. :)
Кроме требуемых, в классе может быть сколько угодно прочих методов, и как угодно реализованных. Важно, чтобы присутствовали методы, объявленные в интерфейсе.
Интерфейсы, как и классы, поддерживают наследование.
Класс может реализовывать несколько интерфейсов - соответственно, для каждого интерфейса должны быть обеспечены методы. Один метод может разделяться несколькими интерфейсами.
Чтобы Вам было понятнее, интерфейс - эдакая маска, трафарет, накладываемый на экземпляр класса. (Как в притче про трех слепых и слона: "Слон - как шланг",- сказал один, взявшись за хобот; "Слон - как дерево",- сказал другой, взявшись за ногу; "Слон - как веревка", - сказал третий, взявшись за хвост. У каждого слепого - свой интерфейс ;).
2) Нужна ли для этих классов регистрация ComFactory.Create(***)? или можно просто и легко всё сделать без неё (скажем унаследовать класс от (TInterfacedObject,*))
Регистрировать никто не заставляет. Можете использовать как Вам заблагорассудится. Создали экземпляр класса, запросили у него интерфейс - и вперед!
3) И как потом получить список МОИХ зарегестрированных серверов? я не хочу заранее "знать" все GIUD"ы серверов, я хочу что бы они сами "определялись/находились". Как это сделать?
Да как угодно. И они не обязательно должны быть зарегистрированными. Хоть сканируйте папку на факт наличия библиотек, загружайте их в память и создавайте из них экземпляры, поддерживающие требуемый интерфейс. На Вас не накладывается никаких обязательств, за исключеним описанных в 1 (класс должен полностью реализовывать декларированные в интерфейсе методы).
4) Что бы вы посоветовали к прочтению про СОМ технологию? книги, статьи, авторы ?
Поищите на http://www.podgoretsky.com. Сам не смотрел, но говорят, много полезной и хорошей компьютерной литературы и не только (А реклама-то запрещена :).
← →
just_me (2005-06-15 12:40) [4]3) И как потом получить список МОИХ зарегестрированных серверов?
При использовании COM лучший способ группировки компонентов с целью их быстрого нахождения - использование COM component categories, можно почитать тут: http://www.techvanguards.com/com/tutorials/plugin.asp
Вообще по адресу http://www.techvanguards.com есть много полезного материала по использованию COM
← →
kblc © (2005-06-15 13:16) [5]А правильно ли будт если я сделаю так:
type
и т.д.
IIserver = interface
["**"]
...
end;
TServer = class(TInterfacedObject, IServer)
...
private
...
public
...
end;
TLogServer = class(TServer)
....
TCryptServer = class(TServer)
а в библиотеке просто дописатьfunction GetServer: TServer;
begin
Result:=TLogServer.Create;
end;
я прав?
← →
kblc © (2005-06-15 13:18) [6]Забыл:
function GetServer: TServer; stdcall;
begin
Result:=TLogServer.Create;
end;
exports
GetServer;
← →
just_me (2005-06-15 17:01) [7]Можно, но это уже не СОМ, а просто экспорт класса из динамической библиотеки
← →
-=XP=- © (2005-06-15 17:03) [8]
function GetServer: IServer;
begin
Result := TLogServer.Create;
end;
← →
kblc © (2005-06-16 06:20) [9]2XP:
значит позже эту функцию на export? я так понимаю?
← →
-=XP=- © (2005-06-16 10:03) [10]Да
← →
kblc © (2005-06-16 12:07) [11]а вот такой ещё вопрос... захочу я
IServer
"у передать адрес наTBitmap
.. а он этот адресTBitMap(addr)
... произойдёт ли ошибка вроде той, что у меня была:Cannot assigned TBitmap as TBitmap?
← →
-=XP=- © (2005-06-16 13:23) [12]Не используйте при работе с библиотекаи VCL классы - до добра это не доведет. Используйте при работе с интерфейсами (передаваемые в методы и получаемые из методов значения) простые типы данных или другие интерфейсы.
Хотите Bitmap - используйте HBITMAP, или поток (возможны варианты), или какое-то другое решение. Сделайте, в конце концов, свой какой-то IBitmap и опишите в нем требуемую функциональность.
Страницы: 1 вся ветка
Форум: "Corba";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.013 c