PRB: GetControlUnknown() Returns NULL in COleControl (166767)



The information in this article applies to:

  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2b
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.2
  • Microsoft Visual C++, 32-bit Professional Edition 4.2b
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0

This article was previously published under Q166767

SYMPTOMS

When you call GetControlUnknown() from inside a COleControl-derived class, it always returns NULL.

CAUSE

The function CWnd::GetControlUnknown() should be called from the control container.

RESOLUTION

Call CCmdTarget::GetControllingUnknown() instead of
CWnd::GetControlUnknown().

STATUS

This behavior is by design.

MORE INFORMATION

CWnd::GetControlUnknown() can be called to check if the CWnd is being used as a proxy, or wrapper, for a contained Activex control. It does this by checking the m_pCtrlSite CWnd member to see if it's NULL or not. If m_pCtrlSite is NULL, then NULL is returned. Since m_pCtrlSite is only set when the CWnd represents a contained ActiveX control, m_pCtrlSite will always be NULL if GetControlUnknown() is called from inside an ActiveX control's source.

CCmdTarget::GetControllingUnknown() can be used to get the IUnknown of the outer, or controlling, object from within an object which is being aggregated. If the object is not being aggregated then CCmdTarget::GetControllingUnknown() simply returns the object's own IUnknown.

Note that CCmdTarget::GetControllingUnknown() is an undocumented function and may change in future versions of MFC.

Modification Type:MajorLast Reviewed:12/1/2003
Keywords:kbCtrl kbInprocSvr kbprb KB166767