基于二进制COM的继承
来源:互联网 发布:怎么创建淘宝号 编辑:程序博客网 时间:2024/05/22 13:51
建基类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-B8F 6-4FE1-B258-818F 839E191C ),
dual,
helpstring("IInherCOM Interface"),
pointer_default(unique)
]
interface IInherCOM : IDispatch
{
};
[
uuid(3EB9030C -50C 7-4A 05-9F 7F -288BEFE9F 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-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();
运行程序:运行结果如下所示,说明我们用子类定义成功。
- 基于二进制COM的继承
- 基于二进制的权限判断
- 基于.net的COM与COM+编程
- 基于.net的COM与COM+编程
- 基于COM开发的经验
- javascript基于原型的继承
- 基于原型链的继承
- 基于继承的初始化学习
- 基于二进制的求子集算法
- 基于二进制的集合(c语言)
- 基于mysql二进制日志的数据库恢复
- 基于二进制的权限管理与验证
- 基于二进制的权限管理与验证
- 基于二进制的权限管理与验证
- 基于二进制的权限管理与验证
- 基于二进制的权限管理与验证
- COM组件接口继承的实现
- COM组件接口继承的实现
- acm hnu 10072 Fibonacci Number
- 轻松加密ASP.NET 2.0 Web程序配置信息
- 用opencv实现绘图和文字输出。。。。
- 21世纪7种人才最抢手
- 浅写一篇 debian 双网卡固定IP配置DHCP实例
- 基于二进制COM的继承
- 诡异,跟家人完全失去联系!
- 影响中国软件开发的20人,你知道几个?
- 使用Max SDK定制工具栏
- 关于CQ Schema需要注意的地方(1)
- 引用
- 华为公司员工待遇全面揭秘
- 今天我们要开始做“一起来飞”网站了
- 怎样设页眉字体的大小.用VC