我的一点关于把WndProc指向类的成员函数的看法-创新互联

转载请注明来源:http://www.cnblogs.com/xuesongshu/我的一点关于把WndProc指向
类的成员函数的看法

我以前经常考虑使用WNDCLASS、CreateThread之类的Windows API时如何在类里面调用,传入函数参数地址时如何使用成员函数的地址。为了研究,写了一个示例代码:

成都创新互联从2013年创立,先为娄星等服务建站,娄星等地企业,进行企业商务咨询服务。为娄星企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。#include #include 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(" say:%d%d ",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指向类的成员函数的看法-创新互联
链接分享:http://bzwzjz.com/article/cdipic.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 网站建设开发 成都网站制作公司 成都网站制作 广安网站设计 企业网站设计 自适应网站设计 网站制作 成都网站建设流程 品牌网站建设 高端网站设计 响应式网站建设 成都网站设计制作公司 网站制作 成都网站设计 重庆外贸网站建设 企业网站建设 成都模版网站建设 成都网站建设公司 网站设计公司 成都网站制作 重庆网站建设 定制网站设计