gpt4 book ai didi

c++ - COM - 实现 DllGetClassObject

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:47 30 4
gpt4 key购买 nike

我试图在不借助 MFC/ATL 了解其内部工作原理的情况下理解创建/使用 COM 组件。我正在使用 this codeguru article供引用。以下是我遵循的步骤。

  • 创建了一个 Wind32 Dll,
  • 添加了一个 MIDL 文件并声明了接口(interface) IAdd 和库名称 DemoMath;使用 MIDL 编译器编译代码。
  • 创建了派生IAdd接口(interface)的CAddObj类,提供了IAddIUnknown接口(interface)的实现。
  • 创建了派生自 IClassFactory 接口(interface)的类 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 的定义。

关于c++ - COM - 实现 DllGetClassObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17041907/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com