0

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

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

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

THIS_ 像这样在 combaseapi.h 中定义。

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

有关详细信息,调用 D3DXLoadMeshHierarchyFromX 时会自动调用函数“CreateFrame”。

4

1 回答 1

0

这些只是老式的 COM 宏。不用担心它们,尤其是因为您正在查看 13 多年前旧版 Direct3D 9 已弃用的 D3DX 标头...

virtual STDMETHODIMP Func(THIS);

这是一个接受ONE参数的函数:隐式this指针,返回一个HRESULT,并为正确的 COM 调用约定进行了注释__stdcall

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

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

要声明一个返回类型以外的类型的函数,HRESULT请使用STDMETHOD_

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

这些旧的头文件通常也支持从 C 而不是 C++ 中使用,这this不是隐含的。Legacy D3DX 从来不关心 C 调用路径,但许多旧的系统头文件确实使用了它们。事实上,如果你再深入一点,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);
于 2017-08-18T00:58:58.413 回答