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;
}*/
分享到:
相关推荐
本程序主要是写一个计算器组件,其中有两个接口IBaseMath、ISuperMath,前一接口定义加减运算,后一接口定义乘除运算。本程序是自己学习com写的小程序,希望对初学COM的你有所帮助。
IUnknown 接口 COM 对象的接口原则 ⊙ 第三章 COM 的实现 COM 组件注册信息 注册 COM 组件 类厂和 DllGetObjectClass 函数 CoGetClassObject 函数 CoCreateInstance / CoCreateInstanceEx 函数 COM 库的初始...
一 组件基础 1 软件开发的阶段 ... 1) 父接口是IUnknown接口 2) 在对象内添加函数,函数定义必须 是返回 HRESULT. HRESULT是32位整数,返回函数是否 执行成功,需要使用 SUCCESSED和 FAILED宏来判断返回值.
1 : IUnknown 2 : IStorage 3 : IPersist 4 : IShellIcon 5 : IShellFolder 6 : IPersistFolder 7 : IPersistFolder2 8 : IItemNameLimits 9 : IShellFolder2 10 : IOleCommandTarget 11 : ...
使用VC8,Win32 API,非ATL或MFC,实现进程内COM组件。压缩包内有三个工程,包括,使用嵌套类实现IUnknown接口的COM、使用多继承实现IUnknown接口的COM,实现IDispatch接口的Automation。
面向对象方法学COM组件笔记,需要下载,面向对象方法学COM组件笔记,需要下载,
COM本质论(简体) Essntial COM 运行时的多态,抽象基类作为二进制接口。套间,类,IUnknown接口
COM本质论(简体) Essntial COM 运行时的多态,抽象基类作为二进制接口。 套间,类,IUnknown接口
• 基本接口——描述IUnknown基本接口及其方法 • 掌握串的处理——在COM代码中如何处理串 • 应用COM技术——例子代码,举例说明本文所讨论的所有概念 • 处理HRESULT——HRESULT类型描述,如何监测错误及成功...
2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 ...
前言 在COM编程——认识组件中也总结了,COM是一个说明如何建立可动态互变组件的规范,它提供了为保证能够互操作,客户和组件...因为当查询组件实例的IUnknown接口时,不论通过哪个接口,所得到的均将是同一指针值。为
基本接口——描述IUnknown基本接口及其方法。 掌握串的处理——在COM代码中如何处理串。 应用COM技术——例子代码,举例说明本文所讨论的所有概念。 处理HRESULT——HRESULT类型描述,如何监测错误及成功代码。
熟悉COM的开发人员应注意,尽管在概念上C#接口类似于COM接口,但它们是不同的,底层的结构不同,例如,C#接口并不派生于IUnknown。C#接口根据.NET函数提供了一个契约。与COM接口不同,C#接口不代表任何类型的二进制...
实现IUnknown和自定义接口 完成COM服务器 生成测试客户机 用ATL建立COM服务器 关于ATL 用ATL建立进程内COM服务器 用ATL建立进程外COM服务器 线程与COM服务器 Win32多线程应用 线程COM组件 自动化与...
第五部分介绍COM编程技术,重点分析了MFC对IUnknown接口、聚合、自动化、连接点的支持。在这一部分,读者在了解MFC实现COM原理的同时,还将了解到一些非常实用的编程技术,譬如动态调用、接口映射等。第六部分则介绍...
• 实 现接口,从IUnknown 开始——展示如何用C++类编写一个接口实现并描述IUnknown之方法的目的 • 构 造器和析构器 • AddRef() 和 Release() • QueryInterface() • 深 入CoCreateInstance()——探究...
1.2.2 信息封装 5 1.3 COM 6 1.3.1 COM组件是…… 7 1.3.2 COM不是…… 7 1.3.3 COM库 8 1.3.4 COM方法 8 1.3.5 COM超越了用户的需要 8 1.4 本章小结 9 第2章 接口 11 2.1 接口的作用 11 2.1.1 可复用应用...
] interface IMath : IUnknown //接口 IMath 派生自 IUnknown { //接口函数列表 [helpstring("method Add")] HRESULT Add([in] long n1, [in] long n2, [out,retval] long * pnVal); }; //增加接口代码 [ object, ...
2、这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成两个数值的加法,Cat()完成两个字符串的连接。3、下面......好好听讲! 开始了:-) 关键字...