其适用场所是,当有对象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函数进行初始化