1

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

  • 创建了一个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 文件时生成的(虽然我没有找到它)?

4

1 回答 1

1

coclassIDL 项目通常会为您提供 CLSID:

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

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

MIDL_DEFINE_GUID(CLSID, CLSID_AddObject, ...);

这就是定义CLSID_AddObject

于 2013-06-11T11:04:31.450 回答