首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

在ATL COM中创建子窗口出错,该如何处理

2012-02-21 
在ATL COM中创建子窗口出错创建一个ATL COM 程序,Server Type 为 Dynamic Link Library(DLL),支持MFC。COM

在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; 
}

热点排行