maoyeahcom 2015-08-23 11:08 采纳率: 100%
浏览 2119
已采纳

VC++、DLL、虚函数、调用约定

关于“VC++、DLL、虚函数、调用约定”的一个问题折腾我很久了,希望CSDN的朋友可以助我解决问题。

DLL里,接口类的虚函数(非纯虚函数),应该怎样调用约定?


背景描述:
一个DLL工程A(接口),有个接口类AI,里面全是纯虚函数。
一个EXE工程B(平台),有个成员变量mc类型是类AI。
一个DLL工程C(游戏),有个类是类AI的子类,即实现类,对类AI的所有接口(纯虚函数)进行了实现。

原理是:
平台只有一个在跑,而游戏是N个,工程B(平台)的mc被赋值成工程C(游戏)的对象,通过工程A的接口,mc可以调用工程C(游戏)里的函数(接口的实现)。

问题:
我在开发一个新游戏时,发现工程A(接口)类AI的接口不够用,想新增一个接口,于是加入了一个”虚函数“,注意不是“纯虚函数”,为的是不影响之前所有已有的游戏(不然之前的游戏不作任何改动而编译 会报error C2259: 不能实例化抽象类),即之前的游戏不用实现这个接口,修改工程B(平台)调用这个函数时是工程A(接口)新增的接口,若游戏实现这个接口,就调用游戏里的实现函数;若游戏没有定义这个接口(之前的游戏),则调用工程A(接口)类AI里的虚函数(里面只有一句调试打印)。

但发现,有的游戏是正常的,有的游戏不正常。不正常的游戏,调试工程B(平台)在调用新接口时提示:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

百度了一下,很多人说是调名约定的问题。
工程A、工程B、所有的游戏工程C,工程选项里都是 __cdecl (/Gd)。

于是我在工程A、工程C里下面几种尝试:
virtual void OnEventABC(int a, bool b); //没写调用约定,有的游戏正常,有的游戏出错
virtual void __stdcall OnEventABC(int a, bool b); //所有的游戏都出错
virtual void __cdecl OnEventABC(int a, bool b); //所有的游戏都出错
virtual void WINAPI OnEventABC(int a, bool b); //所有的游戏都出错


请问大家,怎么解决这个问题,是调名约定的问题,还是其它什么问题?

  • 写回答

3条回答 默认 最新

  • maoyeahcom 2015-08-24 04:15
    关注

    问题已解决,谢谢大家的无语让我自己解决了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译