繁体   English   中英

我应该使用哪一个来释放COM对象?

[英]Which one should I use to free the COM object?

我有一个COM类,看起来像这样:

  TRadioTracer = class(TAutoObject, IRadioTracer)

现在,我可以

var
   obj: TRadioTracer;
begin
   obj := TRadioTracer.Create;
   // some other code
   obj.Free;
   obj.CleanupInstance;
   obj.FreeInstance;
end;

这些来自System.pas

procedure TObject.FreeInstance;
begin
  CleanupInstance;
  _FreeMem(Pointer(Self));
end;

procedure TObject.CleanupInstance;
{$IFDEF PUREPASCAL}
var
  ClassPtr: TClass;
  InitTable: Pointer;
begin
{$IFDEF WEAKREF}
  _CleanupInstance(Self);
{$ENDIF}
  ClassPtr := ClassType;
  repeat
    InitTable := PPointer(PByte(ClassPtr) + vmtInitTable)^;
    if InitTable <> nil then
      _FinalizeRecord(Self, InitTable);
    ClassPtr := ClassPtr.ClassParent;
  until ClassPtr = nil;
  TMonitor.Destroy(Self);
end;
{$ELSE !PUREPASCAL}
// some other code

procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
  if Self <> nil then
    Destroy;
{$ENDIF}
end;

我应该使用哪一个来释放COM对象?

使用接口类型存储对对象的引用。 一旦没有引用,它将被销毁:

var
   obj: IRadioTracer;
begin
   obj := TRadioTracer.Create;
   obj.DoThings;
end; // obj will be freed here automatically

当您在其他应用程序中或通过TAutoObjectFactory使用COM对象时,您只会知道接口类型。 您无权访问具体的类类型。 这是为什么在这里更喜欢接口类型而不是类类型的另一个原因。

如果您使用类类型来引用对象,则需要调用Free来销毁它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM