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

时间:2015-10-08 15:25:01

标签: delphi

我有一个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对象?

1 个答案:

答案 0 :(得分:7)

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

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

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

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