CAbstractClassFactory.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 CAbstractClassFactory:public IClassFactory
{
public:
CAbstractClassFactory();
DECLARE_IUNKNOWN_INTERFACE
virtual HRESULT _stdcall CreateInstance(IUnknown *pUnkOuter,const IID& riid,void** ppvObject)=0;
virtual HRESULT _stdcall LockServer(BOOL fLock);
long m_caref,g_caref;
};
const CLSID CLSID_CAbstractClassFactory = {0x59F6C62A,0x50BE,0x4687,{0x95,0x80,0x59,0xC4,0x8F,0x94,0xE5,0xD8}};
CAbstractClassFactory.cpp
#include "CAbstractClassFactory.h"
CAbstractClassFactory::CAbstractClassFactory(){m_caref=1;g_caref=1;}
HRESULT _stdcall CAbstractClassFactory::QueryInterface(const IID& riid,void** ppvObject)
{
if(riid==IID_IUnknown||riid==IID_IClassFactory)
{
*ppvObject=static_cast<IClassFactory*>(this);
}
else
{
*ppvObject=NULL;
return E_NOINTERFACE;
}
return S_OK;
}
ULONG _stdcall CAbstractClassFactory::AddRef()
{
return InterlockedIncrement(&m_caref);
}
ULONG _stdcall CAbstractClassFactory::Release()
{
if(InterlockedDecrement(&m_caref)==0)
{
delete this;
return 0;
}
return m_caref;
}
HRESULT _stdcall CAbstractClassFactory::LockServer(BOOL fLock)
{
if(fLock)
{
InterlockedIncrement(&g_caref);
}
else
{
InterlockedDecrement(&g_caref);
}
return S_OK;
}
分享到:
相关推荐
这是通过实现IClassFactory和IUnknown接口,以及使用Type Library导出COM对象实现的。 4. **ATL(Active Template Library)**:ATL是微软为简化COM编程而设计的一个模板库。它提供了一系列的宏和模板类,帮助...
类工厂实现了`IClassFactory`接口,负责根据接口实例化对象。 5. 接口继承:自定义类型通常会继承自`IUnknown`接口,这是所有COM接口的基础,包含了`QueryInterface`、`AddRef`和`Release`三个方法,用于接口查询、...
3. **类工厂(Class Factory)**:用于创建对象实例,遵循IClassFactory接口规范。 4. **组件(Component)**:封装了实现特定功能的一组对象和接口。 5. **容器(Container)**:宿主应用程序,负责创建和管理组件...
如`DECLARE_INTERFACE_(IClassFactory, IUnknown)`宏用于声明从IUnknown派生的IClassFactory接口,其中`STDMETHOD`宏用于声明接口方法,如`QueryInterface`、`AddRef`、`Release`等。`DECLARE_INTERFACE(iface)`用于...
6. **类工厂(Class Factory)**:创建和实例化COM组件的对象,通过实现IClassFactory接口来完成。 7. **线程模型(Thread Model)**:COM组件可以工作在不同的线程上下文中,如单线程 apartment(STA)、多线程 ...
COleObjectFactory是ATL中用于创建COM对象的类工厂模板,它实现了IClassFactory接口,允许其他组件实例化和创建ATL COM对象。 在COM与MFC的关系中,MFC的类库提供了一种更面向对象、更抽象的方式来处理COM编程,...
3. **COM类工厂**:解释类工厂(Class Factory)的作用,它是创建COM组件实例的关键,如何实现IClassFactory接口来创建和释放组件实例。 4. **线程模型**:讨论COM组件支持的不同线程模型,如Apartment Threading和...
IClassFactory接口用于创建新的COM对象实例。实现这个接口的类可以被注册到系统中,这样其他应用程序就可以通过COM服务来创建对象实例。IClassFactory对象通常会提供两个方法:`CreateInstance`用于创建指定类的新...
6. 使用类工厂:实现IClassFactory接口,用于创建组件实例。 15.3章节讲解了如何在VC和VB中使用COM组件,包括: - 在VC中调用组件:通过CoCreateInstance创建组件实例,然后使用QueryInterface获取所需接口。 - 在...
COM的核心思想是对象的封装、接口和多态性,它为软件开发提供了标准化的组件重用机制。本资料集合了"COM技术内幕"一书的随书源码,这是一本深入解析COM技术的经典著作。 在COM技术中,每个组件都是一个独立的二进制...
文章中提到的设计方法,包括了ATL对维护代价较高的数据类型(如接口指针、VARIANT)提供包装类,实现了基本的COM接口(如IUnknown、IClassFactory、IDispatch等),并管理了COM服务器的类,这些类负责暴露类对象、自...
2. 创建类工厂:类工厂负责创建COM对象实例,实现IClassFactory接口。 3. 注册组件:使用regsvr32工具或在代码中调用CoRegisterClassObject函数,将组件注册到系统注册表中。 4. 在IE中使用:通过JavaScript或其他...
在COM开发中,Win32 SDK提供了对COM库函数的支持,例如,`Unknwn.h`包含了基本的`IUnknown`和`IClassFactory`接口定义,`Wtypes.h`包含了COM常用数据类型的声明,`Objidl.h`定义了所有标准接口,`Comdef.h`存储了...
4. **类工厂(Class Factory)**:类工厂是创建COM对象实例的工厂类,它实现了IClassFactory接口,负责实例化COM对象。 5. **注册与卸载**:COM组件需要在系统注册表中登记,以便其他组件或应用程序能找到并使用...
COM的核心概念是组件,组件是可重用的软件单元,它封装了特定的功能并提供标准化接口供其他程序调用。COM组件可以是动态链接库(DLLs)、可执行文件或系统服务。通过COM,开发者能够创建跨语言、跨平台的分布式应用...
IClassFactory是COM定义的一个接口,用于创建COM对象实例。COM库使用这个接口来请求类工厂对象,然后通过工厂对象来创建和销毁COM对象实例。 ### 打包到DLL中 为了简化COM对象的使用和分发,通常会将COM对象实现...
`IClassFactory`接口是类工厂的标准接口,用于创建和销毁组件实例。 5. **导出库**:COM组件通常被编译成动态链接库(DLL),以便在运行时动态加载。我们需要在DLL中声明`DllGetClassObject`和`DllCanUnloadNow`等...
MFC提供了一个通用的类厂COleObjectFactory,它继承自CCmdTarget类,并实现了IClassFactory2接口。有了类厂对象后,就可以使用其CreateInstance成员函数创建COM对象了。 OPCServer应用程序主要包含三个部分:Server...