Quale è il modo corretto di lavorare con LateBinding in Delphi?
-
09-10-2019 - |
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.
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));