Visual c++ vtable中重载方法的顺序(在win32上)

Visual c++ vtable中重载方法的顺序(在win32上),visual-c++,winapi,c++builder,vtable,Visual C++,Winapi,C++builder,Vtable,vtable中重载方法的顺序在win32编译器中是否始终相同 问题: 我有“接口”(没有数据成员的纯虚拟类)。它们可以通过来自不同编译器的指针使用(客户端通过调用标准的c dll工厂方法来获取指针)。这在不同的编译器(例如,使用borland编写的客户机、使用Visual C++编写的接口dll)中运行良好,只有一种方法除外。 此方法使用相同的返回值重载,但参数不同。此方法有4个版本。对该方法的相同调用会返回不同的结果,具体取决于编译客户端的编译器。快速查看汇编程序代码,我发现vtable中似乎

vtable中重载方法的顺序在win32编译器中是否始终相同

问题: 我有“接口”(没有数据成员的纯虚拟类)。它们可以通过来自不同编译器的指针使用(客户端通过调用标准的c dll工厂方法来获取指针)。这在不同的编译器(例如,使用borland编写的客户机、使用Visual C++编写的接口dll)中运行良好,只有一种方法除外。 此方法使用相同的返回值重载,但参数不同。此方法有4个版本。对该方法的相同调用会返回不同的结果,具体取决于编译客户端的编译器。快速查看汇编程序代码,我发现vtable中似乎有一个不同的偏移量(我不太擅长读取汇编程序)

现在我不知道,是我找到了原因,还是borland只是处理vtable与visual studio不同,而且一切都是正确的,我必须在别处搜索

致以最良好的问候,感谢您的回答


Tobias

vtable中的函数顺序是。不幸的是,ABI不是C++标准的一部分,所以不同编译器使用不同的ABI是很常见的。

< P>有两个可能的原因:要么客户端编译器选择的超载超乎您的预期,要么不同的编译器将重载放在不同的VTABLE条目中。p> 您传递/期望的参数是什么?超负荷解决可能是问题吗

如果是vtable条目,那么可以尝试重命名重载


在声明接口时,您是否尝试过使用目标编译器上可用的COM机制?例如,在MSVC中使用
接口
关键字,并为接口类提供GUID。COM接口应该按照声明的顺序在vtable中包含函数,因此,如果编译器共享相同的头,这在编译器之间是常见的。

不必是索引错误-它们的vtable中可以有完全不同大小的条目。除非他们的ABI匹配,否则不能保证任何东西都是一样的。当他们的ABI匹配时,这是有保证的


可能的ABI是由GCC和英特尔的C++编译器使用的IA64 ABI,或者是微软介绍的COM互操作。我现在找不到太多的支持文档,但据我所知,VisualStudio组重载了vtable中的函数,即使它们是单独声明的。这导致我们的构建在gcc中工作正常,但在VisualStudio中崩溃。我相信我们最终只是删除了重载函数,因为我们没有找到解决方法。

不过,在win32上,编译器会生成与COM兼容的vtables。这就是为什么这种方法有效(至少对于没有重载的函数是如此)。我们试图模拟获得编译器独立代码所需的机制,但仍然保持平台独立。COM是否允许重载函数?“COM是否允许重载函数”-否。这可能就是为什么不同编译器之间的布局兼容性到此为止。我们将尝试重命名。谢谢你的帮助。据我所知,win32上所有支持com的编译器都遵循com互操作ABI。这就是为什么这是有效的。我不知道这个ABI不允许重载函数——这就是为什么这个案例不起作用的原因。我不使用索引,但编译器将其放在代码中(只需查看程序集级别)。只要两个编译器为同一个函数放入相同的索引,vtable就具有相同的布局。这就解释了这一点。ABI允许重载函数(否则它早就坏了)。显然,它没有明确规定他们应该按什么顺序去做。我对VisualStudio的经验是,它根本不需要重新排序函数。