为什么IUnknown类中的方法声明为__stdcall

Why are the methods in IUnknown class declared as __stdcall

本文关键字:声明 方法 stdcall IUnknown 为什么      更新时间:2023-10-16

我是新来的COM。为什么接口方法QueryInterfaceAddRefRelease被声明为具有__stdcall而不是任何其他调用(__cdlecl、__thiscall等)?

是否支持从其他语言调用?

我认为这个问题对那些知道COM的人来说很简单。

COM是一个二进制接口标准,允许用一种语言编写的代码调用用另一种语言编写的函数。必须有一些最低限度的保证,这样的调用可以得到一个好的结果,语言对于实现自己的函数调用的方式有不同的标准。

有太多的调用约定。有__stdcall, __cdecl, __thiscall, __fastcall, __clrcall在32位代码中很常见。在空间,时间,灵活性和安全性之间的权衡都是不同的。语言实现者倾向于提出他们自己的,通常是__fastcall的一些变体。

这是不行的,COM设计师必须把它钉在墙上,给代码一个互操作的机会。他们选择了一个明显的选择,怀疑他们花了很多时间权衡选项,他们使用了调用约定,也用于进行操作系统调用。在Windows上运行语言运行库隐含的是,它需要知道如何进行操作系统调用。所以他们选择了__stdcall。