C++ COM添加接口

来源:互联网 发布:代理软件有哪些 编辑:程序博客网 时间:2024/05/18 21:47

COM接口必须得提供给客户程序,这样他们才能知道你的这个DLL存在什么样的函数实现什么样的功能,同时还需要一个GUID和接口ID。COM的接口你可以把它当成一个虚类处理。

 

定义接口如下:mycom.h

[c-sharp] view plaincopy
  1. #pragma once  
  2. #include "unknwn.h"  
  3. // {85F5CF11-2A25-4ef9-8F7C-8C3F14A0860A}  
  4. static const GUID CLSID_MyCOM =   
  5. { 0x85f5cf11, 0x2a25, 0x4ef9, { 0x8f, 0x7c, 0x8c, 0x3f, 0x14, 0xa0, 0x86, 0xa } };  
  6. // {07C4A7BC-BBD1-4ced-80A5-A76377929F35}  
  7. static const IID IID_ITest =   
  8. { 0x7c4a7bc, 0xbbd1, 0x4ced, { 0x80, 0xa5, 0xa7, 0x63, 0x77, 0x92, 0x9f, 0x35 } };  
  9. interface ITest : public IUnknown  
  10. {  
  11.     STDMETHOD (Add)(int nOp1, int nOp2, int* pret) PURE;  
  12. };  
 

接口实现如下:test.h

[c-sharp] view plaincopy
  1. #pragma once  
  2. #include "mycom.h"  
  3. extern LONG g_cLock;            // # of outstanding objects  
  4. class CTest :  
  5.     public ITest  
  6. {  
  7. public:  
  8.     CTest(void);  
  9.     virtual ~CTest(void);  
  10. public:  
  11.     //  IUnknown members  
  12.     //@cmember Request an Interface  
  13.     STDMETHODIMP            QueryInterface(REFIID, LPVOID *);  
  14.     //@cmember Increments the Reference count  
  15.     STDMETHODIMP_(ULONG)    AddRef(void);  
  16.     //@cmember Decrements the Reference count  
  17.     STDMETHODIMP_(ULONG)    Release(void);  
  18.     STDMETHOD (Add)(int nOp1, int nOp2, int* pret);  
  19. protected:  
  20.     //@cmember Reference count  
  21.     ULONG       m_cRef;  
  22. };  
 

test.cpp

[c-sharp] view plaincopy
  1. #include "stdafx.h"  
  2. #include "test.h"  
  3. CTest::CTest(void)  
  4. {  
  5.     m_cRef  = 0;  
  6.     InterlockedIncrement(&g_cLock);  
  7. }  
  8. CTest::~CTest(void)  
  9. {  
  10.     InterlockedDecrement(&g_cLock);  
  11. }  
  12. STDMETHODIMP CTest::QueryInterface(REFIID riid, void **ppv)  
  13. {  
  14.     if(!ppv)  
  15.         return E_INVALIDARG;  
  16.     *ppv = NULL;  
  17.     if(riid == IID_IUnknown || riid == IID_ITest)  
  18.         *ppv = (LPVOID) this;  
  19.     if(*ppv == 0)  
  20.         return E_NOINTERFACE;  
  21.          
  22.     ((LPUNKNOWN)*ppv)->AddRef();  
  23.     return S_OK;  
  24. }  
  25. STDMETHODIMP_(ULONG) CTest::AddRef()  
  26. {  
  27.     return ++m_cRef;  
  28. }  
  29. STDMETHODIMP_(ULONG) CTest::Release()  
  30. {  
  31.     if(!--m_cRef)  
  32.         delete this;  
  33.     return m_cRef;  
  34. }  
  35. STDMETHODIMP CTest::Add(int nOp1, int nOp2,int * pret)  
  36. {  
  37.      *pret = nOp1 + nOp2;  
  38.      return S_OK;  
  39. }  
 

 

将接口加入mycom中:factory.cpp

[c-sharp] view plaincopy
  1. #include "test.h"  
  2. STDMETHODIMP CClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppv)  
  3. {  
  4.     HRESULT hrRet;  
  5.     CTest* pTest = 0;  
  6.     if(NULL != pUnkOuter)  
  7.         return CLASS_E_NOAGGREGATION;  
  8.     if(IsBadWritePtr(ppv, sizeof(void*)))  
  9.         return E_POINTER;  
  10.     pTest = new CTest;  
  11.     if(NULL == pTest)  
  12.         return E_OUTOFMEMORY;  
  13.     hrRet = pTest->QueryInterface(riid, ppv);  
  14.     if(FAILED(hrRet))  
  15.         delete pTest;  
  16.     return hrRet;  
  17. }  
 

 

至此一个简单的COM进程内组件实现完成,其提供的接口是ITest,客户程序可以通过这个接口调用CTest::Add函数。