I would expect you to addref the typelib when the ITypeInfo pointer is created, and then when it is destroyed to release it.
In the object that implements the ITypeInfo reference, you should have a pTypeLib->Release() in the destructor and a pTypeLib->AddRef() somewhere in the code that creates the ITypeInfo implementing object. If, for instance, the ITypeLib pointer is passed to the constructor of this object, then the constructor should look something like...
m_pTypeLib = pTypeLib; pTypeLib->AddRef(); ...
and the destructor should look like
m_pTypeLib->Release(); ...
Kelly
----- Original Message ----- From: "Mike Hearn" mike@theoretic.com To: wine-devel@winehq.com Sent: Monday, June 16, 2003 2:28 PM Subject: Re: TypeLib containment refcounting
This doesn't look right, you increment the refcount on every GetTypeInfo but only decrement when the typeinfo object is destroyed.
Well, unless you can call GetTypeInfoOfGuid twice and get two pointers to the same interface (maybe you can, i don't really know but that would seem unusual), I don't understand why this is wrong. When somebody calls GetTypeInfoOfGuid they get an interface, so at some point they should release it, which will in turn release the reference to the typelib. Without this patch, an app did a GetTypeInfo, released the typelib object and then tried to get the container from ITypeInfo which obviously crashed when it tried to do an AddRef on the destroyed object.
Otherwise I don't really understand how this should work, unless you manually add a reference for every type info object when the typelib is first constructed, then manually release also for every object. That would seem a bit odd though, to me.
Could you or somebody else explain how this should work?
thanks -mike