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

发布于 2024-09-28 16:41:52 字数 578 浏览 4 评论 0原文

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

如果有人简要解释如何处理此类对象中的内存,

将会有所帮助。提前致谢。

actually i am using late-binding in delphi, and i need to know wich is the proper way to work with it.

My principal concern is about how I handle the memory used by these objects, I must free the memory?

check this sample 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;

would be helpful if someone explain briefly how is handled the memory in this type of objects.

thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

落花浅忆 2024-10-05 16:41:53

正如梅森所说,接口的内存由编译器为您管理。但是,StringToOleStr() 返回一个已分配的 BSTR,需要使用 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)); 

Like Mason said, the memory for the interfaces is managed by the compiler for you. However, StringToOleStr() returns an allocated BSTR that needs to be freed manually with SysFreeString(). You should use the WideString type instead, which manages the memory for you, eg:

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

Or:

var
  w: WideString;

w := 'oleobject.class';
OleCheck(MkParseDisplayName(BindCtx, PWideChar(w), chEaten, Moniker)); 
ζ澈沫 2024-10-05 16:41:52

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

COM Interface objects in Delphi are automatically managed by the compiler. It inserts hidden calls to AddRef and Release at the appropriate places, and your interfaces will automatically have their Release methods called when they go out of scope. So no, you don't have to nil out the reference.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文