You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi返回OleVariant时IDispatch对象引用计数异常增加问题

Delphi OleVariant 返回含IDispatch对象后引用计数异常问题

我有一个返回OleVariant的函数,该OleVariant包含带引用计数的IDispatch对象:

class function TGrobber.Make: OleVariant;
begin
   Result := (TGrobber.Create as IDispatch);
   // 此时Result内部IDispatch的引用计数为1
end;

函数执行结束时,OleVariant内部对象的引用计数正确为1,但当OleVariant返回给调用者后,内部对象的引用计数突然变为2:

var
    grobber: OleVariant;
begin
    grobber := TGrobber.Make; // 返回OleVariant的函数
    // 此时OleVariant内部IDispatch的引用计数变为2(不符合预期)
end;

这是因为Delphi调用Make函数后,会调用VarCopy:

Project2.dpr.147: grobber := TGrobber.Make;
004DA79D 8D55E0           lea edx,[ebp-$20]
004DA7A0 A1DC614D00       mov eax,[$004d61dc]
004DA7A5 E8CAC0FFFF       call TGrobber.Make       <== 创建对象(引用计数1)
004DA7AA 8D55E0           lea edx,[ebp-$20]
004DA7AD B800444E00       mov eax,$004e4400
004DA7B2 E8B128F5FF       call @VarCopy            <== 增加了额外引用,且未释放旧引用

这意味着:

  • 编译器为返回的变量添加了额外引用
  • 同时未释放旧引用
  • 或者根本不应调用@VarCopy

如何确保Delphi执行以下操作之一:

  • 复制后销毁旧的OleVariant
  • 不复制OleVariant,因为无需复制

内容的提问来源于stack exchange,提问作者Ian Boyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 17:55:59