建基类COM
建子类COM
1. 按向导建立工程:SubCOM,将基类COM生成的文件Base.h和Base_i.c文件拷贝到子类COM工程的工作区,然后将这两个文件添加到工程。
2. 添加没有任何方法的一个简单ATL对象
3. 修改SubCOM.idl文件,其中蓝色的字体为新增加的内容,红色字体为删除的内容:
import "oaidl.idl";
import "ocidl.idl";
[
object,
uuid(CC06EB28-B
8F
6-4FE1-B258
-818F
839E
191C
),
dual,
helpstring("IInherCOM Interface"),
pointer_default(unique)
]
interface IInherCOM : IDispatch
{
};
[
uuid(3EB
9030C
-50C
7
-4A
05
-9F
7F
-288BEFE
9F
320),
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-BA
6A
-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();
运行程序:运行结果如下所示,说明我们用子类定义成功。