1.组件中必须有3个函数,QueryInterfaceAddRefRelease,它们3个函数也组成一个接口,叫"IUnknown"

2.组件API及接口指针中,除了IUnknown::AddRef()IUnknown::Release()两个函数外,其它所有的函数,都以 HRESULT 作为返回值。

3.原则:COM 组件是运行在分布式环境中的通俗地说,你不能直接把一个内存指针直接作为参数传递给COM函数。

4.结果判断一般用VC提供的宏:

HRESULT hr = 调用组件函数;

if( SUCCEEDED( hr ) ){...} // 如果成功

if( FAILED( hr ) ){...} // 如果失败

5.Browser Helper Objects,我译为"浏览器帮助者对象",以下皆简称BHO


==================================

如果感觉不清楚,请先参看com组件应用(1),因为范例是从上例中改造过来的。


还是用具体范例来讲:computer_def.h

#include <Unknwn.h>

#define UUID_ICOMPUTER __declspec( uuid( "9DC95DDC-FF98-4afe-B17E-42F028E34F68" ) )
class UUID_ICOMPUTER Icomputer: public IUnknown
{
public:
    
virtual int add(int a, int b ) = 0;    
};


#define UUID_ICOMPUTEREX __declspec( uuid( "3B8BF613-7AF1-4672-9EC3-E5DC49A6E8D9" ) )
class UUID_ICOMPUTEREX IcomputerEx: public IUnknown
{
public:
    
virtual int sub(int a, int b ) = 0;    
};

实现类:

class Ccomputer : 
    
public Icomputer,
    
public IcomputerEx

{
public:
    
virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
        
/* [in] */ REFIID riid,
        
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject)
    {
        
if(riid == __uuidof(Icomputer))
        {
            
*ppvObject = (Icomputer*)(this);
        }

        
else if(riid == __uuidof(IcomputerEx))
        {
            
*ppvObject = (IcomputerEx*)(this);
        }

        
return S_OK;
    }

    
virtual ULONG STDMETHODCALLTYPE AddRef( void)
    {
        m_nRef
++;
        
return m_nRef;
    }

    
virtual ULONG STDMETHODCALLTYPE Release( void)
    {
        m_nRef
--;

        
if(0 == m_nRef)
        {
            delete 
this;
        }

        
return 0;
    }

    
virtual int add(int a, int b)
    {
        
return a + b;
    }
    
virtual int sub(int a,  int b)
    {

        
return a - b;
    }
private:
    ULONG m_nRef;

};

使用上:

Icomputer *pComputer;

  IcomputerEx 
*pComputerEx;

  HMODULE hDll 
= ::LoadLibrary(TEXT("computer.dll"));
  
  typedef HRESULT (__stdcall 
*PFN_DllGetClassObject)(Icomputer** ppv);

  PFN_DllGetClassObject pDllGetClassObject 
= (PFN_DllGetClassObject)::GetProcAddress(hDll, "DllGetClassObject");
  
  
if(NULL == pDllGetClassObject)
  {
   
//nRet = STATUS_SEVERITY_ERROR;
  }

  
// 创建接口
  HRESULT hRet = pDllGetClassObject(&pComputer);
  
  
if(FAILED(hRet))
  {
   
//nRet = STATUS_SEVERITY_ERROR;
  }


……



 
int iRet = pComputer->add(iNum_1,iNum_2);
   
   pComputer
->QueryInterface(__uuidof(IcomputerEx),(void**)&pComputerEx);

   
//pComputerEx = (pComputerEx)(pC);

   iRet 
= pComputerEx->sub(iNum_1,iNum_2);

 

阐述总结:继承IUnknown 接口,实现其中方法。 这样就可以通过QueryInterface 来查询接口,并使用其中的函数。

posted on 2009-08-18 21:27 -274°C 阅读(1006) 评论(0)  编辑  收藏 所属分类: C++

只有注册用户登录后才能发表评论。


网站导航:
 

常用链接

留言簿(21)

随笔分类(265)

随笔档案(242)

相册

JAVA网站

关注的Blog

搜索

  •  

积分与排名

  • 积分 - 909067
  • 排名 - 40

最新评论