接触VC之四:COM组件模型基础
2006-07-19 11:36:48 来源:WEB开发网核心提示: 当然,你可以使用自己的引用机制,接触VC之四:COM组件模型基础(9),只要你的行为上支持AddRef和Release,比如说,下面我要遵守它,我把上次同样东西用……省略掉了,不设置对象的引用计数,而是为每个接口设置一个引用计数
当然,你可以使用自己的引用机制,只要你的行为上支持AddRef和Release。比如说,不设置对象的引用计数,而是为每个接口设置一个引用计数。当所有的接口引用计数都为0时,delete对象。
好了,前面的示例中,我并没有遵守IUknown规范,下面我要遵守它。我把上次同样东西用……省略掉了。
// {6AAF876E-FCED-4ee0-B5D3-63CD6E2242F5}
static const GUID IID_IPhysiology =
{ 0x6aaf876e, 0xfced, 0x4ee0, { 0xb5, 0xd3, 0x63, 0xcd, 0x6e, 0x22, 0x42, 0xf5 } };
class IPhysiology:
public IUnknown
{
public:
……
};
// {183FC7A1-4C27-4c38-B72D-D1326E2E8A7C}
static const GUID IID_IPsychics =
{ 0x183fc7a1, 0x4c27, 0x4c38, { 0xb7, 0x2d, 0xd1, 0x32, 0x6e, 0x2e, 0x8a, 0x7c } };
class IPsychics:
public IUnknown
{
public:
……
};
// {5F144D5C-A20C-42e7-8F91-4D5CAE430B29}
static const GUID IID_IDynamics =
{ 0x5f144d5c, 0xa20c, 0x42e7, { 0x8f, 0x91, 0x4d, 0x5c, 0xae, 0x43, 0xb, 0x29 } };
class IDynamics:
public IUnknown
{
public:
……
};
// {ABFA7022-7E2F-4d0e-8A4F-F58BBCEBB2DA}
static const GUID CLISID_Human =
{ 0xabfa7022, 0x7e2f, 0x4d0e, { 0x8a, 0x4f, 0xf5, 0x8b, 0xbc, 0xeb, 0xb2, 0xda } };
class human :
public IPhysiology,
public IPsychics,
public IDynamics
{
public:
……
human()
{
m_ulRef = 0;
}
HRESULT QueryInterface(const IID& iid, void **ppv)
{
if (iid == IID_IUnknown || iid == IID_IPhysiology)
{
*ppv = static_cast<IPhysiology*>(this);
(IPhysiology*)(*this))->AddRef();
}
else if (iid == IID_IPsychics)
{
*ppv = static_cast<IPsychics*>(this);
(IPsychics*)(*this))->AddRef();
}
else if (iid == IID_IDynamics)
{
*ppv = static_cast<IDynamics*>(this);
(IDynamics*)(*this))->AddRef();
}
else
{
*ppv = NULL;
return E_NOTINTERFACE;
}
return S_OK;
}
ULONG AddRef()
{
return ++m_ulRef;
}
ULONG Release()
{
m_ulRef--;
if (m_ulRef <= 0)
{
m_ulRef = 0;
delete this;
}
return m_ulRef;
}
ULONG m_ulRef;
};
这样我们的组件对象就定义完全了。
更多精彩
赞助商链接