Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.019 c
5-1131963329
GVital
2005-11-14 13:15
2006.05.21
сохранить дерево TreeView с данными


15-1146121485
Darvin
2006-04-27 11:04
2006.05.21
Дальность передачи данных по usb


15-1145972459
dyd
2006-04-25 17:40
2006.05.21
PhpMyAdmin


2-1146589846
except
2006-05-02 21:10
2006.05.21
Открыть с помощью...


2-1146567752
Тимка
2006-05-02 15:02
2006.05.21
listview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский