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.