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

Вниз

Построение приложения   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.51 MB
Время: 0.061 c
1-1144325619
DelphiLexx
2006-04-06 16:13
2006.05.21
Половину строки Hint a выделить жирным


15-1145764548
Der Nechk@ssoff
2006-04-23 07:55
2006.05.21
CRC


3-1143615822
vopros
2006-03-29 11:03
2006.05.21
Если requestlive=true будет ли такой запрос доступен для редактир


1-1144770658
Fenix
2006-04-11 19:50
2006.05.21
Вставка многострочного текста в ListView.


2-1146811234
RomanH
2006-05-05 10:40
2006.05.21
Управление DBLookUpComboBox ом