Ver Mensaje Individual
  #11  
Antiguo 12-02-2007
Flecha Flecha is offline
Miembro
 
Registrado: nov 2006
Posts: 59
Reputación: 18
Flecha Va por buen camino
Cita:
Empezado por mamcx
Deriva las clases de TInterfacedObject y todo bien.

La implementacion que has hecho no funciona con interfaces porque anulaste el sistema de liberacion de memoria!

Gracias por el consejo. No conocía la clase TInterfacedObject, y si te soy sincero tampoco sé muy bien para qué son el QueryInterface, _AddRef, y _Release. Además, eso que comentas de anular el sistema de liberación de memoria la verdad es que me asusta un poco.

No obstante, he mirado en la ayuda de Delphi y creo que no me será necesario usar el TInterfacedObject. De todos modos, por si acaso me equivoco en algo, te mostraré con más detalle lo que tengo y si ves algo que creas que esta mal no dudes en corregirme, ¿vale?

Código Delphi [-]
TYPE

   TClaseBase = class
   private
      ...
   protected
      ...
   public
      ...
   end;

   TMiInterface = interface
      procedure Metodo;
      ...
   end;

   TClasePadre = (TClaseBase, TMiInterface)
   private
      function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
      function _AddRef: Integer; stdcall;
      function _Release: Integer; stdcall;
      ...
   protected
      procedure Metodo; virtual; abstract;
      ...
   public
      procedure Ejecutar;
   end;

   TClaseHijo = (TClasePadre)
   private
      ...
   protected
      procedure Metodo; override;
      ...
   public   
   end;

function TClasePadre.QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
begin
  inherited;
end;
 
function TClasePadre._AddRef: Integer; stdcall;
begin
  inherited;
end;
 
function TClasePadre._Release: Integer; stdcall;
begin
  inherited;
end;
 
procedure TClasePadre.Ejecutar;
begin
  ...
  Metodo;
  ...
end;

Muy resumidamente, es eso lo que yo tengo hecho. En la ayuda de Delphi he visto que TInterfacedObject está declarada de la siguiente manera:

Código Delphi [-]
type
 TInterfacedObject = class(TObject, IUnknown)
 private
   FRefCount: Integer;
 protected
   function QueryInterface(const IID: TGUID; out Obj): Integer; stdcall;
   function _AddRef: Integer; stdcall;
   function _Release: Integer; stdcall;
 public
   property RefCount: Integer read FRefCount;
 end;

Mi clase TClasePadre desciende de TClaseBase (la cual por definición desciende de TObject), y del interface TMiInterface (que desciende de IUnknown). Por tanto entiendo que TClasePadre termina heredando todo lo que necesita de TInterfacedObject, excepto el RefCount.

¿Qué opinas? ¿Necesitaré el RefCount para algo? Cuando compilo, Delphi no me pide que incluya el RefCount dentro de TClasePadre. Y cuando ejecuto, no me aparece ningún mensaje de error ni al crear ni al destruir las clases. ¿Necesitaré incluir RefCount de todos modos? ¿Necesitaré poner algo dentro de los métodos QueryInterface, _AddRef, y _Release aparte del inherited?

Por si te vale de ayuda, estamos hablando de Delphi 3. Muy arcaico, ya lo sé. Pero por desgracia yo no decido mis herramientas de trabajo.

Muchas gracias de nuevo.
Responder Con Cita