COM 类厂和DllGetObjectClass函数
在组件对象模型(COM)中,类厂(Class Factory)和 DllGetClassObject 函数是创建和管理 COM 对象的关键组件。本文将深入探讨这两个概念,包括它们的作用、实现方式以及在 COM 编程中的应用。
COM 类厂(Class Factory)
类厂是 COM 对象的生产基地,它负责创建特定类型的 COM 对象。每个 COM 类都有一个与之对应的类厂,用于创建该类的实例。类厂本身是一个 COM 对象,它实现了 IClassFactory 接口,该接口定义了两个方法:CreateInstance 和 LockServer。
IClassFactory 接口
IClassFactory 接口是所有类厂必须实现的接口,它的定义如下:
代码语言:javascript
interface IClassFactory : public IUnknown
{
virtual HRESULT STDMETHODCALLTYPE CreateInstance(
In_opt IUnknown *pUnkOuter,
In REFIID riid,
COM_Outptr void **ppvObject) = 0;
virtual HRESULT STDMETHODCALLTYPE LockServer(
BOOL fLock) = 0;
};
CreateInstance 方法用于创建 COM 对象的实例。如果 pUnkOuter 参数非空,则表示客户端请求的是聚合(aggregation)。
LockServer 方法用于控制组件的生存期,通过锁定和解锁操作来管理组件的激活次数。
DllGetClassObject 函数
DllGetClassObject 函数是 COM DLL 组件的入口点,它由 COM 库在需要创建类厂对象时调用。这个函数的实现必须导出,并在 DLL 的导出表中列出。
函数原型
DllGetClassObject 函数的原型如下:
代码语言:javascript
HRESULT DllGetClassObject(
In REFCLSID rclsid,
In REFIID riid,
Out LPVOID *ppv
);
rclsid 参数指定了要创建的 COM 类的 CLSID。
riid 参数指定了请求的接口 IID,通常为 IID_IClassFactory。
ppv 参数是一个指向指针的指针,用于接收类厂对象的接口指针。
实现示例
以下是一个简单的 DllGetClassObject 实现示例:
代码语言:javascript
#include <objbase.h>
class CMyClassFactory : public IClassFactory
{
public:
// IUnknown methods
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject) override;
STDMETHOD_(ULONG, AddRef)() override;
STDMETHOD_(ULONG, Release)() override;
// IClassFactory methods
STDMETHOD(CreateInstance)(IUnknown *pUnkOuter, REFIID riid, void **ppvObject) override;
STDMETHOD(LockServer)(BOOL fLock) override;
};
HRESULT __stdcall DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
{
if (rclsid == CLSID_MyClass) // Replace with your actual CLSID
{
CMyClassFactory *pFactory = new CMyClassFactory();
if (pFactory == nullptr)
{
return E_OUTOFMEMORY;
}
return pFactory->QueryInterface(riid, ppv);
}
return CLASS_E_CLASSNOTAVAILABLE;
}
在这个示例中,DllGetClassObject 函数检查传入的 CLSID 是否与 DLL 支持的类匹配。如果匹配,它创建一个 CMyClassFactory 类厂实例,并返回其 IClassFactory 接口指针。
COM 类厂和 DllGetClassObject 的重要性
类厂和 DllGetClassObject 函数是 COM 架构中不可或缺的部分。它们确保了 COM 对象的创建是可控的、可管理的,并且遵循 COM 的规则和约定。通过实现这些机制,开发者可以创建可重用、可管理的 COM 组件,这些组件可以在不同的应用程序和进程中使用。
- 点赞
- 收藏
- 关注作者
评论(0)