我的一点关于把WndProc指向类的成员函数的看法
转载请注明来源:http://www.cnblogs.com/xuesongshu/
我以前经常考虑使用WNDCLASS、CreateThread之类的Windows API时如何在类里面调用,传入函数参数地址时如何使用成员函数的地址。为了研究,写了一个示例代码:
#include <iostream>
#include <stdio.h> using namespace std; typedef int (__stdcall *XSSH_SAY_HELLO)(int); class XTestMethod
{
typedef int (__stdcall XTestMethod::*XSayHello)(int);
public:
XSayHello say;
int hi;
public:
XTestMethod();
virtual ~XTestMethod();
int sayhello(int arg);
}; XTestMethod::XTestMethod()
{
say=&XTestMethod::sayhello;
hi=1000;
} XTestMethod::~XTestMethod()
{ } int XTestMethod::sayhello(int arg)
{
printf("\r\nsay:%d%d\r\n",arg,this->hi);
} int main(int argc, char *argv[])
{
XTestMethod t;
XSSH_SAY_HELLO call=*(XSSH_SAY_HELLO*)&t.say;
call(0);
system("pause");
return 0;
}
调试的时候发现在调用类的成员之前堆栈里的this指针是空的,输入之后输出结果的值前者是随机的,后者直接访问出错(空引用)。
对于成员函数与成员变量而言,同一类型的不同对象的同一成员变量的偏移地址是相同的,访问成员变量时它们的地址是基于对象的地址叠加计算的,如果用上述方法进入成员函数进而方问成员变量,那么访问出错。就算在访问成员变量之前把对象指针压入堆栈,不仅要考虑压入哪个对象的地址,而且这样使用成员函数实际上把它当成了全局函数来用,与静态成员函数使用在使用目的上没有区别,失去了面象对象的意义。
我的一点关于把WndProc指向类的成员函数的看法的更多相关文章
- VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数
这段时间用VC封装Windows类库,没有MakeObjectInstance处理窗口消息确实不爽,又不想使用MFC的消息映射,这玩意的效率和美观只能呵呵. 至于MakeObjectInstance是 ...
- Delphi中Message消息的三种使用方法(覆盖WndProc,覆盖消息函数,改写WMCommand)
实例1 unit Unit1; interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Fo ...
- c++ 指向类成员函数的函数指针
// ConsoleApplication34.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- 指向类成员函数的函数指针及#define typedef 实现类成员函数的类型转换
#include <iostream> using namespace std; class Test { public : void print() { cout << &q ...
- C++ 指向类成员函数指针的用法(转自维基百科)
类成员函数指针 类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息. 目录 1 语法 ...
- C++类成员指针(指向类成员的指针)
1.指向类的数据成员的指针: 声明格式如下: <类型说明符> <类名>::* <指针变量名>; 2.指向类的成员函数的指针: 声明格式如下: <类型说明符 ...
- <六>指向类成员的指针
指向类成员(成员变量和成员方法)的指针 1:定义一个指针指向类的普通成员变量 示例代码1 点击查看代码 class Test2{ public: int ma; static int mb; void ...
- 虚函数指针sizeof不为sizeof(void*)
ref:http://bbs.csdn.net/topics/360249561 一个继承了两个虚基类又增加了自己的一个虚函数pif的类,sizeof(指向pif的指针)竟然是8(X86).我是从这里 ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
随机推荐
- Java组各任务工作流程
1.周枫 A.提供基于SQL SERVER的数据库基本表结构创建脚本,基础数据脚本,按学科(产品)的数据脚本. 2.吴缤 A.提供给周茉的安装包用的项目文件,共三个digital,xylinkWeb和 ...
- 【转】牛逼闪闪的Ruby迭代器
D瓜哥最近想做一个网站,另外,老早就有学习一门动态语言的想法,满足着两个条件的编程语言中,Ruby.Python是最合适的两种语言.现在Ruby on Rails如日中天,光芒万丈!所以,就选定了Ru ...
- Docker:使用Ambassador进行跨主机间容器通信
转载请注明出处:点我 由于Docker自身的网络的原因,想要在多主机间的容器之间进行通信是比较麻烦的事情.可以利用Ambassador容器来实现这一功能. 基本原理: 利用Ambassador来实现主 ...
- PrettyProgressBar
https://github.com/liuguangqiang/PrettyProgressBar
- [MEAN Stack] First API -- 3. Select by ID with Mongoose and Express
Mongoose allows you to easily select resources by ID from your MongoDB. This is an important aspect ...
- [051] 微信公众平台开发教程第22篇-怎样保证access_token长期有效
为了使第三方开发人员能够为用户提供很多其它更有价值的个性化服务,微信公众平台开放了很多接口,包含自己定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发人员在调用这些接口时.都须要 ...
- 一款基于jQuery轮播切换焦点图,可播放多张图片
今天给大家分享一款基于jQuery轮播切换焦点图,可播放多张图片,在这个组件中,你可以任意指定8张图片,然后插件就会帮你自动生成缩略图,并且自动开始切换播放图片.当然,你也可以手动切换图片,只要点击缩 ...
- Android 在onActivityResult()中设置图片setImageResource(resId) 或者改变view属性,不成功的解决办法
如果试验过的朋友就会发现,在onActivityResult()中设置这些属性,好像都不工作,虽然我死磕一番还是不知道具体原因,我直接默认它可能就是不能在里面设置,所以就只能在其他地方设置,幸好发现A ...
- 关于变量在for循环内外定义的思考
在c#或java里面,我们通常会这样写for循环: ;i<;i++) { Console.WriteLine(i); } 前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高一些: ...
- JSON3-翻译(不当之处,请指正)
http://bestiejs.github.io/json3/JSON 3 显示了两个功能:stringify():序列化一个javaScript值为一个JSON,和parse():将一个json字 ...