#define THIS_ 的含义

Meaning of #define THIS_

例如,有一个名为CreateFrame的函数,

virtual STDMETHODIMP CreateFrame(THIS_ LPCSTR Name, 
LPD3DXFRAME*ppNewFrame);

我认为 STDMETHODIMP 意味着它将 return HResult 和 stdcall 函数, 但我不知道参数 menas 中的 THIS_ 是什么。

THIS_ 在 combaseapi.h 中这样定义。

  #define PURE                    = 0
  #define THIS_
  #define THIS                    void

有关详细信息,函数 'CreateFrame ' 会在以下时间自动调用 D3DXLoadMeshHierarchyFromX 被调用。

那些只是 old-school COM 宏。不要担心它们,特别是因为您正在查看 13 多年前遗留 Direct3D 9 的已弃用的 D3DX header...

virtual STDMETHODIMP Func(THIS);

这是一个接受 ONE 参数的函数:隐含的 this 指针,returns 和 HRESULT,并被注释为正确的COM 调用约定 __stdcall.

virtual STDMETHODIMP Func(THIS_ LPCSTR Name, LPD3DXFRAME*ppNewFrame);

这是一个带有 三个 参数的函数:隐式 this 指针、指向字符串的指针和指向特定 object 的指针), returns 和 HRESULT,并针对正确的 COM 调用约定进行了注释。

要声明一个 returns 不是 HRESULT 类型的函数,您需要使用 STDMETHOD_:

virtual STDMETHOD_(ULONG, Func) (THIS_ LPCSTR Name, LPD3DXFRAME*ppNewFrame);

这些旧的 header 通常也支持从 C 而不是 C++ 使用,其中 this 不是隐含的。旧版 D3DX 从不使用 C call-paths,但许多旧系统 header 确实使用了它们。事实上,如果您在 combaseapi.h 中再深入一点,您会看到 C 语言部分将 THIS_THIS 定义为:

#define PURE
#define THIS_                   INTERFACE FAR* This,
#define THIS                    INTERFACE FAR* This

更现代的 MIDL 编译器生成的代码不太容易混淆:

virtual HRESULT STDMETHODCALLTYPE Func(void);

virtual void STDMETHODCALLTYPE Func(UINT value, LPCWSTR name);