初学者提问,怎么在基于MFC的COM组件中显示一个非模态对话框
菜鸟提问,如何在基于MFC的COM组件中显示一个非模态对话框
本来发在COM的,那里人太少了,所以借这里的人气再发一次,加到一百分,大家帮帮忙,谢谢。
----------------------
初学者,可能问题中有许多不恰当的说法,还请大侠们多多包涵
基本弄懂如何建立一个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这个库函数的信息,所以也不知道为什么错了。
请教各位大侠,相在接口函数中显示一个对话框应该如何做呢?或者我写的语句哪错了呢,谢谢!
------解决方案--------------------
可能是你的模板资源有问题,你要保证这个对话框资源存在你的工程中,你可以新建一个对话框资源再看看
------解决方案--------------------
在资源中找不到这个对话框模板
------解决方案--------------------
com运行的容器所在的moudle没有包含这个对话框的资源吧?
直接传一个对话框资源来生成试试看.
------解决方案--------------------
在你的com里创建对话框前加一句
AfxSetResourceHandle(this-> m_hInstance);
试试
------解决方案--------------------
com里面或者线程里面弹对话框需要特殊处理的。
------解决方案--------------------
很简单吧,你的dll要支持mfc,然后想在mfc的exe程序中一样添加一个dialog,然后你就可以使用这个对话框了,再实例化这个对象的时候加上一句 AfxEnableControlContainer();
就ok!
本来发在COM的,那里人太少了,所以借这里的人气再发一次,加到一百分,大家帮帮忙,谢谢。
----------------------
初学者,可能问题中有许多不恰当的说法,还请大侠们多多包涵
基本弄懂如何建立一个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这个库函数的信息,所以也不知道为什么错了。
请教各位大侠,相在接口函数中显示一个对话框应该如何做呢?或者我写的语句哪错了呢,谢谢!
------解决方案--------------------
可能是你的模板资源有问题,你要保证这个对话框资源存在你的工程中,你可以新建一个对话框资源再看看
------解决方案--------------------
在资源中找不到这个对话框模板
------解决方案--------------------
com运行的容器所在的moudle没有包含这个对话框的资源吧?
直接传一个对话框资源来生成试试看.
------解决方案--------------------
在你的com里创建对话框前加一句
AfxSetResourceHandle(this-> m_hInstance);
试试
------解决方案--------------------
com里面或者线程里面弹对话框需要特殊处理的。
------解决方案--------------------
很简单吧,你的dll要支持mfc,然后想在mfc的exe程序中一样添加一个dialog,然后你就可以使用这个对话框了,再实例化这个对象的时候加上一句 AfxEnableControlContainer();
就ok!