c++ - 我应该提到纯虚函数中的调用约定吗?

标签 c++ windows com calling-convention

这是一个例子,IUnknown interface来自 Windows SDK 中的 Unknown.h:

  • 在 C++ 中:
IUnknown {
    public:
        virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
                REFIID riid,
                void** ppvObject) = 0;
        //AddRef
        //Release
};
  • 在 C 中:
typedef struct IUnknownVtbl {
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IUnknown* This,
        REFIID riid,
        void **ppvObject);
    //AddRef
    //Release
} IUnknownVtbl;

interface IUnknown {
    CONST_VTBL IUnknownVtbl* lpVtbl;
};

您可以在 __stdcall 虚函数之前看到 STDMETHODCALLTYPE(通常)。所以,我的问题是,在纯虚函数中提及调用约定是否重要?还是通过编译器或编译器选项(例如 /Gz for __stdcall)在虚函数内部管理调用约定?

此外,当我在源代码中(或使用任何编译器选项)未提及任何虚函数之前的调用约定时,可执行文件工作正常。

最佳答案

您需要指定它们。您通过(本质上)函数指针调用函数这一事实没有任何区别 - 调用者和被调用函数仍然需要就参数传递顺序等问题达成一致。

但是为什么您需要在基类中指定它们?

首先,如果你不这样做,我希望编译器会提示,其次,你可能通过一个对象或(更有可能)指向所述基类对象的指针来调用所述函数,在这种情况下,基类是编译器必须继续进行的所有工作。

关于c++ - 我应该提到纯虚函数中的调用约定吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52457407/

相关文章:

c# - 通过网络共享锁定行为不同

vb.net - 发生 COMException - 未知名称。 (来自 HRESULT : 0x80020006 (DISP_E_UNKNOWNNAME)) when trying to modify an existing excel file 的异常

c# - 来自 Microsoft 的 Dia2Lib 的 0x806D0005 的 HRESULT

c++ - Com interop : Why tlibimp. exe 生成只读属性?

c++ - 在 C++ 中相交 vector

c++ - 构建选项已更改,正在重建所有退出状态 1 [Error] Exit with code=1 MXChip Azure IoT Dev Kit

c - 当 DPI 设置为 150% 时关闭 Aero (Windows 7),全屏窗口仅覆盖任务栏

windows - 在 Windows 上调度作业

C++ Hello World 不工作?

c++ - 如何将 error_code 设置为 asio::yield_context