【问题标题】:Which is the proper way to work with LateBinding in Delphi?在 Delphi 中使用 LateBinding 的正确方法是什么?
【发布时间】:2010-10-21 01:02:01
【问题描述】:

实际上我在 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;

如果有人简要解释如何处理此类对象中的内存,将会很有帮助。

提前致谢。

【问题讨论】:

    标签: delphi memory com late-binding


    【解决方案1】:

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

    【讨论】:

    • Mason 是正确的,您不必将引用归零,因为它会为您处理,但自己做也没有错。您也没有对 BindCtx 或 Moniker 的引用为零,但不用担心一旦超出范围就应该释放它们。
    【解决方案2】:

    正如 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)); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2018-12-20
      相关资源
      最近更新 更多