关于动态链接库中创建非模态对话框出现的问题

xiaobao xiaobao 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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,实现模态对话框的销毁

mnorst

VS2010+MFC 模态对话框、非模态对话框的显示与打开以及对话框的之间的数据传递

弹出子对话框,在子对话框特定位置,显示非模态对话框,对话框之间的数据传递

木木夕阳子
评论 7
收藏 已收藏
分享
返回顶部
xiaobao
进程/线程/DLL 15,466 成员 49,169 内容