COM 类厂和DllGetObjectClass函数

举报
Rolle 发表于 2024/10/15 22:50:47 2024/10/15
【摘要】 在组件对象模型(COM)中,类厂(Class Factory)和 DllGetClassObject 函数是创建和管理 COM 对象的关键组件。本文将深入探讨这两个概念,包括它们的作用、实现方式以及在 COM 编程中的应用。COM 类厂(Class Factory)类厂是 COM 对象的生产基地,它负责创建特定类型的 COM 对象。每个 COM 类都有一个与之对应的类厂,用于创建该类的实例。...

在组件对象模型(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 组件,这些组件可以在不同的应用程序和进程中使用。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。