程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> vc++-VC++、DLL、虛函數、調用約定

vc++-VC++、DLL、虛函數、調用約定

編輯:編程綜合問答
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); //所有的游戲都出錯


請問大家,怎麼解決這個問題,是調名約定的問題,還是其它什麼問題?

最佳回答:


問題已解決,謝謝大家的無語讓我自己解決了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved