Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ссылка на кокласс внутри другого кокласса [D7, WinXP]


Цукор5 ©   (2006-07-29 02:35:00) 

Навеяно http://www.delphimaster.ru/cgi-bin/forum.pl?id=1153992363&n=0.Давно хотел сделать нечто подобное.

Делаю так :

type
 TPapa = class(TAutoObject, IPapa)
 protected
   function GetCoClass: IFirst; safecall;
   procedure ExecCoClass; safecall; // это от безисходности
 end;
 //
 TFirst = class(TAutoObject, IFirst)
 protected
   procedure Beep; safecall;
 end;

implementation

uses ComServ;

function TPapa.GetCoClass: IFirst;
begin
 Result:=(TFirst.Create) as IFirst;
end;

{ TFirst }

procedure TFirst.Beep;
begin
 Windows.Beep(800,50);
end;

procedure TPapa.ExecCoClass; // это от безисходности
 var Obj:TFirst;
begin
 Obj:=TFirst.Create;
 Obj.Beep;
 //Obj.Free;
end;


Вызываю так :

var Q,QQ:Variant;
begin
 Q:=CreateoleObject('Bla.bla');
 try
   QQ:=Q.GetCoClass;
   QQ.Beep;
   //Q.ExecCoClass; так тоже не работает.  
 finally
   Q:=UnAssigned;
 end;


Получаю EOLEException: Object factory for class TFirst missing

Что сделано неверно ???


Slym   (2006-07-31 11:09:00) [1]

type
 IProp = interface
   ['{9FFD3789-9199-4B22-A96D-BE0837916574}']
   procedure Beep; safecall;
 end;

 IObj = interface
   ['{7C5DE710-DB30-41EA-B1FF-F7BF43C06380}']
   function GetProp: IProp; safecall;
 end;

 TProp = class(TInterfacedObject, IProp)
 protected
   procedure Beep; safecall;
 end;

 TObj = class(TInterfacedObject, IObj)
 protected
   FProp: TProp;
   function GetProp: IProp; safecall;
 public
   constructor Create;
   destructor Destroy; override;
 end;

implementation

{ TProp }

procedure TProp.Beep;
begin
 Windows.Beep(800,50);
end;

{ TObj }

destructor TObj.Destroy;
begin
 FProp._Release;
 inherited;
end;

function TObj.GetProp: IProp;
begin
 result:=FProp as IProp;
end;

constructor TObj.Create;
begin
 FProp:=TProp.Create;
 FProp._AddRef;
 inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var Obj:IObj;
begin
 Obj:=TObj.Create as IObj;
 Obj.GetProp.Beep;
 Obj.GetProp.Beep;
 Obj.GetProp.Beep;
end;


Цукор5   (2006-07-30 22:04:00) [2]

Вопрос еще актуален...


Цукор5   (2006-07-29 02:38:00) [3]

>Q:=CreateoleObject('Bla.bla');
Вернее так : CreateOleObject('Bla.Papa');

Не принципиально... на всякий случай слепил пару методов в IPapa и проверил их работоспособность. Все Ок. Ошибка только при связи на IFirst.


Наверх

Титульная страница Поиск, карта сайта Написать письмо