• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > Atl高手请进======================>>>>>>>>>

Atl高手请进======================>>>>>>>>>

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了Atl高手请进======================>>>>>>>>>等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: Atl高手请进======================>>>>>>>>>
描述:

#define offsetofclass(base, derived) ((DWORD)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)
是什么意思?
#define _ATL_PACKING 8
主要是下面这个
static_cast<base*>((derived*)_ATL_PACKING)


解决方案1:

这个宏变量返回drive的基类的虚指针的相对位移,让我们看下面一个例子。
#include <windows.h>
#include <iostream>
using namespace std;
 
class Base1 {
public:
       virtual void f() { }
};
 
class Base2 {
public:
       virtual void f() { }
};
 
class Base3 {
public:
       virtual void f() { }
};
 
class Drive : public Base1, public Base2, public Base3 {
};
 
#define _ATL_PACKING 8
 
#define offsetofclass(base, derived) 
       ((DWORD)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)
 
int main() {
       cout << offsetofclass(Base1, Drive) << endl;
       cout << offsetofclass(Base2, Drive) << endl;
       cout << offsetofclass(Base3, Drive) << endl;
       return 0;
}
 
类drive的内存分配如下
 
程序输出结果:
0
4
8
 
程序输出说明这个宏的返回值是其所指定的基类的虚指针的相对位置,在Don Box所写的《Essential COM》一书中,用了一个简单的宏来完成这些工作。我们把程序作一个小小的改动来展示一下Box的宏
#include <windows.h>
#include <iostream>
using namespace std;
 
class Base1 {
public:
       virtual void f() { }
};
 
class Base2 {
public:
       virtual void f() { }
};
 
class Base3 {
public:
       virtual void f() { }
};
 
class Drive : public Base1, public Base2, public Base3 {
};
 
#define BASE_OFFSET(ClassName, BaseName) 
       (DWORD(static_cast<BaseName*>(reinterpret_cast<ClassName*>
       (0x10000000))) - 0x10000000)
 
int main() {
       cout << BASE_OFFSET(Drive, Base1) << endl;
       cout << BASE_OFFSET(Drive, Base2) << endl;
       cout << BASE_OFFSET(Drive, Base3) << endl;
       return 0;
}
 
程序的输出结果和原先的程序一样。
 
让我们来用这些宏作一些练习,实际上我们是通过取得这些虚函数的相对位移来调用这些虚函数
#include <windows.h>
#include <iostream>
using namespace std;
 
class Base1 {
public:
       virtual void f() { cout << "Base1::f()" << endl; }
};
 
class Base2 {
public:
       virtual void f() { cout << "Base2::f()" << endl; }
};
 
class Base3 {
public:
       virtual void f() { cout << "Base3::f()" << endl; }
};
 
class Drive : public Base1, public Base2, public Base3 {
};
 
#define _ATL_PACKING 8
 
#define offsetofclass(base, derived) 
       ((DWORD)(static_cast<base*>((derived*)_ATL_PACKING))-_ATL_PACKING)
 
int main() {
       Drive d;
 
       void* pVoid = NULL;
 
       // call function of Base1
       pVoid = (char*)&d + offs
 
 
 

解决方案2:

算两个指针之间的偏移量。
因为一个类的所有对象的内存布局都是一样的,指针在内存中也只不过是一个数值,所以用8来代替与0xABCDFFF0是一样的。
那一句话相当于类型转化。就是要把指针从派生类的内存开始处移到基类的开始处,从而才能算出派生类与基类之间的内存偏移量。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-05 求WIN32多线程程序设计候捷的附带光盘源码!!!!!!!!!!高分
  • 2017-06-05 如何在程序运行时改变程序文件
  • 2017-06-04 关于ole拖放时使用Register()函数的问题
  • 2017-06-05 刚学习一些window编程,有个问题,不知道怎么回事,帮忙看下
  • 2017-06-04 COM的CLSID的一则疑问!
  • 2017-06-04 简单COM接口代码悬赏给高手
  • 2017-06-04 一个关于automation的简单问题
  • 2017-06-05 在WinCE下如何得到另一个程序中ListView中的值?
  • 2017-06-04 vc下怎么给activex控件添加事件例如添加onClick事件
  • 2017-06-05 往线程函数里传参数的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 怎样获得一个进程下面的线程?
    • DLL调用函数的问题,啊,急
    • 跪求,关于Directshow截取视频
    • 关于程序结构的问题!
    • 请帮帮忙!急!
    • 关于多线程的问题
    • 进程间关于消息SendMessage用法,快帮忙!急用
    • 如何获知点击的是否为iframe层!!!
    • 怎么样阻止一个EXE文件的运行,最好有例子
    • CAxWindow建立的窗口浏览网页时不能响应Textbox框中的backspace?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有