如何控制纯虚类内存布局?

jjcang 2008-09-16 11:27:50
题目可能有些绕口,是这样的。
exe程序调用dll文件,接口是一个纯虚类,但是运行过程中发现调用虚函数时this指针传入有错误,
exe和dll是不同编译器编的,我想可能是这引起的,
由于我不清楚编译器如何布局纯虚类的vptable(c++也没要求如何布局),
我想有没有什么编译选项控制这种布局?
谢谢
...全文
123 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
e_sharp 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jjcang 的回复:]
而且我这个也不是扩展dll,用纯虚类做接口也是借助com的思想。
[/Quote]

那就直接用com好了
e_sharp 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jjcang 的回复:]
引用 1 楼 taodm 的回复:
用纯C接口。珍惜生命,远离扩展dll


用虚类就是想方便啊。有快1百个函数呢,我是动态GetProcess调用dll的,用c接口一个个赋值岂不是要疯了,
[/Quote]

还是用纯C接口,函数多,可以用参数来区分
jjcang 2008-09-16
  • 打赏
  • 举报
回复
而且我这个也不是扩展dll,用纯虚类做接口也是借助com的思想。
jjcang 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
用纯C接口。珍惜生命,远离扩展dll
[/Quote]

用虚类就是想方便啊。有快1百个函数呢,我是动态GetProcess调用dll的,用c接口一个个赋值岂不是要疯了,
太乙 2008-09-16
  • 打赏
  • 举报
回复
类的虚表指针就是this所指向的地址!lz可以把这四个字节复制到另一块内存,然后传递那个内存的值!
taodm 2008-09-16
  • 打赏
  • 举报
回复
用纯C接口。珍惜生命,远离扩展dll
jjcang 2008-09-16
  • 打赏
  • 举报
回复
虚函数已经找到了,说明vptable指针是正确的,不明白调用时为什么gcc多了4个字节。
可能是附带一些rtti的信息?
jjcang 2008-09-16
  • 打赏
  • 举报
回复
调用方式都是stdcall的,
就是this在栈中的位置不一样,vc直接取栈顶作为this,gcc在加了4个字节。
oyster2008 2008-09-16
  • 打赏
  • 举报
回复
这个应该跟纯虚类在内存中的布局无关,因为编译器最后生成了附加的代码来操作虚函数,这些代码会正确的找到函数
我觉得你可以检查一下参数的传递方式,如__cdecl、__stdcall等,如果不一样,则有可能出现错误
jjcang 2008-09-16
  • 打赏
  • 举报
回复
算了。结贴。
编译器的不同,以后再深究吧。
iiarchitecture 2008-09-16
  • 打赏
  • 举报
回复
不懂,学习中。。。
jjcang 2008-09-16
  • 打赏
  • 举报
回复
还是没有解决问题啊。up
我还是用c接口了,但是c++这个问题还没有弄清楚
目 录 译者序 前言 第1章 对象的演化 1.1基本概念 1.1.1对象:特性十行为 1.1.2继承:类型关系 1.1.3多态性 1.1.4操作概念:OOP程序像什么 1.2为什么C++会成功 1.2.1较好的C 1.2.2采用渐进的学习方式 1.2.3运行效率 1.2.4系统更容易表达和理解 1.2.5“库”使你事半功倍 1.2.6错误处理 1.2.7大程序设计 1.3方法学介绍 1.3.1复杂性 1.3.2内部原则 1.3.3外部原则 1.3.4对象设计的五个阶段 1.3.5方法承诺什么 1.3.6方法应当提供什么 1.4起草:最小的方法 1.4.1前提 1.4.2高概念 1.4.3论述(treatment) 1.4.4结构化 1.4.5开发 1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个袖珍C库 2.3放在一起:项目创建工具 2.4什么是非正常 2.5基本对象 2.6什么是对象 2.7抽象数据类型 2.8对象细节 2.9头文件形式 2.10嵌套结构 2.11小结 2.12练习 第3章 隐藏实现 3.1设置限制 3.2C++的存取控制 3.3友元 3.3.1嵌套友元 3.3.2它是纯的吗 3.4对象布局 3.5类 3.5.1用存取控制来修改stash 3.5.2用存取控制来修改stack 3.6句柄类(handleclasses) 3.6.1可见的实现部分 3.6.2减少重复编译 3.7小结 3.8练习 第4章 初始化与清除 4.1用构造函数确保初始化 4.2用析构函数确保清除 4.3清除定义块 4.3.1for循环 4.3.2空间分配 4.4含有构造函数和析构函数的stash 4.5含有构造函数和析构函数的stack 4.6集合初始化 4.7缺省构造函数 4.8小结 4.9练习 第5章 函数重载与缺省参数 5.1范围分解 5.1.1用返回值重载 5.1.2安全类型连接 5.2重载的例子 5.3缺省参数 5.4小结 5.5练习 第6章 输入输出流介绍 6.1为什么要用输入输出流 6.2解决输入输出流问题 6.2.1预先了解操作符重载 6.2.2插入符与提取符 6.2.3通常用法 6.2.4面向行的输入 6.3文件输入输出流 6.4输入输出流缓冲 6.5在输入输出流中查找 6.6strstreams 6.6.1为用户分配的存储 6.6.2自动存储分配 6.7输出流格式化 6.7.1内部格式化数据 6.7.2例子 6.8格式化操纵算子 6.9建立操纵算子 6.10输入输出流实例 6.10.1代码生成 6.10.2一个简单的数据记录 6.11小结 6.12练习 第7章 常量 7.1值替代 7.1.1头文件里的const 7.1.2const的安全性 7.1.3集合 7.1.4与C语言的区别 7.2指针 7.2.1指向const的指针 7.2.2const指针 7.2.3赋值和类型检查 7.3函数参数和返回值 7.3.1传递const值 7.3.2返回const值 7.3.3传递和返回地址 7.4类 7.4.1类里的const和enum 7.4.2编译期间类里的常量 7.4.3const对象和成员函数 7.4.4只读存储能力 7.5可变的(volatile) 7.6小结 7.7练习 第8章 内联函数 8.1预处理器的缺陷 8.2内联函数 8.2.1类内部的内联函数 8.2.2存取函数 8.3内联函数和编译器 8.3.1局限性 8.3.2赋值顺序 8.3.3在构造函数和析构函数里隐藏行为 8.4减少混乱 8.5预处理器的特点 8.6改进的错误检查 8.7小结 8.8练习 第9章 命名控制 9.1来自C语言中的静态成员 9.1.1函数内部的静态变量 9.1.2控制连接 9.1.3其他的存储类型指定符 9.2名字空间 9.2.1产生一个名字空间 9.2.2使用名字空间 9.3C++中的静态成员 9.3.1定义静态数据成员的存储 9.3.2嵌套类和局部类 9.3.3静态成员函数 9.4静态初始化的依赖因素 9.5转换连接指定 9.6小结 9.7练习 第10章 引用和拷贝构造函数 10.1C++中的指针 10.2C+十中的引用 10.2.1函数中的引用 10.2.2参数传递准则 10.3拷贝构造函数 10.3.1传值方式传递和返回 10.3.2拷贝构造函数 10.3.3缺省拷贝构造函数 10.3.4拷贝构造函数方法的选择 10.4指向成员的指针(简称成员指针) 10.5小结 10.6练习 第11章 运算符重载 1
MetaQuotes Language 5 (MQL5)是一种高水平编程语言,专为开发技术指标、EA交易和实用应用程序而设计,进而使金融交易自动化。本课程为MT5/MQL5智能交易编程学习,从零基础开始讲解,全面掌握MQL5基础语法,熟练使用MQL5常用函数API,实战开发EA自动化交易程序,从入门到精通,进而能够进行自动交易策略开发,走上EA自动化交易之路。本课程学习过程分为三个阶段:第一阶段、MQL5语言基础学习:通过MQL5语法基础学习,能够快速掌握MetaEditor编辑器使用和基础编程语法,为后续学习MQL5函数API,进行实战学习打下良好基础。内容包括:MT5基本功能介绍、MetaEditor编辑器、基本数据类型、常量和变量、枚举类型、结构体、数组、算数运算符、关系运算符、逻辑运算符、条件判断、循环、函数、类的定义、类的成员变量和函数、类的构造函数、类的析构函数、类的函数重载、类的成员变量的访问权限、类的继承、类的多态、抽象类和纯虚函数。第二阶段:MQL5函数API详解:此阶段为进阶过程,在学习了解MT5交易平台的基础上,掌握如何通过程序获取交易数据、控制交易过程,模拟交易策略,实现自动化交易。内容包括:帮助手册讲解、智能EA指标脚本运行框架、获取账户、客户端、货币信息、获取交易品种信息、获取市场深度信息、获取财经日历信息、K线数据、时间序列、指标访问、获取订单信息、下单、挂单操作、图表窗口操作、图表上画对象、脚本开发实例、指标开发实例、智能EA开发实例、历史数据回测及参数优化、发送邮件、警报、消息提醒、信号订阅、跟单、文件操作、标准程序库。第三阶段:EA交易程序实战:通过前面两个阶段的学习,已经掌握了MT5量化交易编程的基础知识和能力,在实战阶段结合策略交易的关键环节,通过多个实战示例,讲解如何进行仓位管理、风险控制、止盈止损、指标定制等,实现复杂的交易策略逻辑,提高程序自动化交易的实战能力。内容包括:一个简单趋势EA、订单请求合法性校验、三重时间框架、仓位管理、移动止损、移动止盈、隐藏止盈止损价格、风险控制、时间控制、参数控制、展示面板、统计分析、持仓单一键平仓脚本、六类挂单一键取消脚本、按时间标记位置脚本、按价格标记位置脚本、双线一柱变色MACD指标。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧