创建一个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为???请教
原因及解决方法先谢过大家!!!

解决方案 »

  1.   

    补充一下
    App中的代码:
    BOOL CComApp::CreateDlg(CWnd * pParentWnd)
    {
    BOOL bState; CDlgChild * pDlg = CDlgChild::GetInstance();
    bState = pDlg->Create(IDD_DIALOG1,pParentWnd);
    pDlg->ShowWindow(SW_SHOW); return bState;
    }
      

  2.   

    这样调用肯定出不来。
    原因:
    1 UI窗口都是属于UI线程的,COM无法假定调用线程是UI线程
    2 类 CDlgChild 中继承自 CDialog 的成员 HINSTANCE m_hInst
      必须设置成调用进程的hInstance,否则COM对象中的UI也无法生成。 
      

  3.   

    应该是可以的,我写过这样的 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;