通用Thunk

背景

许多库需要我们提供一个函数作为回调,这使得使用 “面向对象编程”(OOP) 出现了麻烦。因为普通的C函数没有成员函数需要的this指针。Thunk技术是一种快速但是平台相关的解决此问题的方法。我最近研究过许多有关thunk技术的文章,我认为许多解决方案都是针对于特定问题的。我设计了一组类,来提供一种通用的解决方案。

环境

开发环境 : IA32,Windows Xp SP2,Visual Studio 2005

用法

源代码提供了5(实际上4)个类(全都在 Thunk 名字空间中)。它们的每一个对象都有2个属性,对象和方法。它们可以动态的创建一些机器码。执行这些机器码将在逻辑上和调用 Obj.Method(…); 举例来说,如果我们想要设计一个类来进行窗口子类化的工作,我们可以按下面5个步骤使用通用Thunk

class CSubClassing {
private:
  Thunk::ThisToStd m_thunk;
//1.选择一个合适的Thunk类
// ThisToStd 类使一个使用__thiscall 约定的成员函数 (LRESULT SubProc(…) )
//成为一个使用_stdcall 约定的回调函数WNDPROC)
//2.实例化一个对象.
public:
CSubClassing() {
  m_thunk.Attach(this);
//3.附加到想要回调的对象上
  m_thunk.AttachMethod(&CSubClassing::SubProc);
// 4.附加成员函数
  // to do
}
void Attach(HWND hWnd) {
    m_oldProc = (WNDPROC)SetWindowLong(hWnd,GWL_PROC
      ,m_thunk.MakeCallback<LONG>());
// 5.转化到回调函数指针
//SetWindowLong函数使用一个LONG值来表示WNDPROC
    // to do
}
private:
  //这个非静态成员函数将被Windows回调
  LRESULT SubProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam) {
    if (msg!=WE_NEEDED)
      return CallWndProc(m_oldProc,hWnd,msg,wParam,lParam);
    // to do
  }
WNDPROC m_oldProc;
}
这5个类(class)都有相同的界面和使用方式。一旦你依据成员函数与回调函数的调用约定选定好了一个Thunk类,就可以按照上面的步骤做一些有用的事情 : 如WNDPROC,THREADPROC,hooking,等等

更多详细信息 见 Thunk.h和 示例(sample)工程(project)

示例工程包含5个程序的源代码,但是没有可执行文件,否则会太庞大。工程可以在Visual Studio 2005上顺利编译,只要工程的目录结构维持原样。5个程序使用一份相同的测试代码——TestClass.h TestClass.cpp main.cpp。不同之处在预处理器的定义。这样,它们分别测试了 ThisToStd,ThisToCdecl,StdToStd,StdToCdecl和CdeclToCdecl的功能。除了这些,你还可以从中得知使用一个Thunk类,需要包含和加入到工程中的最少文件。(只包含Thunk.h 并把Thunk.cpp 加入工程中也能工作,但不是最好方法)

时间: 2024-09-27 03:33:23

通用Thunk的相关文章

逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能

常用技能:http://www.cnblogs.com/dunitian/p/4822808.html#skill 逆天博客:http://dnt.dkil.net 逆天通用水印支持Winform,WPF,Web,WP,Win10.支持位置选择(9个位置 ==>[X]):http://www.cnblogs.com/dunitian/p/4939369.html 本次添加了一些新东西,比如剪贴板之类的水印操作.完善了部分功能(比如文件过滤,非Bitmap图片的处理,以及一些其他玩意等待你的发现)

FTP服务器的防火墙通用设置规则

  此FTP服务器的防火墙通用设置规则适用于Windows(包括服务器版和桌面版).Linux服务器以及可能的其他操作系统. 在配置好FTP服务器后将发起FTP服务的程序(如Windows的svchost.exe或FileZilla server.exe)而不仅仅是端口允许通过防火墙,程序(此处特指Windows的svchost.exe)不用带参数. svchost.exe这个例外,必须通过控制面板中的 " 允许程序通过 Windows 防火墙通信" ,使得 "Windows

网络子系统14_邻居子系统通用接口

//创建一个新的邻居项 //参考 深入理解linux网络技术内幕 // 1.邻居子系统为具体的邻居协议,提供通用的功能接口 // 2.系统中所有的邻居协议被链接在neigh_tables链表中 // 3.neigh_table代表一个具体的邻居协议 // 4.具体邻居协议在运行时的行为,可以通过struct neigh_parms调节, // neigh_params与设备关联,每个邻居协议neigh_table提供一个默认的neigh_params. //注册一个邻居协议到系统中 // 1.与

iphone-修改iPhone通用程序的方向

问题描述 修改iPhone通用程序的方向 我想要开发的程序能适应iPad所有方向,在iPhone中只要UIInterfaceOrientationPortrait 和UIInterfaceOrientationPortraitUpsideDown这两个.代码如下: -(BOOL)shouldAutorotate { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ return NO;

简单通用的makefile文件

########################################################################### 通用makefile文件# makefile规则# target ... : prerequisites ...#     command#   ...#   ...# target 是一个目标文件,可以是Object File,也可以是执行文件?# prerequisites是要生成那个target所需要的文件或是目标,用空格隔开# comma

实战篇-通用的页面列表导出Excel控件

首先,先上下图片,好理解一下今天要讲内容:   第一张图:   第二张图:   说明: 在很多系统中,或者是一些网站的后台,包括秋色园的后台,通过都会有一些相同的工具栏目,比如上面的"导出"按钮,由于分布在系统大量的列表中, 因此,如何以最简洁快速的方式实现这种功能,节省开发时间,就是今天以下要介绍的内容了.   接着我们再看一下点击"导出"按钮时出现的导出功能:   打开导出的Excel: 说明: 从以上四张图片中,所要说明的问题是: "导出"

通用权限管理工具,支所有ADO(包括ODBC)支持的数据库,不管用什么编程都行,VC/BCB/VB/PB/Delphi

ado|odbc|编程|数据|数据库 下面是一部分说明: 请细请到这里下载ExeDemo测试版通用权限管理工具的创作动机权限管理是MIS软件中很重要的一环.很多国内较出名的MIS软件厂商都设计了较完善的也具有自己特色的权限管理模块.但对于很多没那么规范的软件商(包括个人或小创作团体),他们经常是接到一单,设计一套权限管理系统,每套都不同:有的则不够重视,随便写上一段,哪里都拷过去用:有的也曾费尽心机,但结果总不能令自己满意.其实仔细想一下,每套软件的权限虽然各不相同,但其实所需实现的功能是相同的

使用纯HTML的通用数据管理和服务

使用纯HTML的通用数据管理和服务.然而,为了收集数据,你需要一个数据储存库.要避免使用数据库服务器带来的很多问题,你可以在XML中收集这些数据.下面是我们的项目的基本结构: <user>    <first_name/>    <last_name/>    <mi/></user> 我最初将数据限制为first name,last name和middle.这个页面之后的基本思想是用户信息在这个页面中获得.在用户信息需求得到满足以后,流程必须被

一个方便AJAX开发的通用类

ajax  Name: AJAXRequest Author: HotHeart(xujiwei) Site: http://www.xujiwei.cn/ Blog: http://www.xujiwei.cn/blog/ Copyright (c) 2006, All Rights Reserved 类名:AJAXRequest 版本:0.3 日期:2006-12-18 介绍:AJAXRequest是一个方便AJAX开发的通用类,可以方便地进行一些AJAX中需要的操作,从而简化开发步骤,减少