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
相关产品推荐
相关产品推荐

