关于QueryInterface,这样的代码有问题吗?是不是释放的太多了?或者少了什么操作?(100分)

  • 主题发起人 主题发起人 avbb4cat
  • 开始时间 开始时间
A

avbb4cat

Unregistered / Unconfirmed
GUEST, unregistred user!
代码如下,
问题是: QueryInterface这样用对吗?
我查帮助说需要使用_AddRef增加计数,但是还是报错,请问大侠下面的代码到底什么地方出问题了?
运行几次没问题,但是多次运行就会报错! 不明白为什么! 恳请大侠指点!
type
IDelta = interface
['{015F9E5A-37A3-4D98-9366-A561BA287AFC}']
....
end;

IFieldMapInfo = interface(IDelta)
['{5701BC80-149F-4AF1-A861-655030FFFC8D}']
....;
end;
const
IID_IFieldMapInfo: TGUID='{5701BC80-149F-4AF1-A861-655030FFFC8D}';
var
Delta:IDelta;
TmpFieldMapInfo:IFieldMapInfo;
//从Delta继承
begin
Pointer(Delta):=Iother;
if Delta.QueryInterface(IID_IFieldMapInfo, TmpFieldMapInfo) = S_OK then
begin
.....;//这里需要AddRef吗?
TmpFieldMapInfo := nil;
//这儿释放有问题吗?
end;
Pointer(Delta) := nil;
//这个操作会把 Iother 也释放掉吗?

end;
 
这样用有问题吧!
Delphi中,_QueryInterface,_AddRef,_ReleasRef已经封装好了,并在TInterfacedObject类中实现了。
只要调用接口,就会自动调用_AddRef,内部计数加1,使用完毕后自动调用_ReleasRef,内部计数减1,当内部计数=0就释放资源!
 
那么,标准的用法应该怎么写呢?
望大侠不吝赐教!
呵呵!
 
问题已经解决,但是是由其他的弟兄解答的! 呵呵!
 
后退
顶部