DllGetClassObject 函数是 COM(Component Object Model)中的一个标准函数,它用于获取类工厂对象的指针。这个函数通常由 DLL 的导出的 DllGetClassObject 函数中的 IClassFactory2 接口调用。

以下是 DllGetClassObject 函数的基本定义:
STDAPI DllGetClassObject(
  REFCLSID rclsid,
  REFIID   riid,
  LPVOID   *ppv
);

参数说明:

  •  rclsid: 要创建的类的 CLSID。

  •  riid: 请求的接口的 IID。

  •  ppv: 接收类工厂接口指针的地址。


函数返回 HRESULT 类型的值,表示操作的结果。如果函数成功执行,返回 S_OK,并通过 ppv 参数返回请求的接口指针;否则返回相应的错误代码。

示例用法:
#include <Windows.h>
#include <Combaseapi.h>

// 实现IClassFactory2接口的类工厂
class MyFactory : public IClassFactory2 {
    // 在此省略IClassFactory2接口的实现
};

// 导出函数,由DllGetClassObject调用
extern "C" HRESULT STDMETHODCALLTYPE DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) {
    // 如果请求的类的CLSID匹配,返回类工厂接口指针
    if (IsEqualCLSID(rclsid, CLSID_MyClass)) {
        MyFactory *pFactory = new MyFactory();
        if (pFactory) {
            HRESULT hr = pFactory->QueryInterface(riid, ppv);
            pFactory->Release();
            return hr;
        }
        return E_OUTOFMEMORY;
    }

    // 如果不匹配,返回CLASS_E_CLASSNOTAVAILABLE
    return CLASS_E_CLASSNOTAVAILABLE;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved) {
    switch (ul_reason_for_call) {
        case DLL_PROCESS_ATTACH:
            // DLL 加载时的初始化
            break;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            // DLL 卸载时的清理
            break;
    }
    return TRUE;
}

在这个例子中,DllGetClassObject 函数根据传入的 rclsid 参数判断请求的类是否匹配,如果匹配则创建一个类工厂对象,并通过 QueryInterface 返回请求的接口指针。在实际的 COM DLL 中,通常会有更复杂的实现,涉及到注册表的处理,对象的创建和销毁,以及相应的计数机制。这里的示例是一个简化版本,用于说明 DllGetClassObject 函数的基本用法。


转载请注明出处:http://www.zyzy.cn/article/detail/24597/Win32 API/Combaseapi.h/DllGetClassObject