重新调用约定中的 OpenWatcom / VisualStudio 互操作性
OpenWatcom / VisualStudio interoperability in re calling conventions
我想用 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"-函数,我也会出现奇怪的行为,例如堆栈损坏)。
在维基百科上,我查看了 table 的调用约定:The table says 如果没有指定调用约定,Watcom 将参数放入寄存器 "EAX, EDX, EBX, ECX",堆栈填充正确向左,被调用者清理堆栈。但是 table 没有说明如果没有指定调用约定,Microsoft 编译器会做什么。
我确实认为 Visual Studio 默认使用不同的调用约定。
所以我尝试在 OpenWatcom 中指定 __stdcall
、__cdecl
或 __pascal
,但没有太大帮助。
我的一个问题是,如果没有指定,Visual Studio 的默认调用约定到底是什么?究竟将什么放入寄存器,堆栈的哪个方向,谁清理堆栈?我在任何地方都找不到此信息。
如果我知道确切的行为,我或许可以使用 OpenWatcom 中的“#pragma aux”功能来强制执行自定义调用约定?
或者你知道我可以尝试修复 OpenWatcom 中的调用约定的其他方法吗?
(来自评论)
Visual C++ 中的默认调用约定是 cdecl, although it can be changed through a command-line switch (/Gd
, /Gr
, /Gv
, /Gz
)。
仔细阅读,似乎 Watcom 也有一组类似的选项 - -ecc
应该将其设置为默认使用 cdecl
。
我想用 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"-函数,我也会出现奇怪的行为,例如堆栈损坏)。
在维基百科上,我查看了 table 的调用约定:The table says 如果没有指定调用约定,Watcom 将参数放入寄存器 "EAX, EDX, EBX, ECX",堆栈填充正确向左,被调用者清理堆栈。但是 table 没有说明如果没有指定调用约定,Microsoft 编译器会做什么。
我确实认为 Visual Studio 默认使用不同的调用约定。
所以我尝试在 OpenWatcom 中指定 __stdcall
、__cdecl
或 __pascal
,但没有太大帮助。
我的一个问题是,如果没有指定,Visual Studio 的默认调用约定到底是什么?究竟将什么放入寄存器,堆栈的哪个方向,谁清理堆栈?我在任何地方都找不到此信息。
如果我知道确切的行为,我或许可以使用 OpenWatcom 中的“#pragma aux”功能来强制执行自定义调用约定?
或者你知道我可以尝试修复 OpenWatcom 中的调用约定的其他方法吗?
(来自评论)
Visual C++ 中的默认调用约定是 cdecl, although it can be changed through a command-line switch (/Gd
, /Gr
, /Gv
, /Gz
)。
仔细阅读,似乎 Watcom 也有一组类似的选项 - -ecc
应该将其设置为默认使用 cdecl
。