Welches ist der richtige Weg, um die Arbeit mit Latebinding in Delphi?
-
09-10-2019 - |
Frage
eigentlich ist ich mit später Bindung in delphi, und ich muß wissen, weicht der richtige Weg ist, mit ihm zu arbeiten.
Mein Hauptanliegen ist, wie ich die Erinnerung von diesen Objekten umgehen, muss ich den Speicher frei?
lesen Sie in diesem Beispielcode
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;
wäre hilfreich, wenn jemand kurz erklären, wie das Gedächtnis in dieser Art von Objekten behandelt wird.
Vielen Dank im Voraus.
Lösung
COM-Schnittstelle Objekte in Delphi werden automatisch vom Compiler verwaltet. Es fügt versteckt Anrufe AddRef
und Release
an den entsprechenden Stellen und Ihre Schnittstellen automatisch ihre Release
Methoden aufgerufen haben, wenn sie von Umfang hinausgehen. Also nein, müssen Sie nicht auf nil aus der Referenz.
Andere Tipps
Wie Mason sagte, der Speicher für die Schnittstellen wird vom Compiler für Sie verwaltet. Jedoch StringToOleStr () gibt einen zugeordneten BSTR dass Bedarf manuell mit SysFreeString befreit werden (). Sie sollten den Typ Wide verwenden Sie stattdessen, die für Sie den Speicher verwaltet, zum Beispiel:
OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker));
Oder:
var
w: WideString;
w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker));