关于动态链接库中创建非模态对话框出现的问题
extern "C" AFX_API_EXPORT BOOL CommOpen(CChannel* pChannel,BOOL bOpen)//主框架调用的第一个导出函数
{
//创建的非模态对话框
AfxGetThread()->PostThreadMessage(CM_TEST1,0,0);//调用主框架的现成发消息
MSG msg;
CDirCheckDemoDlg* p = NULL;
while (::GetMessage(&msg,NULL,0,0))
{
//不是非模态对话框则看看是否是其他消息
if (!::IsWindow(p->GetSafeHwnd()) || !::IsDialogMessage(p->GetSafeHwnd(),&msg) )
{
if (msg.message == CM_TEST1)
{
p = new CDirCheckDemoDlg;
p->Create(IDD_DIRCHECK_DIALOG,AfxGetApp()->m_pMainWnd);
p->CenterWindow();
p->ShowWindow(SW_NORMAL);
p->UpdateWindow();
}
//删除消息
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
}
}
return TRUE;//主框架自动调用第二个导出函数
}
extern "C" AFX_API_EXPORT int Poll(CDevice* pDevice)//主框架调用的第二个导出函数
{
}
发现主框架调用第一个导出函数后,不会调用第二个导出函数。
问题:怎么主框架调用第一个导出函数后,(只要第一个导出函数返回true就)自动调用第二个导出函数?
分析:开始在动态链接库中创建非模态对话框代码是这样的
extern "C" AFX_API_EXPORT BOOL CommOpen(CChannel* pChannel,BOOL bOpen)
{
//创建的非模态对话框
AFX_MANAGE_STATE(AfxGetAppModuleState());
CDirCheckDemoDlg *pDlg=new CDirCheckDemoDlg;
pDlg->Create(IDD_DIRCHECK_DIALOG,AfxGetApp()->m_pMainWnd);
pDlg->CenterWindow();
pDlg->ShowWindow(SW_SHOW);
pDlg->UpdateWindow();
return TRUE;//主框架自动调用第二个导出函数
}
extern "C" AFX_API_EXPORT int Poll(CDevice* pDevice)//主框架调用的第二个导出函数
{
}
这里这样写,运行后会造成主框架和非模态对话框卡起,无法响应,分析了下原因好像是非模态对话框一直响应WM_PAINT消息,导致对话框一直画,最终导致看起来卡起,实际上主框架会自动调用第二个导出函数。由于卡起无法向对话框中输入内容。如改成了while循环接受消息的写法,但是另一个问题出现了,一直处理接受消息,即while()循环无法退出(自己试过跳出while后会造成主框架和非模态对话框卡起,无法响应),该怎么改才能使第一个函数返回true?
发现这个问题是矛盾题目,很有意思。。。有遇到这种问题的老鸟发表下解决方法,这个问题关键在分析为什么主框架和非模态对话框卡起,无法响应
相关推荐
MFC多线程创建非模态对话框(防止一闪而逝)
主对话框单击事件里使用多线程创建对话框B,正常情况见B对话框都是闪现一次,无法长期停留。本代码利用MSG防止了此现象的发生,适合初学多线程的新手。
VS2019中MFC DLL封装非模态对话框:规则DLL与扩展DLL详解
在Windows桌面开发中,DLL封装技术是实现模块化与代码复用的重要手段,其中MFC DLL的封装因涉及模块状态、资源句柄及对象生命周期管理,成为许多开发者绕不开的难点。理解规则DLL与扩展DLL的本质区别是正确封装的基础:规则DLL自带CWinApp实例,适合向任意Win32程序导出C接口函数;扩展DLL用于导出MFC类,但要求调用方同为MFC程序。基于这一原理,封装非模态对话框时必须关注AFX_MANAGE_STATE对资源状态的切换,以及通过PostNcDestroy实现自销毁来避免窗口一闪而过。这
MFC DLL封装非模态对话框:规则DLL与扩展DLL实战
动态链接库(DLL)是Windows平台实现代码复用与模块化集成的核心机制,可用于将界面组件、业务逻辑封装为独立模块供多个应用程序共享。在MFC桌面开发中,DLL封装的重点在于模块状态切换与资源查找——规则DLL需通过AFX_MANAGE_STATE切换资源上下文,扩展DLL则依赖CDynLinkLibrary建立资源链。相比模态对话框会阻塞主流程,非模态对话框可在DLL中灵活弹出,不打断用户操作,因此更适合上位机、工具软件等需要多窗口协同的场景。以VS2019为例,详细介绍规则DLL与扩展DLL两种封装非
C++源码:非模态对话框创建和销毁
C++源码 VC6工程 非模态对话框创建和销毁 1,防止创建多个非模态对话框 2,实现模态对话框的销毁
VS2010+MFC 模态对话框、非模态对话框的显示与打开以及对话框的之间的数据传递
弹出子对话框,在子对话框特定位置,显示非模态对话框,对话框之间的数据传递


进程/线程/DLL
