maoyeahcom
2015-08-23 11:08
采纳率: 100%
浏览 2.1k

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
    已采纳

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

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • threenewbee 2015-08-23 11:21

    你没有传this指针,导致堆栈不平衡。

    评论
    解决 无用
    打赏 举报
  • maoyeahcom 2015-08-23 12:56

    请问工程A、C如何写,工程B里调用如何写?

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题