2010-10-21 2 views
3

en fait j'utilise la liaison tardive en Delphi, et j'ai besoin de savoir quelle est la bonne façon de travailler avec elle.Quelle est la bonne façon de travailler avec LateBinding dans Delphi?

Ma principale préoccupation concerne la façon dont je gère la mémoire utilisée par ces objets, je dois libérer la mémoire?

vérifier ce code exemple

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.

Répondre

3

Les objets d'interface COM dans Delphi sont automatiquement gérés par le compilateur. Il insère les appels cachés aux AddRef et Release aux endroits appropriés, et vos interfaces auront automatiquement leurs méthodes Release appelées quand elles sortent du cadre. Donc non, vous ne devez pas nul sur la référence.

+2

Mason est correct, vous n'avez pas à zéro la référence telle qu'elle sera traitée pour vous, mais il n'y a rien de mal à le faire vous-même. Vous n'avez pas non plus ignoré les références à BindCtx ou Moniker, mais ne vous inquiétez pas, ils devraient être libérés dès qu'ils sont hors de portée. – skamradt

+0

merci beaucoup Mason. – Salvador

0

Comme dit Mason, la mémoire pour les interfaces est gérée par le compilateur pour vous. Cependant, StringToOleStr() renvoie un BSTR alloué qui doit être libéré manuellement avec 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)); 
Questions connexes