C++ 在虚拟表中查询函数偏移量

C++ 在虚拟表中查询函数偏移量,c++,visual-studio-2005,wxwidgets,virtual-functions,C++,Visual Studio 2005,Wxwidgets,Virtual Functions,是否存在依赖于调试编译器(Visual Studio 2005)的方法来确定对象的虚拟表的大小或特定函数的偏移量?我想补充一些主张 更大的问题(上下文):大型工业应用程序,我刚刚开始维护,我收到“运行时检查失败#0-ESP的值未在函数调用中正确保存。[bla bla bla]”,因为虚拟函数调用指向错误的函数。原因是什么?包含文件顺序很重要(没有预编译头)。如果在“windows.h”之后包含“ws\winundef.h”(wxWidgets:),则其工作正常 从调试器的监视窗口编辑:错误的函数

是否存在依赖于调试编译器(Visual Studio 2005)的方法来确定对象的虚拟表的大小或特定函数的偏移量?我想补充一些主张

更大的问题(上下文):大型工业应用程序,我刚刚开始维护,我收到“运行时检查失败#0-ESP的值未在函数调用中正确保存。[bla bla bla]”,因为虚拟函数调用指向错误的函数。原因是什么?包含文件顺序很重要(没有预编译头)。如果在“
windows.h
”之后包含“
ws\winundef.h
”(wxWidgets:),则其工作正常

从调试器的监视窗口编辑:错误的函数指针是0x0a01dec5[thunk]:MyPanel:
vcall'{696,{flat}}'
,好的函数指针是0x0a12e041[thunk]:MyPanel::
vcall'{692,{flat}}'
如何访问这些内容?

vtbl的大小在不同的TU之间不会发生变化,因此检查它对您没有帮助


您需要做的是确保在包含wxWidgets头之前,永远不要包含
。如果您需要包含它(大多数情况下不应该包含),请改为包含
。在您的PCH中执行此操作(并确保项目中的所有文件都使用PCH)几乎是解决问题的必然方法。

我没有解决方案,我只是想说“很抱歉,您必须维护它”。使用强制包含的
windows.h
包装器。在Visual Studio中,您可以在项目属性中设置该字符。很抱歉设置了格式,有些人确实使用了该字符!@-干杯,再见Alf这个“强制包含”是否比预编译头更好?我的最后一个想法是通过表访问函数(在上面的示例中为+692),从pdb文件中获取函数名,并将其与预期值进行比较。我已经这样做了(顺序:
windows.h
before
winundef.h
),但是
wrapwin.h
甚至更好:“如果!定义(WXMSW)#定义WXMSW#endif#定义WIN32#和#包括`谢谢,这解决了我的问题,但这不是我问题的答案。如果你再投一张赞成票,你可能会得到一笔赏金,但我的分数太低了:(,我的第一笔赏金将是在我获得1100分之后(如果有的话)