COM - 实现DllGetClassObject

时间:2013-06-11 10:27:23

标签: c++ winapi dll com

我试图了解在没有MFC / ATL帮助的情况下创建/使用COM组件以了解其内部工作原理。 我使用this codeguru article作为参考。以下是我遵循的步骤。

  • 创建了Wind32 Dll,
  • 添加了MIDL文件并声明了接口IAdd和库名DemoMath;使用MIDL编译器编译代码。
  • 创建了CAddObj类派生IAdd接口,为IAddIUnknown接口提供了实现。
  • CAddFactory接口派生的创建的类IClassFactory;为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文件时生成的(虽然我没有找到)?

1 个答案:

答案 0 :(得分:1)

coclass IDL项目通常会让您获得CLSID:

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

然后在你的“IAdd_i.c”中你已经包括:

MIDL_DEFINE_GUID(CLSID, CLSID_AddObject, ...);

这是定义CLSID_AddObject的原因。