The information in this article applies to:
SYMPTOMSCalling CCmdTarget::FromIDispatch() inside a member function of a class derived from COleControl or attempting to call FromIDispatch() passing an IDispatch pointer belonging to an OLE Control, will always return NULL. CAUSECCmdTarget::FromIDispatch() does the following test to determine if the passed IDispatch pointer belongs to a CCmdTarget-derived class or not:
The problem here is that classes derived from COleControl don't use the
COleDispatchImpl implementation of IDispatch directly. They have their own
implementation using BEGIN_INTERFACE_PART and END_INTERFACE_PART that
delegates to the COleDispatchImpl object in the CCmdTarget base class.
Because of this, the v-tables in the previous test won't match and the
function will return NULL.
RESOLUTION
It is possible to access the object of the class derived from COleControl
given a valid IDispatch pointer. The object can be accessed from another
control or outside of a control with the aid of a helper control. A helper
control would be necessary because the following formula relies on details
that are internal to a COleControl class.
In this case, localClass is "Dispatch" so m_x##localClass becomes
m_xDispatch.m_nOffset is generated by the INIT_INTERFACE_PART macro as follows:
STATUSThis behavior is by design. MORE INFORMATIONThis difference between CCmdTarget and COleControl's implementation of IDispatch disappears in Visual C++ version 4.0. COleControl uses COleDispatchImpl in version 4.0 and therefore, FromIDispatch() will work. Additional query words: 2.00 2.10 1.50 1.51 1.52 1.52a
Keywords : |
Last Reviewed: July 26, 1999 © 2000 Microsoft Corporation. All rights reserved. Terms of Use. |