初学者,可能问题中有许多不恰当的说法,还请大侠们多多包涵基本弄懂如何建立一个com组件,由自定义的接口派生,接口很简单,只有一个函数。现在是想客户调用这个接口函数后显示一个对话框,可以做一些事情。我是照书一步一步做的,先由MFC AppWizard(Dll)建立一个Dll工程,用默认设置。然后加入一个基于CCmdTarget的派生类做为com组件类,定义一个接口,然后在组件类中由宏构建接口的派生类实现com的接口。接口很简单,如下
class IMyInterface: public IUnknown
{
public:
virtual void __stdcall test() = 0;
};
接口实现函数是这么写的
STDMETHODIMP_(void) CMyComObj::XMyComObj::test()
{
AfxMessageBox("My Test!");
}然后生成Dll,注册。在客户程序中调用,一切正常,可以弹出消息框。然后我想加入一个自定义对话框,我这么做的:首先加入一个对话框资源,由classwizard生成关联类,比如是CDlg1,然后在组件类中加入一个成员变量CDlg1* m_pDlg,最后在接口函数实现中显示出来:STDMETHODIMP_(void) CMyComObj::XMyComObj::test()
{
METHOD_PROLOGUE_EX_(CMyComObj, MyComObj)     
pThis->m_pDlg=new CDlg1();
pThis->m_pDlg->Create(CDlg1::IDD, NULL);
         pThis->m_pDlg->ShowWindow(SW_SHOW);
}运行时出现断言错误,调试跟踪到pThis->m_pDlg->Create(CDlg1::IDD, NULL);这句时出错,断言错误是出现在MFC库文件dlgcore.cpp中,出现在
if (!_AfxCheckDialogTemplate(lpszTemplateName, FALSE))
{
ASSERT(FALSE);          // invalid dialog template name
PostNcDestroy();        // cleanup if Create fails too soon
return FALSE;
}
好像是_AfxCheckDialogTemplate()返回false导致断言错误。可是显示非模对话框这三句程序写在一般的应用程序中如一个基于对话框应用程序的按钮响应函数中是正常的,为什么到这里会出错。我查了一下MSDN,却找不到_AfxCheckDialogTemplate这个库函数的信息,所以也不知道为什么错了。请教各位大侠,相在接口函数中显示一个对话框应该如何做呢?或者我写的语句哪错了呢,谢谢!

解决方案 »

  1.   

    COM中建议不要使用MFC, MFC的初始化比较复杂, 
    用ATL窗体很容易创建对话框
      

  2.   

    http://msdn2.microsoft.com/en-us/library/7a51wcfx(VS.80).aspx
      

  3.   

    谢谢二位的回贴。zzz3265(zzz):因为这个对话框是从前编写的,功能均已完成,所以想直接拿过来用。不会ATL,而且对话框中很多地方都用了MFC,所以要转过来比较麻烦。jiangsheng(蒋晟.Net[MVP]) :谢谢老大提供的例子,我好好研究下。不过好像不是com组件,是一个普通DLL,不知是是否一样。自己顶一下
      

  4.   

    估计是要在DLL里加上
    AFX_MANAGEED_RESOURCE
    宏有可能记错