在ATL COM中创建子窗口出错
创建一个ATL COM 程序,Server Type 为 Dynamic Link Library(DLL),支持MFC。
COM程序内,有一个窗口类(CDlgChild),
DlgChild.h
public:
static CDlgChild * GetInstance();
private:
static CDlgChild * m_pDlg;
DlgChild.cpp
CDlgChild * CDlgChild::m_pDlg = NULL;
CDlgChild * CDlgChild::GetInstance()
{
if (m_pDlg == NULL)
{
m_pDlg = new CDlgChild;
}
return m_pDlg;
}
COM内添加方法
STDMETHOD(CreateDlg)(/*[in]*/LONG * lVal,/*[out,retval]*/BOOL * bVal);
实现:
STDMETHODIMP CTest::CreateDlg(LONG *lVal, BOOL *bVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWnd * pWnd = (CWnd * )ulVal;
*bVal = theApp.CreateDlg(pWnd);
return S_OK;
}
外部调用:
::CoInitialize(NULL);
HRESULT hr = m_pTest.CreateInstance("Com.Test");
if (FAILED(hr))
{
AfxMessageBox("error!");
return;
}
m_pTest->CreateDlg((ULONG *)this);
出错:
File: wincore.cpp
Line: 890
好象是传进去的窗口指针,指针有值(有指向一个内存地址),可是对应的hWnd为???
请教
原因及解决方法
先谢过大家!!!
[解决办法]
应该是可以的,我写过这样的 dll,你试一下不要直接传CWnd* 进去,用GetSafeHwnd() 取窗口句柄传进去
在com里:
STDMETHODIMP CTest::CreateDlg(HWND hWndParent, BOOL *bVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
CWnd * pWnd = CWnd::FromHandle(hWndParent);
theApp.CreateDlg(pWnd);
return S_OK;
}