为什么IUnknown类中的方法声明为__stdcall
Why are the methods in IUnknown class declared as __stdcall
我是新来的COM。为什么接口方法QueryInterface
、AddRef
和Release
被声明为具有__stdcall而不是任何其他调用(__cdlecl、__thiscall等)?
是否支持从其他语言调用?
我认为这个问题对那些知道COM的人来说很简单。
COM是一个二进制接口标准,允许用一种语言编写的代码调用用另一种语言编写的函数。必须有一些最低限度的保证,这样的调用可以得到一个好的结果,语言对于实现自己的函数调用的方式有不同的标准。
有太多的调用约定。有__stdcall, __cdecl, __thiscall, __fastcall, __clrcall在32位代码中很常见。在空间,时间,灵活性和安全性之间的权衡都是不同的。语言实现者倾向于提出他们自己的,通常是__fastcall的一些变体。
这是不行的,COM设计师必须把它钉在墙上,给代码一个互操作的机会。他们选择了一个明显的选择,怀疑他们花了很多时间权衡选项,他们使用了调用约定,也用于进行操作系统调用。在Windows上运行语言运行库隐含的是,它需要知道如何进行操作系统调用。所以他们选择了__stdcall。
相关文章:
- 声明高维向量的更简洁的方法
- 模板方法访问正向声明的类仅在没有此指针的情况下无法编译
- 将子类方法声明为基类的友元
- 如何在声明为 const 的方法中更改类成员
- 编译器无法识别在类声明之外定义的方法
- 在类中声明 Array 成员的正确方法
- 如何在该接收类之外声明嵌套类的方法
- 转发声明在命名空间中不起作用的替代方法
- 在实现文件中使用模板参数声明方法
- 为什么在主方法之前声明方法会产生错误 c++
- 在 cpp 正文中声明方法时未定义的符号
- 声明方法时没有名称空间,也没有对C 作用的方法的对象
- 无法在类中声明方法 (C++_
- 可变声明方法
- 为什么这种前向声明方法会产生错误
- 在c++中可以通过模板声明方法吗?
- 在c++中声明方法时= 0的含义是什么?
- 为什么我需要为部分模板专门化重新声明方法/成员?
- 两种数组声明方法的区别
- 强制编译器声明方法是否已被实现- c++