3369|5

67

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

EVC SDK下创建MFC消息处理结构,消息分发问题,高手请进! [复制链接]

背景:
  不使用 MFC 环境, 使用EVC  WCE application.
  创建 CWinComponent  为所有控件的基类
        有一函数指针变量:  CALLBACK m_pfnOldWindowProc(...)

  创建CWinForm: public CWinComponent 为所有窗口的基类
  创建其他的 CBtn:Public CWinComponent 为一般的按钮控件

思路:
  模拟MFC的消息分发机制,创建全局的:
LRESULT CALLBACK WinGlobalWinProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
   在创建WinForm 窗体(CreateWindowEx)后,设置窗口管理,并替换原来系统默认的窗口处理函数为当前全局的窗体处理函数,使系统所有消息均受全局消息循环处理:
   //添加到全局窗口列表中
    g_WinMgr.Append(GetHandle(), this);
    if (m_pfnOldWindowProc == NULL)//如果本组建原来的消息处理函数为空,则置新的窗体处理函数为全局的消息处理函数
    {
     m_pfnOldWindowProc = (WNDPROC)GetWindowLong(GetHandle(), GWL_WNDPROC);
     if (equal((long)m_pfnOldWindowProc, (long)WinGlobalWinProc) == false){
     m_pfnOldWindowProc = (WNDPROC)
     SetWindowLong(GetHandle(), GWL_WNDPROC, (long) WinGlobalWinProc);
      }
    }

【问题】
在EVC4.0+SP4 环境下,
   equal((long)m_pfnOldWindowProc, (long)WinGlobalWinProc)始终返回为false,  通过调试跟踪,查看内存,赋值给一个DWORD nx  比较, 最终pfnOldWindowProc 表现为全局的WinGlobalWinProc地址, 而
n1 = (long)WinGlobalWinProc则始终都是 后低20 位数据,
例如  pfnOldWindowProc  =  0x18013fc8  而传入 equal(long,long)的第二个参数 (long)WinGlobalWinProc)  始终为: 0x00013fc8

在DEBUG下和RELEASE下的调试结果是不同的, DEBUG下还可以运行正常,但是在RELEASE下就不可能运行正常

【难点解释】
1、GlobalProc 的CALLBACK定义是否和每一个对象的oldProc定义有歧异,不能正常比较?
2、在调试窗口看到的 GlobalProc和 OldProc具有相同的地址,为什么比较却不同?是否比较方式不对?能那么比较么?
3、在调试过程中发现 GlobalProc 和 OldProc 的定义有差异,一个为:GlobalProc(HWND__ * hWnd ,.....) 而另外一个为 GlobalProc(struct HWND__ *hWnd)..  这个什么原因引起的?
4、模拟MFC的消息处理过程,最核心的就是这理的消息分发机制,那么是否有其他的好的机制建议呢?

最新回复

1.通过对GlobalProc 函数的拦截,按照MFC的做法 我们将消息发送到相关的窗口,实现了MFC框架的所有功能,性能基本稳定。说明这种方式是可行的。 2.一次成功的体验  详情 回复 发表于 2007-10-23 11:44
点赞 关注

回复
举报

577

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 
学习...
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
怎么没有人啊...帮顶.....
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
如果你的程序没有一些只在EVC4下运行,不能在EVC3下运行的函数,
你将debug及release目录下的文件删除后打包发到我的邮箱,我帮你看看.
对不起,我一直用evc3,因为工作需要.我的邮箱zcw@glsoft.com.cn.
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 
做了一个投机取巧的做法 将 DWORD dwStore = (DWORD)GlobalProc .


然后在需要的地方比较 dwStore == ...
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 
1.通过对GlobalProc 函数的拦截,按照MFC的做法 我们将消息发送到相关的窗口,实现了MFC框架的所有功能,性能基本稳定。说明这种方式是可行的。

2.一次成功的体验
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表