我想用 OpenWatcom 编译一个 Photoshop Filter 插件。该代码已经存在并且与 Visual Studio 完美配合。
该函数如下所示:
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 编译器会做什么。我确实认为 Visual Studio 默认使用不同的调用约定。所以我尝试在 OpenWatcom 中指定__stdcall
,__cdecl
或__pascal
,但这并没有太大帮助。
我的一个问题是,如果未指定任何内容,Visual Studio 的默认调用约定到底是什么?究竟将什么放入寄存器,在堆栈上的哪个方向,以及谁清理堆栈?我在任何地方都找不到这些信息。
如果我知道确切的行为,我也许可以使用 OpenWatcom 中的“#pragma aux”功能来强制执行自定义调用约定?
或者您知道我可以尝试修复 OpenWatcom 中的调用约定的其他内容吗?