Quelle est la bonne façon de travailler avec LateBinding à Delphes?
-
09-10-2019 - |
Question
en fait, je suis en utilisant contraignant fin delphi, et je dois savoir Wich est la bonne façon de travailler avec elle.
Ma principale préoccupation est de savoir comment je gère la mémoire utilisée par ces objets, je dois libérer la mémoire?
vérifier cet exemple de code
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;
serait utile si quelqu'un expliquer brièvement comment est gérée la mémoire dans ce type d'objets.
Merci d'avance.
La solution
objets COM Interface dans Delphi sont gérés automatiquement par le compilateur. Il insère des appels cachés à AddRef
et Release
aux endroits appropriés et vos interfaces auront automatiquement leurs méthodes de Release
appelés quand ils sont hors de portée. Donc non, vous n'avez pas à nil la référence.
Autres conseils
Comme dit Mason, la mémoire des interfaces est géré par le compilateur pour vous. Cependant, StringToOleStr () retourne un BSTR alloué qui doit être libéré manuellement à l'aide SysFreeString (). Vous devez utiliser le type WideString à la place, qui gère la mémoire pour vous, par exemple:
OleCheck(MkParseDisplayName(BindCtx, PWideChar(WideString('oleobject.class')), chEaten, Moniker));
Ou:
var
w: WideString;
w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker));