Форум: "Corba";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизФабрика класса Найти похожие ветки
← →
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 вся ветка
Форум: "Corba";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c