Domanda

in realtà io sto usando late-binding a Delfi, e ho bisogno di sapere Quale è il modo corretto di lavorare con esso.

La mia principale preoccupazione è su come gestisco la memoria utilizzata da questi oggetti, devo liberare la memoria?

controllare questo codice di esempio

var
  chEaten: Integer;
  BindCtx: IBindCtx;
  Moniker: IMoniker;
 MyObject:: IDispatch;
begin
try  
  OleCheck(CreateBindCtx(0, bindCtx));
  OleCheck(MkParseDisplayName(BindCtx, StringToOleStr('oleobject.class'), chEaten, Moniker));
  OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, MyObject));

  MyObject.Metod1();
  MyObject.Metod2();
 finally
 MyObject:=nil,// is  this necesary?
 end;

end;

Sarebbe utile se qualcuno spiegare brevemente come viene gestita la memoria in questo tipo di oggetti.

grazie in anticipo.

È stato utile?

Soluzione

oggetti COM interfaccia in Delphi sono gestiti automaticamente dal compilatore. Si inserisce chiamate nascosti per AddRef e Release nei luoghi appropriati, e le interfacce avrà automaticamente i loro metodi Release chiamati quando vanno fuori portata. Quindi no, non c'è bisogno di nil il riferimento.

Altri suggerimenti

Come Mason, ha detto, la memoria per le interfacce è gestito dal compilatore per voi. Tuttavia, StringToOleStr () restituisce un BSTR allocato che deve essere liberati manualmente con SysFreeString (). Si consiglia di utilizzare il tipo di WideString invece, che gestisce la memoria per voi, per esempio:

OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker)); 

o

var
  w: WideString;

w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker)); 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top