COM - Implementing DllGetClassObject

COM - Implementing DllGetClassObject

本文关键字:DllGetClassObject Implementing COM      更新时间:2023-10-16

我试图在没有MFC/ATL帮助的情况下理解创建/使用COM组件以了解其内部工作原理。我正在使用这篇代码大师文章作为参考。以下是我遵循的步骤。

  • 创建了一个 Wind32 dll,
  • 添加了一个 MIDL 文件并声明了接口IAdd和库名称DemoMath;使用 MIDL 编译器编译了代码。
  • 创建CAddObj类派生IAdd接口,提供IAddIUnknown接口的实现。
  • 创建了从IClassFactory接口派生的类CAddFactory;提供了IClassFactory方法的实现。

现在创建DllGetClassObject,为客户端提供一个选项来调用此函数以获取类工厂的实例。

以下是代码:

#include "stdafx.h"
#include <objbase.h>
#include "AddObjFactory.h"
#include "IAdd_i.c"
STDAPI DllGetClassObject(const CLSID& clsid,
                         const IID& iid,
                         void** ppv)
{
    //
    //Check if the requested COM object is implemented in this DLL
    //There can be more than 1 COM object implemented in a DLL
    //
    if (clsid == CLSID_AddObject)
    {
        //
        //iid specifies the requested interface for the factory object
        //The client can request for IUnknown, IClassFactory,
        //IClassFactory2
        //
        CAddFactory *pAddFact = new CAddFactory;
        if (pAddFact == NULL)
            return E_OUTOFMEMORY;
        else
        {
            return pAddFact->QueryInterface(iid , ppv);
        }
    }
    //
    //if control reaches here then that implies that the object
    //specified by the user is not implemented in this DLL
    //
    return CLASS_E_CLASSNOTAVAILABLE;
}
现在假设定义

CLSID_AddObject常数在哪里 还是在编译 MIDL 文件时生成的(我没有找到(?

coclass IDL 项目通常会得到 CLSID:

library Foo
{
//...
    [
        //...
    ]
    coclass AddObject
    {
        //...
    };

然后在您的"IAdd_i.c"上,您已经包括:

MIDL_DEFINE_GUID(CLSID, CLSID_AddObject, ...);

这就是定义CLSID_AddObject.

相关文章:
  • 没有找到相关文章