admin管理员组

文章数量:1794759

COM 类厂和DllGetObjectClass函数

在组件对象模型(COM)中,类厂(Class Factory)和 DllGetClassObject 函数是创建和管理 COM 对象的关键组件。本文将深入探讨这两个概念,包括它们的作用、实现方式以及在 COM 编程中的应用。

COM 类厂(Class Factory)

类厂是 COM 对象的生产基地,它负责创建特定类型的 COM 对象。每个 COM 类都有一个与之对应的类厂,用于创建该类的实例。类厂本身是一个 COM 对象,它实现了 IClassFactory 接口,该接口定义了两个方法:CreateInstanceLockServer

IClassFactory 接口

IClassFactory 接口是所有类厂必须实现的接口,它的定义如下:

代码语言:javascript代码运行次数:0运行复制
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代码运行次数:0运行复制
HRESULT DllGetClassObject(
  _In_  REFCLSID rclsid,
  _In_  REFIID riid,
  _Out_ LPVOID *ppv
);
  • rclsid 参数指定了要创建的 COM 类的 CLSID。
  • riid 参数指定了请求的接口 IID,通常为 IID_IClassFactory
  • ppv 参数是一个指向指针的指针,用于接收类厂对象的接口指针。

实现示例

以下是一个简单的 DllGetClassObject 实现示例:

代码语言:javascript代码运行次数:0运行复制
#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 组件,这些组件可以在不同的应用程序和进程中使用。

本文标签: COM 类厂和DllGetObjectClass函数