C++ OpenWatcom/VisualStudio在重新调用约定中的互操作性

C++ OpenWatcom/VisualStudio在重新调用约定中的互操作性,c++,visual-c++,calling-convention,watcom,C++,Visual C++,Calling Convention,Watcom,我想用OpenWatcom编译一个Photoshop过滤器插件。 该代码已经存在,并且可以与VisualStudio完美配合使用 函数如下所示: extern "C" __declspec(export) void PluginMain(short selector, FilterRecordPtr pb, intptr_t *data, short *result); 它在Visual C++中运行良好。请注意,没有明确指定调用约定,Adobe不会在其SDK头文件中定义任何调用约定 虽然它在

我想用OpenWatcom编译一个Photoshop过滤器插件。 该代码已经存在,并且可以与VisualStudio完美配合使用

函数如下所示:

extern "C" __declspec(export) void PluginMain(short selector, FilterRecordPtr pb, intptr_t *data, short *result);

它在Visual C++中运行良好。请注意,没有明确指定调用约定,Adobe不会在其SDK头文件中定义任何调用约定

虽然它在VC++中工作,但在OpenWatcom中却不起作用,而且调用约定似乎不正确。即使使用HelloWorld函数,我也会出现奇怪的行为,比如堆栈损坏

在Wikipedia,我查看了带有调用约定的表:如果没有指定调用约定,Watcom将参数放入寄存器EAX、EDX、EBX、ECX中,堆栈从右向左填充,被调用方清理堆栈。但该表没有说明如果未指定调用约定,Microsoft编译器会做什么。 我确实认为VisualStudio使用不同的调用约定作为默认值。 所以我试着在OpenWatcom中指定uu stdcall、u cdecl或u pascal,但没有多大帮助

我的一个问题是,如果未指定任何内容,VisualStudio的默认调用约定到底是什么?究竟什么会被放入寄存器,在堆栈上的哪个方向,谁来清理堆栈?我在任何地方都找不到这个信息

如果我知道确切的行为,我可能能够使用OpenWatcom中的pragma aux功能来强制执行自定义调用约定

或者你知道我可以尝试在OpenWatcom中修复调用约定的其他方法吗?

从注释开始移动


VisualC++中的默认调用约定是,虽然./P>


综上所述,Watcom似乎也有类似的选项集——ecc应该将其设置为默认使用cdecl。

VC++中的默认调用约定是cdecl,尽管可以通过命令行开关进行更改。Watcom调用约定似乎与VC++的fastcall有点相似。出于好奇,你为什么要冒险使用一个如今深奥的编译器,它采用自己的调用约定来构建一个插件,所以正确的ABI是最重要的?非常感谢你对cdecl的提示。我不知道,我假设C++有STDCALL作为默认值。你能把它作为答案贴出来吗?我发现调用约定可以在OpenWatcom中的选项->C编译器开关->内存模型和处理器开关中更改。在那里,选择Pentium Pro基于堆栈的调用默认为Pentium Pro基于寄存器的调用。那么,一切都是有效的:-对于你的问题:它有两个原因。第一个原因是,在我的休闲时间里,我喜欢用非常古老的软件工作和实验,年代是90年代——毕竟,这些古老的东西为我们的现代计算机技术铺平了道路。第二个原因是,我从事一个开源项目,在构建说明中,我想告诉人们哪些编译器根本不工作,哪些正在工作,以及如何配置它们。很高兴它起到了作用,我将把它转移到aswer。我完全理解老式软件的魅力,我怀疑这背后有某种动机-