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

xiaobao 2011-11-12 10:27:24

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?
发现这个问题是矛盾题目,很有意思。。。有遇到这种问题的老鸟发表下解决方法,这个问题关键在分析为什么主框架和非模态对话框卡起,无法响应
...全文
279 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobao 2011-11-13
  • 打赏
  • 举报
回复
5楼同志你好,你说的TranslateMessage/DispatchMessage方法更不行。对话框中输入1,输入框会显示1111,用::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)才是正确的这里。而且extern "C" AFX_API_EXPORT BOOL CommOpen(CChannel* pChannel,BOOL bOpen)未返回ture,而是一直在while循环。。无法主框架无法自动调用extern "C" AFX_API_EXPORT int Poll(CDevice* pDevice)。
xiaobao 2011-11-13
  • 打赏
  • 举报
回复
看查看本人博客,已经解决该问题了!
龙行天下之Sky 2011-11-12
  • 打赏
  • 举报
回复
::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
将这一句移到if循环外呢
xiaobao 2011-11-12
  • 打赏
  • 举报
回复

extern "C" AFX_API_EXPORT BOOL CommOpen(CChannel* pChannel,BOOL bOpen)
{
//创建的非模态对话框
CDirCheckDemoDlg *pDlg;
if (!flag)
{
pDlg=new CDirCheckDemoDlg;
pDlg->Create(IDD_DIRCHECK_DIALOG,AfxGetApp()->m_pMainWnd);
pDlg->CenterWindow();
pDlg->ShowWindow(SW_SHOW);
pDlg->UpdateWindow();
flag=TRUE;
}
return TRUE;
}

尝试用标识的方法控制创建的次数这个方法,这个方法根本不对,因为不会循环进入extern "C" AFX_API_EXPORT BOOL CommOpen(CChannel* pChannel,BOOL bOpen)
,这个导出函数只会进一次
DentistryDoctor 2011-11-12
  • 打赏
  • 举报
回复
TranslateMessage/DispatchMessage呢?
xiaobao 2011-11-12
  • 打赏
  • 举报
回复
按照3楼同志的做法,并在::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);语句前添加TranslateMessage(&msg)(接受键盘信息),发现主框架和非模态对话框不会卡起,能正确输入内容,问题算半个解决。已经加分了
为什么这么说呢?既然是非模态对话框,为什么非模态对话框创建的瞬间,程序没有走下去呢,即extern "C" AFX_API_EXPORT BOOL CommOpen(CChannel* pChannel,BOOL bOpen)未返回ture,而是一直在while循环。。无法主框架无法自动调用extern "C" AFX_API_EXPORT int Poll(CDevice* pDevice)。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧