基于二进制COM的继承

来源:互联网 发布:怎么创建淘宝号 编辑:程序博客网 时间:2024/05/22 13:51

 建基类COM

方法比较简单,按照通用的ATL(COM)向导建立基于IBaseCOM的COM:CBaseCOM,增加一个方法:Print(BSTR str),方法实现如下:
STDMETHODIMP CBaseCOM::Print(BSTR str)
{
       // TODO: Add your implementation code here
      
       ::MessageBox(NULL,"I'm in BaseCOM","BaseCOM",MB_OK);
 
       return S_OK;
}
编译以后注册。

建子类COM

1.  按向导建立工程:SubCOM,将基类COM生成的文件Base.hBase_i.c文件拷贝到子类COM工程的工作区,然后将这两个文件添加到工程。

2.  添加没有任何方法的一个简单ATL对象

3.  修改SubCOM.idl文件,其中蓝色的字体为新增加的内容,红色字体为删除的内容:

import "oaidl.idl";

import "ocidl.idl";

[

        object,

        uuid(CC06EB28-B8F6-4FE1-B258-818F839E191C),

        dual,

        helpstring("IInherCOM Interface"),

        pointer_default(unique)

]

interface IInherCOM : IDispatch

{

};

 

[

uuid(3EB9030C-50C7-4A05-9F7F-288BEFE9F320),

version(1.0),

helpstring("SubCOM 1.0 Type Library")

]

library SUBCOMLib

{

importlib("stdole32.tlb");

importlib("stdole2.tlb");

importlib("../Base/Debug/Base.dll");

[

        uuid(2B3DB963-5249-4FD6-BA6A-AF9544BEC366),

        helpstring("InherCOM Class")

]

coclass InherCOM

{

        [default] interface IInherCOM;

[default] interface IBaseCOM;

};

};

 

4.  修改CInherCOM.h文件,增加引用:#include "Base.h",然后类声明做如下修改:

class ATL_NO_VTABLE CInherCOM :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CInherCOM, &CLSID_InherCOM>,

public IDispatchImpl<IInherCOM, &IID_IInherCOM, &LIBID_SUBCOMLib>

public IDispatchImpl<IBaseCOM, &IID_ IBaseCOM, &LIBID_SUBCOMLib>,对函数映射作如下修改:

BEGIN_COM_MAP(CInherCOM)

COM_INTERFACE_ENTRY(IInherCOM)

COM_INTERFACE_ENTRY(IBaseCOM)

COM_INTERFACE_ENTRY(IDispatch)

END_COM_MAP()

 

5. 为类CInherCOM添加需要实现接口的方法,因为目前我们的COM中只有一个方法,因此我们在CInherCOM.h中增加方法声明:STDMETHOD(Print)(BSTR str);,在CInherCOM.cpp中增加方法实现:

STDMETHODIMP CInherCOM::Print(BSTR str)

{

// TODO: Add your implementation code here

::MessageBox(NULL,"I'm in InherCOM","InherCOM",MB_OK);

 

return S_OK;

}

编译,报如下错误:

e:/testproject/testinheritance/subcom/base_i.c(51) : fatal error C1010: unexpected end of file while looking for precompiled header directive

打开Project——〉Setting——〉C/C++——〉Precomplied Headers,选中“Automatic useof precompiled headers,”Through header”中填写:stdafx.h,重新编译,即可通过。

客户端调用程序

新建控制台程序,将Base.h文件拷贝到客户端程序工程目录下,在stdAfx.h中增加对COM一些公共类型的引用:

#include <stdio.h>

#include <objbase.h>

#include <atlbase.h>

增加对基类COM类型的引用#include”Base.h”

main函数种增加如下调用代码:

       ::CoInitialize( NULL );

       CComPtr<IBaseCOM> pH;   //定义基类接口

       HRESULT hr = pH.CoCreateInstance( OLESTR( "SubCOM.InherCOM" ) );    //构造子类的实类

       if( FAILED(hr) )

       {

              printf( "Exception: %ld/n",hr );

              return hr;

       }

       BSTR s = ::SysAllocString( L"Test" );

       pH->Print(s);

       ::SysFreeString( s );

       pH.Release();

       ::CoUninitialize();

运行程序:运行结果如下所示,说明我们用子类定义成功。

原创粉丝点击