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

4

实际上,我正在使用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个回答

4

在Delphi中,COM接口对象由编译器自动管理。它会在适当的位置插入隐藏的AddRefRelease调用,并且当接口超出作用域时,它们的Release方法将自动被调用。因此,您不必将引用设置为nil


2
Mason是正确的,你不必将引用设置为nil,因为它会被自动处理,但是自己这样做也没有问题。你还没有将BindCtx或Moniker的引用设置为nil,但不用担心,它们应该在超出作用域时被释放。 - skamradt

1

就像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)); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接