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

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条)

报告相同问题?

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境