【问题标题】:TAutoObject in delphi lifecycle..?delphi生命周期中的TAutoObject ..?
【发布时间】:2011-07-05 10:37:22
【问题描述】:

我有一个像这样的简单自动化类:

type
  TTest_COM = class(TAutoObject, ITest_COM)
  private
    Variable: TClass;
  protected
    procedure Test(parameters...); safecall;
  public
    procedure  Initialize; override;
    destructor Destroy; override;
  end;

implementation

destructor TTest_COM.Destroy;
begin
  Variable.Free;
  inherited;
end;

procedure TTest_COM.Initialize;
begin
  inherited;
  Variable := TClass.Create;
end;

procedure TTest_COM.Test(parameters...); safecall;
begin
  // this method makes use of "Variable"
end;

谁能向我解释这种充当 msmq 接收器的 com 对象的生命周期?

问题在于程序:测试有时会在未分配的“变量”上运行。 当我删除该行时:Variable.Free;尽管 dllhost.exe 的内存使用量增加了,但它仍然可以正常工作。

为什么会发生这样的事情?

编辑:

因为我无法回答自己的问题。我在这里做这个。

问题解决了。

该类正在分配全局变量。我没注意到。

这是另一个变量被覆盖的问题。

感谢您的帮助!

【问题讨论】:

  • 为什么不在构造函数中创建Variable?另外,TClass 是什么?
  • 我猜你是在 COM+ 中运行它,所以你可以继承 TMtsAutoObject 而不是 TAutoObject 并使用 OnActivate 和 OnDeactivate 来创建/释放你的变量。这就是我对常规 COM+ 对象所做的。我没有用 MSMQ 监听器尝试过。
  • @Marjan Venema 因为作为来宾用户(我假设)我得到的信息是 6 小时或更长时间后我能够做到这一点:) 这很荒谬,但对此无能为力:)
  • @John:啊!谢谢你让我知道。好吧,我猜是创建帐户的另一个原因:-)

标签: delphi object automation ole


【解决方案1】:

当引用计数为零时,应该释放 AutoObject。

我怀疑错误不在您的代码中,而是在使用该对象的代码中。在使用您的对象的代码中,引用计数达到零并被销毁,但仍从释放对象上的该代码调用 Test 过程。这就是为什么Test 有时会对未分配的变量进行操作:TTest_COM 对象已被销毁。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2014-09-10
    • 2013-04-06
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-04-20
    • 2013-07-03
    相关资源
    最近更新 更多