繁体   English   中英

OpenWatcom / VisualStudio在调用约定中的互操作性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM