类厂是什么?就是一个工厂用于创建各种产品,将创建好的产品提供给外部用户使用。其实现如下:
factory.h
01.#pragma once 02.#include "unknwn.h" 03.class CClassFactory : 04. public IClassFactory 05.{ 06.public: 07. CClassFactory(void); 08. virtual ~CClassFactory(void); 09.public: 10. // IUnknown 11. STDMETHOD_(ULONG, AddRef)(); 12. STDMETHOD_(ULONG, Release)(); 13. STDMETHOD(QueryInterface)(REFIID riid, void** ppv); 14. // IClassFactory 15. STDMETHOD(CreateInstance)(IUnknown* pUnkOuter, REFIID riid, void** ppv); 16. STDMETHOD(LockServer)(BOOL fLock); 17.protected: 18. ULONG m_cRef; 19.}; 本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zhoujianhei/archive/2010/07/30/5777486.aspx
factory.cpp
01.#include "StdAfx.h" 02.#include "factory.h" 03.CClassFactory::CClassFactory(void) 04.{ 05. m_cRef = 0; 06. InterlockedIncrement(&g_cLock); 07.} 08.CClassFactory::~CClassFactory(void) 09.{ 10. InterlockedDecrement(&g_cLock); 11.} 12.STDMETHODIMP_(ULONG) CClassFactory::AddRef() 13.{ 14. return ++m_cRef; 15.} 16.STDMETHODIMP_(ULONG) CClassFactory::Release() 17.{ 18. if(!--m_cRef) 19. delete this; 20. return m_cRef; 21.} 22.STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void** ppv) 23.{ 24. HRESULT hrRet = S_OK; 25. if(IsBadWritePtr(ppv, sizeof(void*))) 26. return E_POINTER; 27. *ppv = NULL; 28. if(IsEqualGUID(riid, IID_IUnknown)) 29. { 30. *ppv = (IUnknown*)this; 31. }else 32. if(IsEqualGUID(riid, IID_IClassFactory)) 33. { 34. *ppv = (IClassFactory*)this; 35. }else 36. { 37. hrRet = E_NOINTERFACE; 38. } 39. if(S_OK == hrRet) 40. ((IUnknown*) *ppv)->AddRef(); 41. return hrRet; 42.} 43.STDMETHODIMP CClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppv) 44.{ 45. return E_NOINTERFACE; 46.} 47.STDMETHODIMP CClassFactory::LockServer(BOOL fLock) 48.{ 49. fLock ? InterlockedIncrement(&g_cLock) : InterlockedDecrement(&g_cLock); 50. return S_OK; 51.} #include "StdAfx.h" #include "factory.h" CClassFactory::CClassFactory(void) { m_cRef = 0; InterlockedIncrement(&g_cLock); } CClassFactory::~CClassFactory(void) { InterlockedDecrement(&g_cLock); } STDMETHODIMP_(ULONG) CClassFactory::AddRef() { return ++m_cRef; } STDMETHODIMP_(ULONG) CClassFactory::Release() { if(!--m_cRef) delete this; return m_cRef; } STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void** ppv) { HRESULT hrRet = S_OK; if(IsBadWritePtr(ppv, sizeof(void*))) return E_POINTER; *ppv = NULL; if(IsEqualGUID(riid, IID_IUnknown)) { *ppv = (IUnknown*)this; }else if(IsEqualGUID(riid, IID_IClassFactory)) { *ppv = (IClassFactory*)this; }else { hrRet = E_NOINTERFACE; } if(S_OK == hrRet) ((IUnknown*) *ppv)->AddRef(); return hrRet; } STDMETHODIMP CClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppv) { return E_NOINTERFACE; } STDMETHODIMP CClassFactory::LockServer(BOOL fLock) { fLock ? InterlockedIncrement(&g_cLock) : InterlockedDecrement(&g_cLock); return S_OK; }
将类厂加入mycom中
01.#include "factory.h" 02.STDAPI DllGetClassObject(REFCLSID rclsid ,REFIID riid,void **ppv) 03.{ 04. HRESULT hrRet; 05. CClassFactory* pFactory = 0; 06. if(!IsEqualGUID(rclsid, CLSID_MyCOM)) 07. return CLASS_E_CLASSNOTAVAILABLE; 08. if(IsBadWritePtr(ppv, sizeof(void*))) 09. return E_POINTER; 10. pFactory = new CClassFactory; 11. if(NULL == pFactory) 12. return E_OUTOFMEMORY; 13. hrRet = pFactory->QueryInterface(riid, ppv); 14. if(!SUCCEEDED(hrRet)) 15. delete pFactory; 16. return hrRet; 17.} #include "factory.h" STDAPI DllGetClassObject(REFCLSID rclsid ,REFIID riid,void **ppv) { HRESULT hrRet; CClassFactory* pFactory = 0; if(!IsEqualGUID(rclsid, CLSID_MyCOM)) return CLASS_E_CLASSNOTAVAILABLE; if(IsBadWritePtr(ppv, sizeof(void*))) return E_POINTER; pFactory = new CClassFactory; if(NULL == pFactory) return E_OUTOFMEMORY; hrRet = pFactory->QueryInterface(riid, ppv); if(!SUCCEEDED(hrRet)) delete pFactory; return hrRet; }
目前我们实现的这些函数目的是让系统以为这是一个COM,我们的目的达到了,不过客户调用CoCreateInstance仍然会失败,那是因为CClassFactory::CreateInstance中我们直接返回了E_NOINTERFACE。
本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zhoujianhei/archive/2010/07/30/5777486.aspx

被折叠的 条评论
为什么被折叠?



