[英]OpenWatcom / VisualStudio interoperability in re calling conventions
我想用OpenWatcom编译一个Photoshop滤镜插件。 该代码已经存在,并且可以与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使用不同的调用约定作为默认值。 于是,我就指定__stdcall
, __cdecl
或__pascal
在OpenWatcom,但它并没有多大帮助。
我的问题之一是,如果未指定任何内容,Visual Studio的默认调用约定到底是什么? 究竟将什么内容放入寄存器中,在堆栈上的哪个方向上,谁清理堆栈? 我在任何地方都找不到此信息。
如果我知道确切的行为,我是否可以使用OpenWatcom中的“ #pragma aux”功能来实施自定义调用约定?
还是您知道我可以尝试在OpenWatcom中修复调用约定的其他内容?
(从评论中移出)
尽管可以通过命令行开关( /Gd
, /Gr
, /Gv
, /Gz
)进行更改 ,但Visual C ++中的默认调用约定为cdecl 。
-ecc
阅读一下,似乎Watcom也具有类似的选项集-ecc
应该将其默认设置为使用cdecl
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.