COM对象包容

说到对象包容不可不提的便是对象聚合,其用意都是代码的可重用性的一种方式,刚刚看完了对象包容,所以在这儿写下自己的理解,

其适用场所是,当有对象A实现了someinterface接口的功能,对象B实现了otherinterface接口的功能,当需求改变时,要求,B实现一种新的功能,但是该功能在A中已经实

现,所以此时要实现代码的可重用性,对象B的新功能调用对象A的功能函数,而不再自己重新实现,当然在其中也可以加进自己的其他操作。在这当中B控制A的生存期,当B

生成时,A也实现自己的构造函数,完成A的构建,这两个COM对象,对于调用B的客户而言,B是服务提供者,而调用A的B而言,B是客户,A是服务提供者,主要特点是,所 

有的功能都在B接口中暴漏出来对于客户端而言,他是不知道A的存在的,或者说客户端认为,该功能的实现是B的功劳。现在假设someinterface已经实现,并且已经生成了

一个someinterface.dll等待被调用,其功能函数是someFucntion,现在我们看下otherinterface接口的实现,首先观察其所使用的.idl接口描述文件的内容,注意添加other ATL

简单对象

import "oaidl.idl";
import "ocidl.idl";

[
	object,
	uuid(D1D79322-1FF4-4A64-A8DF-15C8E3ED02ED),
	dual,
	nonextensible,
	pointer_default(unique)
]
interface Iother : IDispatch{
	HRESULT otherFunction(BSTR var);//该功能函数式otherinterface借口自己实现的
	HRESULT someFunction(BSTR var);//将该功能函数暴漏出来,其功能的实现依赖于someinterface接口,当然开发者也可以加进自己其他的操作
	HRESULT Init();//初始化过程,即Isome的实例化过程
};
[
	uuid(2A765BEA-F045-4075-9B67-697CCA9C0A81),
	version(1.0),
]
library otherInterfaceLib
{
	importlib("stdole2.tlb");
	[
		uuid(8466E4AE-C3B4-4DD8-B3F4-D0E17E9DB917)		
	]
	coclass other
	{
		[default] interface Iother;
	};
};

import "shobjidl.idl";

至于该other.h文件不过是增加了


还要注意添加 #import"D:\project\someInterface\Debug\someInterface.dll"no_namespace
STDMETHOD(otherFunction)(BSTR var);
	STDMETHOD(someFunction)(BSTR var);
	STDMETHOD(Init)();
Isome*  m_some_interface;

对于other.cpp文件主要是Init函数将some接口实例化,和someFunction功能函数的调用


如下


#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
        const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
MIDL_DEFINE_GUID(IID, IID_Isome,0x8FC4B33A,0x4B7B,0x48AA,0xA1,0xDD,0x40,0x31,0x22,0xC7,0x6A,0xBD);

STDMETHODIMP Cother::otherFunction (BSTR var)
{
	MessageBox(NULL,var,L"other",0);
	return S_OK;
}
STDMETHODIMP Cother::Init()
{
	IsomePtr tmp_ptr;
	HRESULT hr=tmp_ptr.CreateInstance(__uuidof(some));
	if(S_OK!=hr)
	{
		MessageBox(NULL,L"对不起,someInterface对象初始化失败\n",L"提示",0);
		return hr;
	}

	hr=tmp_ptr.QueryInterface(IID_Isome,(void**)&m_some_interface);
	if(S_OK!=hr)
	{
		MessageBox(NULL,L"对不起,someInterface的接口查找失败",L"提示",0);
		return hr;
	}
	return S_OK;
}
STDMETHODIMP Cother::someFunction(BSTR var)
{
	return m_some_interface->someFunction(var);
}
需要注意的是需要用户自行调用Init函数进行初始化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值