mgncs(1.2.0) 的ncsCreateModalDialogFromID函数存在一个隐患,原代码很简单,如下:

int ncsCreateModalDialogFromID (HPACKAGE package, Uint32 dlgId,HWND owner, HICON hIcon, HMENU hMenu,NCS_EVENT_HANDLER_INFO* handlers, NCS_EVENT_CONNECT_INFO* connects)
{int ret = 0;mDialogBox * dialog = SAFE_CAST(mDialogBox,ncsCreateMainWindowIndirectFromID(package, dlgId, owner, hIcon, hMenu, handlers, connects, 0));if (dialog) {ret = _c(dialog)->doModal(dialog, TRUE);MainWindowThreadCleanup(dialog->hwnd);}return ret;
}

上面的代码中在调用doModal成员函数后,又调用MainWindowThreadCleanup函数清除主窗口所使用的消息队列,内存等系统资源,看着好像没错。
下面是MiniGUI中MainWindowThreadCleanup函数的实现代码,可以看到函数最后释放了hMainWnd(pWin)指向的内存,这也没错:

void GUIAPI MainWindowThreadCleanup (HWND hMainWnd)
{PMAINWIN pWin = (PMAINWIN)hMainWnd;_MG_PRINTF ("GUI>Window: MainWindowThreadCleanup called: %p (%s)\n", pWin, pWin->spCaption);if (!MG_IS_DESTROYED_WINDOW (hMainWnd)) {_MG_PRINTF ("GUI>Window: Unexpected calling of ""(MainWindowThreadCleanup); Window (%p) ""not destroyed yet!\n", hMainWnd);return;}#ifdef _MGRM_THREADSif (pWin->pHosting == NULL) {mg_FreeMsgQueueThisThread ();_MG_PRINTF ("GUI>Window: Message queure is freed: %p (%s)\n", pWin, pWin->spCaption);}
#endif#ifdef __THREADX__ /* to avoid threadx keep pWin's value,which will lead to wrong way */memset (pWin, 0xcc, sizeof(MAINWIN));
#endiffree (pWin);
}

但是如果进一步剖析doModal成员函数的代码,就会发现当doModalbAutoDestroy参数为TRUE时,会在doModal结束的时候调用MainWindowThreadCleanup函数。
下面是doModal成员函数的实现代码节选:

static DWORD mMainWnd_doModal(mMainWnd*self, BOOL bAutoDestroy)
{HWND hwnd;IncludeWindowStyle(self->hwnd, NCSS_MNWND_MODE);// 。。。。hwnd = self->hwnd;// 。。。。if((GetWindowStyle(self->hwnd)&NCSS_MNWND_MODE) && bAutoDestroy){HWND hwnd = self->hwnd;//destroyDestroyMainWindow(self->hwnd);// 本文作者注:MainWindowCleanup 为宏定义,等价于MainWindowThreadCleanupMainWindowCleanup(hwnd);}else{ExcludeWindowStyle(self->hwnd, NCSS_MNWND_MODE);}return ret;
}

那么问题就来了:bAutoDestroy为TRUE调用doModal成员函数之后,dialog->hwnd指向的内存已经被释放,dialog->hwnd已经是个野指针(wild pointer),再调用MainWindowThreadCleanup函数就可能会产生不可预知的后果。

所以ncsCreateModalDialogFromID函数中调用doModal成员函数之后,就没有必要也不能再调用MainWindowThreadCleanup函数,删除之就可以解决这个隐患。修正的代码如下:

int ncsCreateModalDialogFromID (HPACKAGE package, Uint32 dlgId,HWND owner, HICON hIcon, HMENU hMenu,NCS_EVENT_HANDLER_INFO* handlers, NCS_EVENT_CONNECT_INFO* connects)
{int ret = 0;mDialogBox * dialog = SAFE_CAST(mDialogBox,ncsCreateMainWindowIndirectFromID(package, dlgId, owner, hIcon, hMenu, handlers, connects, 0));if (dialog) {ret = _c(dialog)->doModal(dialog, TRUE);}return ret;
}

minigui/mgncs 1.20 ncsCreateModalDialogFromID函数的隐患相关推荐

  1. 20 Python函数、定义一个函数、参数传递、匿名函数、return语句、变量作用域、

    20Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...

  2. 【软件侠】公认最常用的20个函数,案例详解

    写在前面:EXCEL在职场办公中的重要性不言而喻.学习更多EXCEL实战技能,特别推荐可以看看这套课(免费) 调整主题配色,提升表格N个档次_Excel进阶-表格美化与图表制作_表格美化 - 软件侠 ...

  3. 《从零开始学Swift》学习笔记(Day 20)——函数中参数的传递引用

    原创文章,欢迎转载.转载请注明:关东升的博客 参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以 ...

  4. python3函数重载_9.20 利用函数注解实现方法重载

    问题 你已经学过怎样使用函数参数注解,那么你可能会想利用它来实现基于类型的方法重载.但是你不确定应该怎样去实现(或者到底行得通不). 解决方案 本小节的技术是基于一个简单的技术,那就是Python允许 ...

  5. Solidity语言学习笔记————20、函数修饰符

    函数修饰符(Function Modifiers) 修饰符可以用来轻松改变函数的行为,比如在执行的函数之前自动检查条件.他们可继承合约的属性,也可被派生的合约重写. pragma solidity ^ ...

  6. minigui:静态编译连接mgncs库时遇到的xml2的问题

    最近做一个基于minigui/mgncs的项目,在开发阶段因为是在ubuntu下基于minigui的模拟器开发,所以编译时都是标准的动态库连接.没啥问题,很顺序. 现在项目功能开发告一段落,要向嵌入式 ...

  7. PTA Python函数题 7-1 模拟乒乓球比赛 (20 分)

    7-1 模拟乒乓球比赛 (20 分)-函数版 中国选手与日本选手进行乒乓球比赛,每局先得11分者赢得此局,整个比赛5局3胜,如某队获胜达到3局,则赢得此场比赛. 假设中国选手每一分获胜的概率为m,(含 ...

  8. MINIGUI 开发指南---GDI

    本文讲述 MiniGUI 中 GDI 函数及其使用.主要包括:设备上下文的概念.获取和释放:矩形操作和区域操作:基本绘图函数:位图操作函数:逻辑字体操作函数等. 引言 GUI 系统的一个重要组成部分就 ...

  9. MiniGUI细节处理(转)

    MiniGUI编程--列表框 分类: minigui2009-11-04 20:40 列表框 LBS(ListBoxStyle) 以CTRL_LIST/"list"为类名调用Cre ...

最新文章

  1. jQuery学习- 内容选择器
  2. java 物理地址_java中的==与equals的区别是什么,什么是物理地址?
  3. Execution Plan 执行计划介绍
  4. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...
  5. 50行代码串行Promise,koa洋葱模型原来这么有趣?
  6. java io编程_Java_IO编程
  7. Ubuntu 系统目录结构
  8. 使用 Inno Setup 快速打包你的应用程序
  9. 交友小程序服务器,又是陌生人交友小程序,探探Lite到底有什么不同?
  10. 调用百度API,文字转语音
  11. 随着公网对讲机市场占有率得不断增长,部分对讲机厂家为了得到用户的认可,不断升级对讲机及时以及对讲机的功能和性能,因此越来越多的全国对讲机以及公网对讲机问世。但是某些用户不清楚对讲机的原理,不禁会问
  12. java for冒号_浅谈对Java双冒号::的理解
  13. 搭建前端错误监控系统
  14. 关掉win10电脑hyper-v虚拟机方法
  15. 第1章第1节:启动PowerPoint并创建和放映幻灯片 [PowerPoint精美幻灯片实战教程]
  16. Project build error: Non-resolvable parent POM
  17. 4g手机关闭4g信号显示无服务器,手机4G信号栏为什么突然出现“HD”?原来开通了这个业务,望周知...
  18. 超具性价比的学生神器,讯飞智能录音笔给足惊喜
  19. tomcat部署多个项目,tomcat部署java,tomcat部署前端(亲测可用)
  20. 用matlab绘制克莱因瓶,用SolidWorks只需4个特征,便可画成一个漂亮的克莱因瓶子...

热门文章

  1. 如何搭建一个推荐系统
  2. H3C_路由器_Telnet配置
  3. 烂梗面试题: 从输入url到页面加载完成,发生了什么
  4. 发布!第五届“强网”拟态防御国际精英挑战赛精彩抢先看!
  5. SpringBoot 启动时的运行方法
  6. 点击返回键,将应用退至后台运行
  7. Instapaper再次在欧盟运作
  8. 如何在 Kovan 测试网上开始使用 OpenLeverage
  9. 计算机组成原理之指令流水
  10. 《海外社交媒体营销》导读