在Delphi中使用LateBinding的正确方法是什么?

时间:2010-10-21 01:02:02

标签: delphi memory com late-binding

实际上我在delphi中使用后期绑定,我需要知道这是使用它的正确方法。

我主要担心的是如何处理这些对象使用的内存,我必须释放内存吗?

检查此示例代码

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;
如果有人简要解释如何处理这类对象中的内存,

将会很有帮助。

提前感谢。

2 个答案:

答案 0 :(得分:3)

Delphi中的COM接口对象由编译器自动管理。它会在适当的位置插入对AddRefRelease的隐藏调用,并且当它们超出范围时,您的接口将自动调用其Release方法。所以不,你没有 nil 超出参考。

答案 1 :(得分:0)

就像Mason所说,接口的内存由编译器为您管理。但是,StringToOleStr()返回需要使用SysFreeString()手动释放的已分配BSTR。您应该使用WideString类型来管理内存,例如:

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

或者:

var
  w: WideString;

w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker));