为什么消息循环会退出?

combobox2013 2013-11-28 05:40:57
新建了一个对话框工程,然后把对话框的代码通通通删掉,只留下:

BOOL CbbbbApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

//m_pMainWnd = &dlg;
//INT_PTR nResponse = dlg.DoModal();
//if (nResponse == IDOK)
//{
// // TODO: 在此放置处理何时用
// // “确定”来关闭对话框的代码
//}
//else if (nResponse == IDCANCEL)
//{
// // TODO: 在此放置处理何时用
// // “取消”来关闭对话框的代码
//}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return TRUE;
}


结果程序退出了。

按照道理来说。 return TRUE ,不会导致消息循环退出啊。所以程序不应该退出的


...全文
209 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
combobox2013 2013-12-04
  • 打赏
  • 举报
回复
引用 10 楼 CharlesSimonyi 的回复:
不清楚了,要有具体代码才好分析。 我新创建一个MFC DLL项目,看它生成的代码并没有进入消息循环,初始化完就return了dllmain 直接返回false也没有波及到宿主程序
多谢
encoderlee 版主 2013-12-03
  • 打赏
  • 举报
回复
不清楚了,要有具体代码才好分析。 我新创建一个MFC DLL项目,看它生成的代码并没有进入消息循环,初始化完就return了dllmain 直接返回false也没有波及到宿主程序
bsnry 2013-11-30
  • 打赏
  • 举报
回复
引用 6 楼 combobox2013 的回复:
[quote=引用 4 楼 CharlesSimonyi 的回复:] 你在疑惑如果不创建一个隐藏窗口并赋值给m_pMainWnd的话,即便是return TRUE,程序也会退出? 单步跟踪一下就知道了。 在InitInstance里return TRUE后,确实调用了包装消息循环的Run() 但是在Run()他会检查m_pMainWnd是否为空,如果为空的话,AfxPostQuitMessage(0)退出程序。 所以,创建一个隐藏窗口并赋值给m_pMainWnd,然后return TRUE。程序就不会退出了
引用 5 楼 ftd2013 的回复:
m_pMainWnd为空的话,为什么不退出?
高手们好,我的机子除了故障,mfc的源码无法调试,所以没有看到源码。 多谢。 另一个问题: 之所以发帖的目的,是因为看到一个mfc 规则dll (共享方式连接mfc dll)里的InitInstance所引起的。 1. mfc dll 自身有消息循环,宿主程序又消息循环。 2. mfc dll比较特殊,CXXWinapp里的m_pMainWnd 可以为空,为空的时候,不会引起 mfc dll退出。 但是返回值似乎必须为true. 否则会退出, 最夸张的是:会波及到 宿主程序,引起宿主程序退出, 请问这是怎么回事? 有高手可以验证,解释一下吗? [/quote] 最夸张的是:会波及到 宿主程序,引起宿主程序退出 我试过了,我是控制台程序加载一个 什么都不做的mfc 规则dll, 直接返回false. 并没有波及到 宿主程序
combobox2013 2013-11-30
  • 打赏
  • 举报
回复
引用 7 楼 yangnix 的回复:
经典的MFC对话框程序中 对话框会DoModal,App中InitInstance函数会停在那里,直到DoModal返回,App程序才会结束
看6楼
鄢老 2013-11-29
  • 打赏
  • 举报
回复
经典的MFC对话框程序中 对话框会DoModal,App中InitInstance函数会停在那里,直到DoModal返回,App程序才会结束
combobox2013 2013-11-29
  • 打赏
  • 举报
回复
引用 4 楼 CharlesSimonyi 的回复:
你在疑惑如果不创建一个隐藏窗口并赋值给m_pMainWnd的话,即便是return TRUE,程序也会退出? 单步跟踪一下就知道了。 在InitInstance里return TRUE后,确实调用了包装消息循环的Run() 但是在Run()他会检查m_pMainWnd是否为空,如果为空的话,AfxPostQuitMessage(0)退出程序。 所以,创建一个隐藏窗口并赋值给m_pMainWnd,然后return TRUE。程序就不会退出了
引用 5 楼 ftd2013 的回复:
m_pMainWnd为空的话,为什么不退出?
高手们好,我的机子除了故障,mfc的源码无法调试,所以没有看到源码。 多谢。 另一个问题: 之所以发帖的目的,是因为看到一个mfc 规则dll (共享方式连接mfc dll)里的InitInstance所引起的。 1. mfc dll 自身有消息循环,宿主程序又消息循环。 2. mfc dll比较特殊,CXXWinapp里的m_pMainWnd 可以为空,为空的时候,不会引起 mfc dll退出。 但是返回值似乎必须为true. 否则会退出, 最夸张的是:会波及到 宿主程序,引起宿主程序退出, 请问这是怎么回事? 有高手可以验证,解释一下吗?
打你屁屁 2013-11-29
  • 打赏
  • 举报
回复
m_pMainWnd为空的话,为什么不退出?
encoderlee 版主 2013-11-28
  • 打赏
  • 举报
回复
你在疑惑如果不创建一个隐藏窗口并赋值给m_pMainWnd的话,即便是return TRUE,程序也会退出? 单步跟踪一下就知道了。 在InitInstance里return TRUE后,确实调用了包装消息循环的Run() 但是在Run()他会检查m_pMainWnd是否为空,如果为空的话,AfxPostQuitMessage(0)退出程序。 所以,创建一个隐藏窗口并赋值给m_pMainWnd,然后return TRUE。程序就不会退出了
combobox2013 2013-11-28
  • 打赏
  • 举报
回复
引用 2 楼 xuddk727 的回复:
就没看见你有消息循环啊
引用 1 楼 worldy 的回复:
CWinThread::m_pMainWnd 没有设置,消息循环没有创建
消息循环再CWinThread::Run里啊。 第二:我为什么要故意删掉代码呢? 原因是 我看到一个例子,例子不方便发出来,见谅。 例子是一个mfc 规则dll(共享mfc dll的方式),例子InitInstance的最后一句代码,大家猜猜是什么? 是return FALSE. 也就说,这个 dll, 你的宿主程序加载后,那么这个dll会迅速被卸载,原因是 return FALSE.导致的。 所以作者为了防止这个现象出现,就在 这个dll 里 create了一个非模式对话(隐藏的),代码: dlg.create.. return TURE; return FALSE; 采用这种方式来防止dll被卸载掉。 我看到后,于是就在思考。作者的意图是什么? 因为这个对话啥功能都没有。 后来就注释掉 return TRUE. 结果发现会导致宿主程序被退出。 为了证明 我的猜测是正确的,我于是做了一个例子-------------就是本帖的代码。
许文君 2013-11-28
  • 打赏
  • 举报
回复
就没看见你有消息循环啊
worldy 2013-11-28
  • 打赏
  • 举报
回复
CWinThread::m_pMainWnd 没有设置,消息循环没有创建

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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