COM指南 (Step by Step COM Tutorial)-中

原创 2004年02月01日 22:58:00

第四步 实现IAdd的方法<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

我们将在此步骤中提供接口IAdd所有方法的实现。

创建一个新文件(AddObj.cpp),在此文件中添加如下实现代码。

 

///////////////////////////////////////////////////////////

//

//AddObj.cpp

//Contains the method  implementations of the IAdd interface

//interfaces

//

 

#include    <objbase.h>

 

#include    "AddObj.h"

#include    "IAdd_i.c"

 

HRESULT __stdcall CAddObj::SetFirstNumber( long nX1)

    {

    m_nX1=nX1;

    if (m_bIsLogEnabled) WriteToLog("Junk");

    return S_OK;

    }

 

HRESULT __stdcall CAddObj::SetSecondNumber( long nX2)

    {

    m_nX2=nX2;

    return S_OK;

    }

 

HRESULT __stdcall CAddObj::DoTheAddition( long *pBuffer)

    {

    *pBuffer =m_nX1 + m_nX2;

 

    return S_OK;

    }

/////////////////////////////////////////////////////////////////

 

第五步 实现IUnknown

 

IUnknown方法需要被实现。在文件AddObj.cpp中,我们将实现它的三个强制的方法(AddRef,ReleaseQueryInterface)。私有成员变量m_nRefCount是用来保持对象生命期的,他不被直接的自加/减的,而是我们亲自使用线程安全的方法,使用API函数InterlockedIncrement InterlockedDecrement

 

/////////////////////////////////////////////////////////////////

 

HRESULT __stdcall CAddObj::QueryInterface(

                                    REFIID riid ,

                                    void **ppObj)

    {

    if (riid == IID_IUnknown)

        {

        *ppObj = static_cast(this) ;

        AddRef() ;

        return S_OK;

        }

 

    if (riid == IID_IAdd)

        {

        *ppObj = static_cast(this) ;

        AddRef() ;

        return S_OK;

        }

 

    //

    //if control reaches here then , let the client know that

    //we do not satisfy the required interface

    //

 

    *ppObj = NULL ;

    return E_NOINTERFACE ;

    }//QueryInterface method

 

 

 

ULONG   __stdcall CAddObj::AddRef()

    {

    return InterlockedIncrement(&m_nRefCount) ;

    }

 

    

   

ULONG   __stdcall CAddObj::Release()

    {    

    long nRefCount=0;

    nRefCount=InterlockedDecrement(&m_nRefCount) ;

    if (nRefCount == 0) delete this;

    return nRefCount;

    }

 

/////////////////////////////////////////////////////////////////

第六步 类工厂

 

我们已经完成了Add COM对象的部分功能。作为每一个COM的准则,每个COM对象必须有一个独立的IClassFactory实现。客户将使用这个接口得到我们IAdd接口实现的实例。IClassFactory接口,像所有其他COM接口一样,继承自IUnknown。因此我们也必须提供一个IUnknown的实现,以及IClassFactory的方法(LockServer CreateInstance)。创建一个新文件(命名为AddObjFactory.h)。声明一个类CAddFactory并使之继承自IClassFactory

 

///////////////////////////////////////////////////////////

//AddObjFactory.h

//Contains the C++ class declarations for the IClassFactory implementations

//

 

class CAddFactory : public IClassFactory

    {

 

    public:

 

 

    //interface IUnknown methods

    HRESULT __stdcall QueryInterface(

                                REFIID riid ,

                                void **ppObj);

    ULONG   __stdcall AddRef();

    ULONG   __stdcall Release();

 

 

    //interface IClassFactory methods

    HRESULT __stdcall CreateInstance(IUnknown* pUnknownOuter,

                                             const IID& iid,

                                             void** ppv) ;

    HRESULT __stdcall LockServer(BOOL bLock) ;

 

    private:

    long m_nRefCount;

    };

/////////////////////////////////////////////////////////////////

 

 

COM指南 (Step by Step COM Tutorial)-上 COM指南 (Step by Step COM Tutorial)-下(1)       COM指南 (Step by Step COM Tutorial)-下(2)     

COM指南 (Step by Step COM Tutorial)-上

原作者:Saurabh Dasgupta文章出处:http://www.codeguru.com/activex/COMStepByStep.html  译者的话,首先要声明的,这以一篇来自于WWW....
  • skink
  • skink
  • 2004年02月01日 22:58
  • 1172

Step by Step COM Tutorial

Step by Step COM Tutorial ContentsIntroduction Interfaces Step 1:Create the IDL file Step 2:Generati...
  • szliszt
  • szliszt
  • 2006年05月15日 18:20
  • 909

【com】番外篇 Step by Step COM Tutorial

Step by Step COM Tutorial Contents Introduction Interfaces Step 1:Create the IDL file ...
  • pirate97
  • pirate97
  • 2011年11月08日 10:14
  • 385

COM指南 (Step by Step COM Tutorial)-下(2)

第十步 DllRegisterServer 和 UnregisterServer COM对象的位置信息将会进入到注册表中。这个工作可以在外面通过一个.REG文件完成,也可以使用一个输出函数DllReg...
  • skink
  • skink
  • 2004年02月01日 23:08
  • 879

COM指南 (Step by Step COM Tutorial)-下(1)

第七步 实现IClassFactory的方法 实现类CAddFactory的方法。创建一个新文件(AddObjFactory.cpp)。提供类IUnknown和IClassFactory的方法实现。A...
  • skink
  • skink
  • 2004年02月01日 22:58
  • 719

手把手教你写Com(Step by Step COM Tutorial)

Step by Step COM Tutorial Posted by Saurabh Dasgupta on March 6th, 2001 转载地址:http://www.codeguru.c...
  • blacet
  • blacet
  • 2016年01月18日 13:15
  • 869

Create com step by step

目录:介绍接口 第一步:创建IDL文件 第二步:生成类型库第三步:从IAdd继承第四步:实现IAdd的方法第五步:实现IUnkown第六步:类工厂第七步:实现IClassFactory的方法第八步:实...
  • benny5609
  • benny5609
  • 2008年05月26日 13:46
  • 1361

OSWorkFlow深入浅出(7)---Step3详解

在《step2详解》中,我们介绍了split和join的使用,其实还是有一些细节的东西存在遗漏,所以决定增加着一个小节作为补充,在开始之前,我们先来思考两个问题 第一:在初始化之后是否就可以进行spl...
  • wangwenjun69
  • wangwenjun69
  • 2013年08月04日 15:33
  • 1449

Intellij IDEA调试功能使用总结(step over / step into / force step into/step out等)

Intellij IDEA调试功能使用总结(step over / step into / force step into/step out等)
  • theusProme
  • theusProme
  • 2016年11月03日 00:37
  • 3907

二维图像中Mat::setp、Mat::step1理解

一、前言        Mat中的step为构成图像的层次,考虑到Mat多应用于二维图像,本文讨论二维图像step的含义和应用。二维图像数据存储示意图如下:                      ...
  • AP1005834
  • AP1005834
  • 2017年02月01日 19:55
  • 810
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM指南 (Step by Step COM Tutorial)-中
举报原因:
原因补充:

(最多只允许输入30个字)