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