关于 STDMETHOD 和 STDMETHODIMP 的定义

本文详细介绍了STDMETHOD宏的使用方法及其在接口定义和实现中的作用。通过具体的代码示例展示了如何利用STDMETHOD来定义和实现COM接口中的成员函数。
  #define   STDMETHOD(method)               virtual   HRESULT   STDMETHODCALLTYPE   method   
  #define   STDMETHODCALLTYPE               __stdcall   
  这样当写一个函数STDMETHOD(func(int   i))       展开:     virtual   HRESULT   __stdcall   func(int   i);   
    
  这样就这义了一个虚函数func。当然了这个虚函数只能放在接口定义中了。   
  所以STDMETHOD宏是用于定义接口用的。放在头文件中用。   
    
  当要在CPP中实现这个方法时就用到另一个宏STDMETHOD   
  #define   STDMETHODIMP                         HRESULT   STDMETHODCALLTYPE   

  #define   STDMETHODCALLTYPE               __stdcall   


  这样CPP文件中,STDMETHODIMP(func(int   i))   展开:   HRESULT   __stdcall   func(int   i);   
#ifndef _DCOMPFACTORY_H_ #define _DCOMPFACTORY_H_ #ifdef _WIN32 #include <Unknwnbase.h> namespace D2DRENDER { // COM接口化 // {E1818A78-D4DD-4234-ACA1-15BFD37E80CB} // IMPLEMENT_OLECREATE(<< class >> , << external_name >> , // 0xe1818a78, 0xd4dd, 0x4234, 0xac, 0xa1, 0x15, 0xbf, 0xd3, 0x7e, 0x80, 0xcb); MIDL_INTERFACE("E1818A78-D4DD-4234-ACA1-15BFD37E80CB") IDcompFactory :public IUnknown { STDMETHOD_(HRESULT, QueryInterface)(REFIID riid, void** ppvObject)PURE; STDMETHOD_(ULONG, AddRef)()PURE; STDMETHOD_(ULONG, Release)()PURE; STDMETHOD(DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID iid, void** device)PURE; }; // {CE28B6E9-665D-464F-A613-43A46830BBBF} // IMPLEMENT_OLECREATE(<< class >> , << external_name >> , // 0xce28b6e9, 0x665d, 0x464f, 0xa6, 0x13, 0x43, 0xa4, 0x68, 0x30, 0xbb, 0xbf); MIDL_INTERFACE("CE28B6E9-665D-464F-A613-43A46830BBBF") IDcompFactory1 :public IDcompFactory { STDMETHOD(DCompositionCreateDevice2)(IUnknown* d2dDevice, REFIID iid, void** device)PURE; }; IDcompFactory* CoCreateDcompFactory(); } #endif //_WIN32 #endif // !_DCOMPFACTORY_H_ #include "DcompFactory.h" #include "SystemDetector.h" #include <dxgi.h> #include <d2d1_1.h> using namespace D2DRENDER; // 匹配 dcomp.h 中的 DCompositionCreateDevice 函数原型 typedef HRESULT(WINAPI* fDCompositionCreateDevice)( IDXGIDevice* dxgiDevice, REFIID riid, void** ppv ); // 匹配 dcomp.h 中的 DCompositionCreateDevice2 函数原型 typedef HRESULT(WINAPI* fDCompositionCreateDevice2)( IUnknown* renderingDevice, REFIID riid, void** ppv ); class CDcompFactory1; class CDcompFactory : public IDcompFactory { friend class CDcompFactory1; public: CDcompFactory(); ~CDcompFactory(); STDMETHOD_(HRESULT, QueryInterface)(REFIID riid, void** ppvObject); STDMETHOD_(ULONG, AddRef)(); STDMETHOD_(ULONG, Release)(); STDMETHOD(DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID riid, void** ppv); private: DWORD m_dwRefCount; HMODULE m_hModule; fDCompositionCreateDevice m_pfDCompositionCreateDevice; }; CDcompFactory::CDcompFactory(): m_dwRefCount(0), m_hModule(nullptr), m_pfDCompositionCreateDevice(nullptr) { m_hModule = LoadLibrary("dcomp.dll"); if (m_hModule) { m_pfDCompositionCreateDevice = (fDCompositionCreateDevice)GetProcAddress(m_hModule, "DCompositionCreateDevice"); } } CDcompFactory::~CDcompFactory() { if(m_hModule)FreeLibrary(m_hModule); } STDMETHODIMP CDcompFactory::QueryInterface(REFIID riid, void** ppvObject) { if (riid == __uuidof(IDcompFactory)) { *ppvObject = this; AddRef(); return S_OK; } else { *ppvObject = nullptr; return E_NOINTERFACE; } } STDMETHODIMP_(ULONG) CDcompFactory::AddRef() { return InterlockedIncrement(&m_dwRefCount); } STDMETHODIMP_(ULONG) CDcompFactory::Release() { ULONG ulCount = InterlockedDecrement(&m_dwRefCount); if (ulCount == 0) { delete this; } return ulCount; } STDMETHODIMP CDcompFactory::DCompositionCreateDevice(IUnknown* dxgiDevice, REFIID riid, void** ppv) { IDXGIDevice* pDXGIDevice = nullptr; if ( !dxgiDevice || FAILED(dxgiDevice->QueryInterface(IID_PPV_ARGS(&pDXGIDevice))) ) { return E_INVALIDARG; } if (m_pfDCompositionCreateDevice == nullptr) { pDXGIDevice->Release(); return E_NOINTERFACE; } HRESULT hr = m_pfDCompositionCreateDevice(pDXGIDevice, riid, ppv); pDXGIDevice->Release(); return hr; } /***************************************************************************************************************************************************/ class CDcompFactory1 : public IDcompFactory1 { public: CDcompFactory1(): m_dwRefCount(0), m_pfDCompositionCreateDevice2(nullptr) { if (m_dcompFactory.m_hModule)//检测模块是否已经加载 { m_pfDCompositionCreateDevice2 = (fDCompositionCreateDevice2)GetProcAddress(m_dcompFactory.m_hModule, "DCompositionCreateDevice2"); } } STDMETHOD_(HRESULT, QueryInterface)(REFIID riid, void** ppvObject) { if (riid == __uuidof(IDcompFactory)) { *ppvObject = &m_dcompFactory; m_dcompFactory.AddRef(); return S_OK; } if (riid == __uuidof(IDcompFactory1)) { *ppvObject = this; AddRef(); return S_OK; } else { *ppvObject = nullptr; return E_NOINTERFACE; } } STDMETHOD_(ULONG, AddRef)() { return InterlockedIncrement(&m_dwRefCount); } STDMETHOD_(ULONG, Release)() { ULONG ulCount = InterlockedDecrement(&m_dwRefCount); if (ulCount == 0) { delete this; } return ulCount; } STDMETHOD(DCompositionCreateDevice)(IUnknown* dxgiDevice, REFIID riid, void** ppv) { return m_dcompFactory.DCompositionCreateDevice(dxgiDevice, riid, ppv); } STDMETHOD(DCompositionCreateDevice2)(IUnknown* d2dDevice, REFIID iid, void** device) { ID2D1Device* pD2DDevice = nullptr; if (!d2dDevice || FAILED(d2dDevice->QueryInterface(IID_PPV_ARGS(&pD2DDevice)))) { return E_INVALIDARG; } if (m_pfDCompositionCreateDevice2 == nullptr) { return E_NOINTERFACE; } HRESULT hr = m_pfDCompositionCreateDevice2(pD2DDevice, iid, device); pD2DDevice->Release(); return hr; } private: DWORD m_dwRefCount; CDcompFactory m_dcompFactory; fDCompositionCreateDevice2 m_pfDCompositionCreateDevice2; }; IDcompFactory* D2DRENDER::CoCreateDcompFactory() { IDcompFactory1* Factory = new CDcompFactory1; Factory->AddRef(); return Factory; }
最新发布
08-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值