2008/12/30 Thales Eduardo Barros de Oliveira <tebosoftw...@gmail.com>:
> Pelo que entendi João, todas as classes, eu deveria mudar para esta que
> sugere e quando fosse apontado a uma variavel, ou adicionado a uma
> lista, deferia executar a função addRef, e quando não mais fosse usar,
> deveria executar o FreeInstance?

Executar .Free, normalmente, como se não houvesse contagem de
referência. Somente quando a contagem cair para zero é que o
FreeInstance libera a instância.

> um pouco diferente, mas muito interessante.

Diferente porque é uma solução que não existe no mundo Object Pascal =
misturar objetos e interfaces. Faltou acrescentar que, para
implementar alguma interface, basta implementar os seguintes métodos
na área protected:

function TIntfObj.QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := HResult($80004002);  // E_NOINTERFACE
end;

function TIntfObj._AddRef: Integer; stdcall;
begin
  Result := AddRef;
end;

function TIntfObj._Release: Integer; stdcall;
begin
  Result := Release;
  if Result = 0 then
    try
      Finit;
    finally
      inherited FreeInstance;
    end;
end;

E ainda distinguir entre classes que criam a instância para um
ponteiro de objeto, e que criam a instância para um ponteiro de
interface. Para o primeiro caso, RefCount deve começar em um, e para o
segundo, deve começar em zero.

Tenho as duas classes implementadas, respectivamente
TPressManagedObject e TPressManagedIObject:

http://pressobjects.svn.sourceforge.net/viewvc/pressobjects/trunk/Source/Core/PressClasses.pas?revision=1034&view=markup

> obrigado pela dica

Disponha.

--
Joao Morais

Responder a