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

Вниз

Фабрика класса   Найти похожие ветки 

 
dapher   (2005-12-21 16:24) [0]

Здравствуйте!
У меня зачет по визуальному программированию, в частности Delphi. На все вопросы ответил, а вот на один не могу, не имел никогда дела с COM технологиями. Если сможете помочь разобрать этот вопрос по винтикам, буду очень признателен! Вопрос дословно звучит так:
"Что такое фабрика класса? Каково ее назначение? Для каких классов она должна использоваться?"
Заранее огромное спасибо!


 
Набережных С. ©   (2005-12-21 18:42) [1]


> Что такое фабрика класса?

Фабрика класса - это объект класса, предоставляющий методы для создания экземпляров объектов данного класса. Применительно к СОМ - это объект класса, реализующий интерфейс IClassFactory.
Объект класса - это объект, реализующий функциональность, общую для всех экземпляров данного класса. По аналогии с дельфийскими классами, это контейнер для некоторого подобия class function/class procedure. По аналогии с Си - контейнер для статических методов класса.

> Каково ее назначение?

Назначение фабрики - обеспечить функционирование единообразного механизма по созданию экземпляров объектов класса. Например, системная функция CoCreateInstance использует именно фабрики COM-классов для создания экземпляров COM-объектов. Кроме того, наличие фабрики вместо непосредственного создания экземпляра позволяет разработчику класса предпринять какие-то дополнительные действия при создании объектов.

> Для каких классов она должна использоваться?

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

Более подробно и по винтикам этот вопрос описывается в любой книжке по технологии COM, хотя сфера применения фабрик рамками СОМ не ограничиваются.


 
dapher   (2005-12-21 19:54) [2]

Спасибо огромное! =) Вот только еще маленькая просьба, какой нибудь маленький простенький практический примерчик использования этой фабрики...


 
k2 ©   (2005-12-22 06:08) [3]

library ComExample;

uses
 ComServ,
 ComExample_TLB in "ComExample_TLB.pas",
 Unit2 in "Unit2.pas" {ComExample: CoClass};

exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer;

{$R *.TLB}
{$R *.RES}

begin
end.

unit Unit2;

interface

uses
 Windows, ComObj, ActiveX, ComExample_TLB, StdVcl, Registry, Sysutils;

type
 TMyComObject = class(TAutoObject, IComExample)
 protected
   procedure ShowMessage(const MessageString: WideString); safecall;
   { Protected declarations }
 end;

 TMyComObjectFactory = class(TAutoObjectFactory)
 public
   procedure UpdateRegistry(Register: boolean); override;
 end;

implementation

uses ComServ;

procedure TMyComObject.ShowMessage(const MessageString: WideString);
begin
 if MessageString = "" then
   MessageBox(0, "Hello! It""s my com object", "ComExample", 0)
 else
   MessageBox(0, PChar(String(MessageString)), "ComExample", 0);
end;

{ TMyComObjectFactory }

procedure TMyComObjectFactory.UpdateRegistry(Register: boolean);
var
 reg: TRegistry;
 esection: string;
begin
 esection := "Software\Microsoft\Office\Excel\TMyComObject\Options";
 try
   reg := TRegistry.Create;
   reg.RootKey := HKEY_CURRENT_USER;
   if Register then begin
     inherited UpdateRegistry(Register);
     if reg.OpenKey(esection, true) then
       try
         reg.WriteString("Option1", "MyComObjctOption1");
         reg.WriteInteger("Option2", 100);
     finally
       reg.CloseKey;
     end;
     end
   else begin
     reg.DeleteKey(esection);
     inherited UpdateRegistry(Register);
   end;
 finally
   FreeAndNil(reg);
 end;
end;

initialization
 TMyComObjectFactory.Create(ComServer, TMyComObject, Class_ComExample,
   ciMultiInstance, tmApartment);
end.


а использование например в макросе в экселе:
Sub mac1()
Dim come As ComExample.ComExample
Set come = New ComExample.ComExample
come.ShowMessage "My Message"
come.ShowMessage ""
Set come = Nothing
End Sub



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

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

Наверх




Память: 0.48 MB
Время: 0.026 c
15-1183976760
ProgRAMmer Dimonych
2007-07-09 14:26
2007.08.05
Как организовать ShoutCast?


15-1183951544
Тень отца Гамлта
2007-07-09 07:25
2007.08.05
Разминка для мозгов физиков :)


2-1184066302
к2в2
2007-07-10 15:18
2007.08.05
Копирование файла


15-1183886756
ArtemESC
2007-07-08 13:25
2007.08.05
Нет ли у кого МГТС Москвы и Московской области?


4-1172080043
sinir
2007-02-21 20:47
2007.08.05
как распознать 2 мыши на одном компе