我试图了解在没有MFC / ATL帮助的情况下创建/使用COM组件以了解其内部工作原理。 我使用this codeguru article作为参考。以下是我遵循的步骤。
IAdd
和库名DemoMath
;使用MIDL编译器编译代码。CAddObj
类派生IAdd
接口,为IAdd
和IUnknown
接口提供了实现。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文件时生成的(虽然我没有找到)?
答案 0 :(得分:1)
coclass
IDL项目通常会让您获得CLSID:
library Foo
{
//...
[
//...
]
coclass AddObject
{
//...
};
然后在你的“IAdd_i.c”中你已经包括:
MIDL_DEFINE_GUID(CLSID, CLSID_AddObject, ...);
这是定义CLSID_AddObject
的原因。