实现接口,从IUnknown开始

转载 2012年03月31日 09:21:16
实现接口,从IUnknown开始
有必要回想一下IUnknown派生的每一个接口。因为IUnknown包含了两个COM对象的基本特性——引用计数和接口查询。当你编写组件对象类时(coclass),还要写一个满足自己需要的IUnknown实现。以实现IUnknown接口的组件对象类为例——下面这个例子可能是你编写的最简单的一个组件对象类。我们将在一个叫做CUnknownImpl的C++类中实现IUnknown。下面是这个类的声明:
class CUnknownImpl : public IUnknown{public:    // 构造函数和析构器    CUnknownImpl();    virtual ~CUnknownImpl();    // IUnknown 方法    ULONG AddRef();    ULONG Release)();    HRESULT QueryInterface( REFIID riid, void** ppv );protected:    UINT m_uRefCount;  // 对象的引用计数};
构造器和析构器
构造器和析构器管理服务器的引用计数:
CUnknownImpl::CUnknownImpl(){    m_uRefCount = 0;    g_uDllRefCount++;}CUnknownImpl::~CUnknownImpl(){    g_uDllRefCount--;}
当创建新的COM对象时,构造器被调用,它增加服务器的引用计数以保持这个服务器驻留内存。同时它还将对象的引用计数初始化为零。当这个COM对象被摧毁时,它减少服务器的引用计数。
AddRef()和Release()这两个方法控制COM对象的生命期。AddRef()很简单:ULONG CUnknownImpl::AddRef(){    return ++m_uRefCount;}AddRef()只增加对象的引用计数并返回更新的计数。Release()更简单:ULONG CUnknownImpl::Release(){ULONG uRet = --m_uRefCount;    if ( 0 == m_uRefCount )  // 是否释放了最后的引用?        delete this;    return uRet;}
除了减少对象的引用计数外,如果没有另外的明确引用,Release()将摧毁对象。Release()也返回更新的引用计数。注意Release()的实现假设COM对象在堆中创建。如果你在全局粘上创建某个对象,当对象试图删除自己时就会出问题。
现在应该明白了为什么在客户端应用程序中正确调用AddRef()和 Release()是如此重要!如果在这了做得不对,你使用的对象会被很快摧毁,这样的话在整个服务器中内存会很快溢出导致应用程序下次存取服务器代码时崩溃。
如果你编写多线程应用,可能会想到使用++&替代InterlockedIncrement()和InterlockedDecrement()的线程安全问题。++&——用于单线程服务器很保险,因为即使客户端应用是多线程的并从不同的线程中进行方法调用,COM库都会按顺序进行服务器的方法调用。也就是说,一旦一个方法调用开始,所有其它试图调用方法的线程都将阻塞,直到第一个方法返回。COM库本身确保服务器一次不会被一个以上的线程闯入。

相关文章推荐

IUnknown接口

COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能...

COM三大接口:IUnknown、IClassFactory、IDispatch

(1)COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。 (1、1)  COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnk...

COM组件中的 IUnknown接口(1)

COM组件的一个主要优势是:便于升级。要实现这个优势需要满足两个条件: 1>为了更好的突出DLL的优势,还需要信息隐藏,即封装性。 2>运行时客户程序可动态加载和卸载,采用DLL技术可以实现。 ...

COM编程之IUnknown接口

COM组件其实是一种特殊的类,遵循一个统一的标准,使到各个软件都可以通过某种方法访问这个类的函数和方法,也就可以做到组件通用. com就是统一的标准--通过接口来调用com组件.接口是你的com组件能...

COM三大接口:IUnknown、IClassFactory、IDispatch。

(1)COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。  COM规范规定任何组件、任何接口都必须从IUnknown继承,IUnknown包...

COM组件编程—IUnknown的三个接口函数

对于COM组件,正确处理IUnknown的三个接口函数非常重要。 对于QueryInterface,一个参考处理如下: HRESULT __stdcall CA::QueryInterface...

COM三大接口 -> IUnknown、IClassFactory、IDispatch

COM组件有三个最基本的接口类,分别是IUnknown、IClassFactory、IDispatch。 1、IUnknownCOM规范规定任何组件、任何接口都必须从IUnknown继承。IUnkno...
  • wcyoot
  • wcyoot
  • 2011-06-23 20:40
  • 1800

IUnknown接口

一: 接口定义     任何一个接口都是继承于IUnknown接口。   客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是Iunkown,它的定...

COM三大接口:IUnknown、IClassFactory、IDispatch

转载自:http://blog.csdn.net/chenyujing1234/article/details/7753863(1)COM组件有三个最基本的接口类,分别是IUnknown、IClass...

IUnKNown接口——QueryInterface函数

转自:IUnKNown接口——QueryInterface函数 客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是IUnknown。它在UNKNWN...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)