IClassFactory::CreateInstance 方法 (unknwn.h)

创建未初始化的对象。

语法

HRESULT CreateInstance(
  [in]  IUnknown *pUnkOuter,
  [in]  REFIID   riid,
  [out] void     **ppvObject
);

参数

[in] pUnkOuter

如果对象是作为聚合的一部分创建的,请指定指向聚合的控制 IUnknown 接口的指针。 否则,此参数必须为 NULL

[in] riid

对接口标识符的引用,用于与新创建的对象通信。 如果 pUnkOuterNULL,则此参数通常是初始化接口的 IID;如果 pUnkOuter 为非 NULL,则必须IID_IUnknown riid

[out] ppvObject

接收 riid 中请求的接口指针的指针变量的地址。 成功返回后,*ppvObject 包含请求的接口指针。 如果 对象不支持 riid 中指定的接口,则实现必须将 *ppvObject 设置为 NULL

返回值

此方法可以返回标准返回值E_INVALIDARG、E_OUTOFMEMORY和E_UNEXPECTED,以及以下值。

返回代码 说明
S_OK
已创建指定的对象。
CLASS_E_NOAGGREGATION
pUnkOuter 参数为非 NULL,对象不支持聚合。
E_NOINTERFACE
ppvObject 指向的对象不支持 riid 标识的接口。

注解

COM 服务器的 CreateInstance 实现必须返回对属于服务器的 DCOM 解析程序的单元中包含的对象的引用。 它不得返回对远程单元中包含的对象的引用。

IClassFactory 接口始终位于类对象上。 CreateInstance 方法创建使用指定的 CLSID 标识的类的未初始化对象。 以这种方式创建对象时,必须使用 CoRegisterClassObject 函数在系统注册表中注册 CLSID。

pUnkOuter 参数指示是否创建对象作为聚合的一部分。 对象定义不需要支持聚合 - 它们必须经过专门设计和实现才能支持聚合。

riid 参数指定与新对象通信的接口) 的 IID (接口标识符。 如果 pUnkOuter 为非 NULL (指示聚合) ,则必须IID_IUnknown riid 参数的值。 如果对象不是聚合的一部分,则 riid 通常会指定接口,但该接口将初始化对象。

对于 OLE 嵌入,初始化接口为 IPersistStorage,但在其他情况下,使用其他接口。 若要初始化 对象,必须在初始化接口中对相应方法进行后续调用。 常见的初始化函数包括 IPersistStorage::InitNew (,用于新的空白可嵌入组件) , IPersistStorage::Load (,用于重载的可嵌入组件) 、 IPersistStream::Load, (存储在流对象) 的对象或存储在文件) 中的对象的 IPersistFile::Load (。

通常,如果应用程序仅支持一类对象,并且该类对象注册为一次性使用,则只能创建一个对象。 应用程序不得创建其他对象,执行此操作的请求应从 IClassFactory::CreateInstance 返回错误。 对于支持多个类的应用程序也是如此,每个类都注册了一个类对象供一次性使用;调用一个类的 CreateInstance ,然后调用应返回错误的任何类的 CreateInstance

为了避免返回错误,支持具有一次性类对象的多个类的应用程序可以在收到实例化第二个类的请求时调用 CoRevokeClassObject 来撤销第一个类的已注册类对象。 例如,假设有两个类,A 和 B。为类 A 调用 CreateInstance 时,撤消 B 的类对象。创建 B 时,撤消 A 的类对象。此解决方案使关闭复杂化,因为其中一个类对象可能已 (撤消,并且无法在) 撤消两次。

要求

   
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 unknwn.h

另请参阅

CoCreateInstance

CoGetClassObject

CoRegisterClassObject

CoRevokeClassObject

IClassFactory