CAbstractUnknown.h
#include <objbase.h>
#include <unknwn.h>
#define DECLARE_IUNKNOWN_INTERFACE \
public: \
virtual HRESULT _stdcall QueryInterface(const IID& riid,void** ppvObject); \
virtual ULONG _stdcall AddRef (); \
virtual ULONG _stdcall Release();
class CAbstractUnknown:public IUnknown
{
public:
CAbstractUnknown();
virtual HRESULT _stdcall QueryInterface(const IID& riid,void** ppvObject)=0;
virtual ULONG _stdcall AddRef ();
virtual ULONG _stdcall Release();
//virtual HRESULT _stdcall NonDelegatingQueryInterface(const IID& riid,void** ppvObject)=0;
//virtual ULONG _stdcall NonDelegatingAddRef();
//virtual ULONG _stdcall NonDelegatingRelease();
protected:
long m_ref;
long g_components;
};
const CLSID CLSID_CAbstractUnknown={0x38dd17, 0x6420, 0x47ca, { 0x8b, 0xca, 0xbf, 0x8b, 0x4d, 0x21, 0x32, 0x87 } };
template<class I,const GUID* pGUID>I* interface_cast(IUnknown* pIUnknown)
{
I* pi=NULL;
HRESULT hr=pIUnknown->QueryInterface(*pGUID,(void**)&pi);
assert(SUCCEEDED(hr));
return pi;
}
CAbstractUnknown.cpp
#include "CAbstractUnknown.h"
CAbstractUnknown::CAbstractUnknown()
{
m_ref=0;
g_components=0;
}
/**
HRESULT _stdcall CAbstractUnknown::QueryInterface(const IID& riid,void** ppvObject)
{
if(p_UnknownOuter!=NULL)
{
return p_UnknownOuter->QueryInterface(riid,ppvObject);
}
else
{
return NonDelegatingQueryInterface(riid,ppvObject);
}
}*/
ULONG _stdcall CAbstractUnknown::AddRef()
{
return InterlockedIncrement(&m_ref);
}
ULONG _stdcall CAbstractUnknown::Release()
{
if(InterlockedDecrement(&m_ref)==0)
{
InterlockedDecrement(&g_components);
delete this;
return 0;
}
return m_ref;
}
/**
CAbstractUnknown::CAbstractUnknown(IUnknown* m_pUnknownouter)
{
m_ref=1;
InterlockedIncrement(&g_components);
p_UnknownOuter=m_pUnknownouter;
}
HRESULT _stdcall CAbstractUnknown::NonDelegatingQueryInterface(const IID& riid,void** ppvObject)
{
if(riid==IID_IUnknown)
{
*ppvObject=static_cast<INonDelegatingUnknown*>(this);
((IUnknown*)(*ppvObject))->AddRef();
}
return S_OK;
}
ULONG _stdcall CAbstractUnknown::NonDelegatingAddRef()
{
return InterlockedIncrement(&m_ref);
}
ULONG _stdcall CAbstractUnknown::NonDelegatingRelease()
{
if(InterlockedDecrement(&m_ref)==0)
{
InterlockedDecrement(&g_components);
delete this;
return 0;
}
return m_ref;
}*/
分享到:
相关推荐
`IUnknown` 是所有 COM 接口的基接口,提供了 `QueryInterface`、`AddRef` 和 `Release` 方法,分别用于获取其他接口、增加引用计数和减少引用计数。 在实际应用中,开发者通常需要实现这个接口并将其注册到 COM ...
IDispatch接口提供了动态调用方法和属性访问的能力,而IUnknown接口是所有COM接口的基础,提供了对象的引用计数和接口查询功能。 2. **接口定义语言(IDL)**:IDL是一种用于描述COM接口的规范性语言。在VC++中,...
这些接口可以继承自IUnknown接口,以支持基本的引用计数和接口查询操作。 2. 实现接口:然后,创建一个COM类,该类实现这些接口。每个接口的方法都需要在类中给出具体实现。 3. 注册组件:通过注册表,将COM组件...
1. **COM基础**:理解COM组件的基本概念,包括COM接口、IUnknown接口、CLSID(Class ID)、IID(Interface ID)以及如何创建和使用COM对象。 2. **COM接口的查询**:如何使用QueryInterface方法获取目标对象的不同...
开发者需要理解COM的基本概念,例如IUnknown、QueryInterface和AddRef等方法,以及如何使用COM接口来调用Excel对象模型。 该封装类可能包含了以下功能: 1. 文件操作:打开、创建和保存Excel文件。 2. 工作表操作:...
它涉及到COM对象的创建、接口定义、IUnknown的实现、QueryInterface、AddRef和Release方法的使用,以及如何处理事件和调用远程方法。通过这个项目,开发者可以深入理解COM对象的生命周期、接口设计原则以及如何利用...
综上所述,COM技术的核心在于组件的标准化构建、接口的灵活运用以及IUnknown接口作为基石的设计。通过理解和掌握这些基础知识,开发者能够有效地构建和集成组件,提高软件系统的模块化程度和重用性。此外,深入探索...
首先,`ShareObject<>`是一个模板类,它的主要目的是为了封装一个基于`IUnknown`接口的对象。`IUnknown`是所有COM接口的基础,提供了`AddRef()`、`Release()`和`QueryInterface()`三个方法,分别用于增加引用计数、...
SDK中的CoCreateInstance函数用于实例化一个COM对象,IUnknown接口是所有COM接口的基类,提供了AddRef、Release和QueryInterface三个基本方法,用于对象引用计数管理和接口查询。 MFC(Microsoft Foundation ...
在C++中,我们需要实例化一个CComPtr<IUnknown>类型的指针,并用它来初始化一个ADODB::Connection对象。设置适当的连接字符串,例如:"Provider=SQLOLEDB;Data Source=<服务器名>;Initial Catalog=<数据库名>;User ...
一 组件基础 1 软件开发的阶段 ... 1) 父接口是IUnknown接口 2) 在对象内添加函数,函数定义必须 是返回 HRESULT. HRESULT是32位整数,返回函数是否 执行成功,需要使用 SUCCESSED和 FAILED宏来判断返回值.
1. **COM基础**:解释COM的基本原理,包括组件、接口、IUnknown接口、QueryInterface方法、AddRef和Release方法等。这些概念是理解COM的关键。 2. **组件注册与激活**:讲解如何注册COM组件到系统注册表,以及如何...
实现COM组件,开发者需要遵守一系列规则,如正确实现IUnknown接口,管理对象的生命周期,以及正确处理接口引用计数。此外,COM组件通过接口暴露功能,每个接口都定义了一组相关的方法,这些方法的实现保证了组件的...
同时,由于DLL和调用程序可能不在同一个进程空间,所以通常会使用接口(如IUnknown、IDispatch等)进行通信,以支持跨进程调用。 下面是一个简单的调用DLL中对象的示例: ```delphi uses ComObj; var ...
在COM模型中,类实现接口,所有COM类都必须实现IUnknown接口,这是COM类的基本要求。Coclasses(可创建的类)允许开发者通过New关键字创建实例,这在VBA或VB.NET等环境中特别有用。COM接口定义了一组逻辑上相关的...
在32位汇编编程中,处理Unicode字符串、利用高级SIMD扩展(SSE4)指令以及使用组件对象模型(COM)接口是提高程序效率和跨平台兼容性的重要技术。以下将详细介绍这些知识点: 首先,关于**Unicode字符串**,Unicode...
在C++中实现COM,通常需要实现IUnknown接口,这是所有COM接口的基接口,包含了三个基本方法:QueryInterface、AddRef和Release。QueryInterface用于获取组件支持的其他接口,AddRef和Release则用于管理接口引用计数...
5. **IUnknown接口**:这是所有COM对象必须实现的接口,包含了AddRef、Release和QueryInterface三个方法,用于对象的引用计数和接口查询。 6. **时钟COM元件的实现**:在这个项目中,开发者可能创建了一个自定义的...
通过IUnknown接口,客户端可以查询组件支持的其他接口,IUnknown包含了三个基本方法:QueryInterface(获取接口)、AddRef(增加引用计数)和Release(释放引用计数),这些方法确保了组件生命周期的正确管理。...