Re: static_cast interface pointer to implementation class
"Alexander Lamaison" <newsgroups@lammy.co.uk> wrote in message
news:ePj85KW9IHA.5668@TK2MSFTNGP04.phx.gbl
I've been having some problems caused by static-casting an interface
pointer, e.g.:
IShellFolderViewCB *pExplorerCB;
hr = CoCreateInstance(
__uuidof(CExplorerCallback), NULL, CLSCTX_ALL,
IID_PPV_ARGS(&pExplorerCB));
static_cast<CExplorerCallback*>(pExplorerCB)->Initialize(m_pidl);
Inside the Initialise call, the member variables are all pointing at
the wrong memory (they appear to be slightly higher in memory than
they should be). What am I doing wrong?
The code that does the casting and the code that implements
CExplorerCallback see slightly different definitions of
CExplorerCallback class during compilation. Figure out why.
To avoide this issue I replaced this code with a call to
CComObject<>::CreateInstance, initialise and then use QI to get the
interface pointer (the recommended way, I believe)
Very much so.
but there are some
situations where this isn't possible, for instance if handed the
interface pointer as a callback.
If you are handed an interface pointer as a callback, how do you even
know the pointer is implemented by a specific class? What's to stop the
client from implementing the interface on their own class, and handing
you a pointer to their implementation? Perfectly legal in COM. If your
design relies on that not happening, you should reconsider it.
If you insist, there's a trick that goes like this:
class CExplorerCallback {
BEGIN_COM_MAP(CExplorerCallback)
// ... usual interface entries go here
COM_INTERFACE_ENTRY_IID(IID_Internal, CExplorerCallback)
END_COM_MAP()
};
Invent a new IID for IID_Internal, don't publish it anywhere (some use
the class' CLSID for this). This way, you can query an incoming
interface pointer for IID_Internal and get back a raw CExplorerCallback
pointer (assuming the interface is in fact implemented by
CExplorerCallback). Don't forget to Release when you are done.
--
With best wishes,
Igor Tandetnik
With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925