`
ideage
  • 浏览: 324118 次
社区版块
存档分类
最新评论

DFL分析(三)消息转发机制

阅读更多

总想对DFL的机制进行深入的分析,但却沉迷应用,并且发现自己了解的还很浅显,不足为分析。

 

在看了几个GUI的回调函数实现后,终于发现了端倪。于是,有了本篇。

 

在我们使用面向对象机制来开发Windows程序中,我们面临的问题就是如何把静态的windows窗口回调函数调用绑定到每个(窗口)类上。我们知道,回调函数是一个固定的函数原型,并且在注册窗口类时要传递的函数指针。而我们的窗口类呢?类是无法在包含这个函数的。除非这个函数是静态函数。而静态函数又失去了我们的继承多态优点。

 

可以定义一个全局的窗口列表,存储每个窗口类的指针和HWND,然后再定位对象内部的消息处理函数。这是一个解决的办法。对了,DFL就是这么处理的!

 

让我们看看DFL的窗口回调函数:

 

extern(Windows) LRESULT dflWndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)

 

它利用了Application的静态变量Control[HWND] controls关联数组,保存了所有的control(窗口)类。

 

针对每个消息:创建一个消息类Message dm = Message(hwnd, msg, wparam, lparam),这里没有用到hwnd,

 

1.在创建control时,接收了WM_NCCREATE消息:保存控件(窗口)到数组。
  Application.controls[hwnd] = ctrl;
  ctrl.hwnd = hwnd;

2.对其他消息:
使用 ctrl = Application.lookupHwnd(hwnd); 根据hwnd查找对应的控件(窗口)指针。 
将创建的消息类发送给ctrl:调用ctrl.mustWndProc(),ctrl.preProcessMessage,ctrl._wndProc

 

Stewart's D Windows Framework使用了和DFL一样的方法。

 

而Selcuk IYIKALENDER的D Framework使用的是另外一个办法:
他使用了一个用户数据,在创建窗口时,使用SetWindowLongW将窗口指针保存在GWL_USERDATA中。GWL_USERDATA是
每个窗口的用户数据,这样就可以在消息到来的时候,通过w = cast(Window) cast(void*) GetWindowLongW( hWnd, GWL_USERDATA ),在窗口hwnd句柄 的用户数据中取得窗口的指针。将消息发送给具体的窗口了。

 


前几天看WTL,发现ATL中有个Thunk结构,利用指令,动态产生汇编代码,替换了窗口回调函数指针,也很精巧。

 


这样,就在回调函数接收到消息后,发给了每个对应的窗口类。每个窗口类根据可以在对应的事件中,进行处理。

分享到:
评论
2 楼 flyingxu 2009-02-28  
有谁知道c# form是用的什么机制吗?
1 楼 wugc 2008-12-20  
你总结的很全,
基本上就只有这三种方法。
DFL的做法可移植性最好,
thunk的速度最快,
第二种方法介于两者之间。

但我一直不理解thunk如何做到跨硬件平台的。
我看到ATL里的thunk好多关于硬件平台的宏定义,
如果真是通过宏定义区别的话,
怎么生成统一跨硬件平台的二进制代码了?

相关推荐

    DFL ST说明书

    DFL-ST II工具是一款由磁动电子科技自主开发的专业ST硬盘固件修复工具... DFL-ST II工具提供了强有力而实用的功能和解决方案,并坚持DFL产品主流通用功能三年免费升级的政策,让用户全面享受高质量升级服务和技术支持。

    DFL-WD中文说明书

    DFL-DE是专业的数据恢复软硬件USB2.0设备,该组件能够对ATA,SATA所有硬盘进行数据恢复,该设备也能够对连接于DFL-WD的SATA端口使用48位寻址方式的硬盘工作,同也也可以对任何操作系统识别的存储装置进行数据恢复。...

    DFL for DMD2.031

    它不仅提供了一些用于源码分析和修改的工具,还可能包括代码生成、自动格式化等功能,这对于大型项目中的代码管理和重构尤为有用。同时,DFL也考虑到了工具链的完整性,可能包含构建系统、测试框架等,使得开发流程...

    DFL员工福利商业保险项目信息管理系统毕业论文

    这有助于保险公司追踪理赔历史,分析理赔趋势,优化服务流程。 3. **维护理赔信息**:系统支持对理赔信息的实时更新和维护,无论是新的理赔申请还是已归档信息的修改,都能在系统中进行。这确保了数据的准确性和...

    DLINK DFL PPPoE設定方式

    DFL系列防火牆簡易安裝手冊 DFL-210,260,800,860,1600,2500 適用。

    DFL-WD II Setup_CHS_V2.3.5

    综合以上分析,我们可以推测“DFL-WD II”可能是一个专为西部数据硬盘设计的数据恢复或维护工具,具有高级的性能和稳定性,其最新版本为V2.3.5。然而,关于“XISHU”标签和“1590不降溶Pinnacle”的确切含义,需要更...

    DLINK -DFL系列設定如何阻檔某網站的方法

    DFL系列防火牆如果阻檔URL DFL-210,260,800,860,1600,2500 適用

    D-Link推出DFL-800/1600高性能整合式防火墙

    国际著名网络设备和解决方案提供商D-Link推出区域联防机制,并将其应用在新一代的安全产品--DFL-800/1600高性能 整合式防火墙中,不仅通过在网络安全设备之间建立互动机制,实现对网络安全设备的有效整合,将传统...

    Premiere插件DFL2调色插件

    DFL2调色插件 DFL2调色插件 DFL2调色插件

    DFL-CNN-master_svm人脸识别_人脸识别_facerecognition_支持向量机_cnn人脸识别_

    在实际应用中,人脸识别通常包括人脸检测、特征提取和匹配三个步骤。人脸检测定位出图像中的人脸区域,特征提取则从检测到的人脸中提取具有辨识性的特征,最后通过匹配算法比对特征来确定身份。 **主成分分析(PCA...

    DFL干膜润滑剂

    #### 三、产品用途 - **机械部件润滑**:适用于各类机械设备上的螺母、螺栓、轴承等部件的润滑。 - **乐器保养**:可用于保护和维护音乐乐器,如钢琴、吉他等。 - **电子设备维护**:适用于电脑、音响系统等电子产品...

    DFL Printting!

    通过阅读和分析"**dfl-20070907**"中的源代码,开发者可以深入理解DFL库的内部机制,了解如何处理打印任务的各个阶段,以及如何与其他GUI元素进行交互。同时,这也可能是一个学习Unicode编码和跨平台开发的好机会。...

    进程间通信机制的分析和比较linux

    本文将重点讨论Linux环境下进程间通信机制的分析与比较,主要包括信号、管道(包括匿名管道和命名管道)、信号量、消息队列以及共享内存。 #### 1. 信号 (Signals) 信号是一种用于向进程发送软件中断的通知机制,...

    实验四进程间通信(信号量机制实验).ppt

    进程对信号量机制的响应可以通过三种方式来实现:忽略信号量机制、捕捉信号量机制和执行缺省操作。忽略信号量机制是指不对信号量机制做任何处理;捕捉信号量机制是指定义信号量机制处理函数,当信号量机制发生时,...

    TOSHIBA-TC55257DFL.pdf

    TOSHIBA-TC55257DFL.pdf

    如何更改DLINK DFL 的LAN IP

    DFL系列防火牆簡易安裝手冊 DFL-210,260,800,860,1600,2500 適用。

    PyPI 官网下载 | DFL168A-1.0.0-py3-none-any.whl

    标题中的“PyPI 官网下载 | DFL168A-1.0.0-py3-none-any.whl”表明这是一个在Python Package Index(PyPI)官网上发布的软件包,名为DFL168A,版本号为1.0.0。这个包是为Python 3编写的,其构建格式是wheel,且适用...

Global site tag (gtag.js) - Google Analytics