这些只是老式的 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);