CAUSE
The following two techniques of creating ActiveX controls
on composite controls (or any window supporting ATL containment) can result in
memory leaks.
//Intialize ATL control containment.
AtlAxWinInit();
//Create container window.
HWND hWndCont = m_ax.Create(m_hWnd, rect, 0, WS_CHILD | WS_VISIBLE);
//Create & activate ActiveX control
HRESULT hr = m_ax.CreateControl("MSCAL.Calendar");
-OR-
//Intialize ATL control containment.
AtlAxWinInit();
//Create container window
HWND hWndCont = m_ax.Create(m_hWnd, rect, 0, WS_CHILD | WS_VISIBLE);
// Create ActiveX control.
CComPtr<IUnknown> spunk;
HRESULT hr = CLSIDFromProgID(OLESTR("MSCAL.Calendar"), &clsid);
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IUnknown, (void**)&spunk);
// Activate ActiveX control.
HRESULT hr = m_ax.AttachControl(spunk);
In both techniques, the calls to
Create() results in the creation of a
CAxHostWindow object. The call to
CreateControl() or
AttachControl() also creates another
CAxHostWindow Object. Upon destruction, the
CAxHostWindow object created by
Create() is freed.
REFERENCES
For additional
information, click the article number below to view the article in the
Microsoft Knowledge Base:
192560 HOWTO: Adding ATL Control Containment Support to Any Window
218442 HOWTO: Programmatically Add ActiveX Controls to Composite Control