Click to See Complete Forum and Search --> : ATL bug of CComPtr?


George2
April 7th, 2008, 12:41 AM
Hello everyone,


In the ATL Internals book, one form of constructor of CComQIPtr is implemented as this,


CComQIPtr (IUnknown* lp)
{
p = NULL; if (lp != NULL) lp -> QueryInterface (*piid, (void**)&p);
}


I think there is a bug when QueryInterface fails, and the original value of member variable p is overwritten.

I found the in MSVC 2008, the implementation is,


atlcomcli.h

CComQIPtr(_In_opt_ IUnknown* lp) throw()
{
if (lp != NULL)
lp->QueryInterface(*piid, (void **)&p);
}


Seems the bug is fixed? Is it a bug in old version of ATL or a bug in the book? :-)


thanks in advance,
George

Arjay
April 7th, 2008, 12:36 PM
You'll have to check the ATL source in the older versions to find out if it's a code or a book issue.

Igor Vartanov
April 7th, 2008, 02:32 PM
George, I really hate to disappoint people, but that p would be overwritten anyway:

From MSDN: IUnknown::QueryInterface
ppvObject


[out] Address of pointer variable that receives the interface pointer requested in riid. Upon successful return, *ppvObject contains the requested interface pointer to the object. If the object does not support the interface specified in iid, *ppvObject is set to NULL.

George2
April 7th, 2008, 08:04 PM
Thanks Arjay and Igor,


Question answered. My carelessness this time. :-)

George, I really hate to disappoint people, but that p would be overwritten anyway:

From MSDN: IUnknown::QueryInterface


regards,
George