coGetClassObject 函数 (combaseapi.h)

提供指向与指定 CLSID 关联的类对象上的接口的指针。 CoGetClassObject 查找并根据需要动态加载执行此操作所需的可执行代码。

直接调用 CoGetClassObject ,通过系统注册表中存在 CLSID 的类对象创建多个对象。 还可以从特定远程计算机检索类对象。 大多数类对象实现 IClassFactory 接口。 然后调用 CreateInstance 来创建未初始化的对象。 但是,并非总是需要完成此过程。 若要创建单个对象,请调用 CoCreateInstanceEx 函数,该函数允许在远程计算机上创建实例。 这将替换 CoCreateInstance 函数,该函数仍可用于在本地计算机上创建实例。 这两个函数封装连接到类对象、创建 实例和释放类对象。 另外两个函数 CoGetInstanceFromFileCoGetInstanceFromIStorage 在远程系统上提供实例创建和对象激活。 有许多函数和接口方法,其用途是创建单个类型的对象,并提供指向该对象上的接口的指针。

语法

HRESULT CoGetClassObject(
  [in]           REFCLSID rclsid,
  [in]           DWORD    dwClsContext,
  [in, optional] LPVOID   pvReserved,
  [in]           REFIID   riid,
  [out]          LPVOID   *ppv
);

参数

[in] rclsid

与将用于创建对象的数据和代码关联的 CLSID。

[in] dwClsContext

要在其中运行可执行代码的上下文。 若要启用远程激活,请包含 CLSCTX_REMOTE_SERVER。 有关上下文值及其用法的详细信息,请参阅 CLSCTX 枚举。

[in, optional] pvReserved

指向要实例化类对象的计算机的指针。 如果此参数为 NULL,则根据 dwClsCtx 参数的解释,在当前计算机上或在类的 RemoteServerName 键下指定的计算机上实例化类对象。 请参阅 COSERVERINFO

[in] riid

对接口标识符的引用,成功返回时将在 ppv 中提供该标识符。 此接口将用于与类对象通信。 通常,此值IID_IClassFactory,但允许其他值(如支持某种形式的许可的 IID_IClassFactory2)。 所有 OLE 定义的接口 IID 在 OLE 头文件中定义为 IID_interfacename,其中 interfacename 是接口的名称。

[out] ppv

接收 riid 中请求的接口指针的指针变量的地址。 成功返回后,*ppv 包含请求的接口指针。

返回值

此函数可以返回以下值。

返回代码 说明
S_OK
与指定类对象的位置和连接成功。
REGDB_E_CLASSNOTREG
CLSID 未正确注册。 此错误也可能指示你在 dwClsContext 中指定的值不在注册表中。
E_NOINTERFACE
ppv 指向的对象不支持 riid 标识的接口,或者对E_NOINTERFACE返回的类对象执行 QueryInterface 操作。
REGDB_E_READREGDB
读取注册数据库时出错。
CO_E_DLLNOTFOUND
(找不到进程内 DLL 或处理程序 DLL,具体取决于上下文) 。
CO_E_APPNOTFOUND
仅在) (CLSCTX_LOCAL_SERVER 找不到可执行文件 (.exe) 。
E_ACCESSDENIED
加载时出现常规访问失败。
CO_E_ERRORINDLL
可执行映像中存在错误。
CO_E_APPDIDNTREG
可执行文件已启动,但它未 (注册类对象,并且可能已关闭) 。

注解

OLE 中的类对象是一个中间对象,它支持允许对一组对象通用操作的接口。 此组中的对象是派生自由单个 CLSID 表示的同一对象定义的实例。 通常,在类对象上实现的接口是 IClassFactory,通过该接口可以创建给定定义的对象实例 (类) 。

CoGetClassObject 的调用通过指向) 类对象的 riid 参数指定的接口的指针创建、初始化和授予调用方访问 (。 类对象是与 在 rclsid 参数中指定的 CLSID 关联的对象。 系统如何在计算机中查找关联代码和数据的详细信息对调用方是透明的,任何尚未加载的代码的动态加载都是透明的。

如果类上下文CLSCTX_REMOTE_SERVER,指示需要远程激活,则 pServerInfo 参数中提供的 COSERVERINFO 结构允许您指定服务器所在的计算机。 有关 在 pServerInfoNULL 时用于查找远程服务器的算法的信息,请参阅 CLSCTX 枚举。

有两个位置可以查找类的 CLSID:

  • 注册表保存 CLSD 和文件后缀之间的关联,以及 CLSD 与文件签名之间的关联,用于确定对象的类。
  • 将对象保存到持久存储时,其 CLSID 将随其数据一起存储。
若要创建和初始化嵌入的或链接的 OLE 文档对象,无需直接调用 CoGetClassObject 。 请改为调用 OleCreateOleCreateXXX 函数。 这些函数封装整个对象实例化和初始化过程,并在其他函数中调用 CoGetClassObject

riid 参数指定客户端将用于与类对象通信的接口。 在大多数情况下,此接口为 IClassFactory。 这提供了对 CreateInstance 方法的访问权限,然后调用方可以通过该方法创建其实现中指定的类型的未初始化对象。 在系统中使用 CLSID 注册的所有类都必须实现 IClassFactory

但是,在极少数情况下,你可能希望指定一些其他接口来定义一组对象通用的操作。 例如,在 OLE 实现名字对象的方式中,类对象的接口是 IParseDisplayName,用于将对象的显示名称转换为名字对象。

dwClsContext 参数指定执行上下文,允许一个 CLSID 与不同执行上下文中的不同代码段相关联。 CLSCTX 枚举指定可用的上下文标志。 CoGetClassObject 根据) 注册表和当前通过调用 CoRegisterClassObject 函数注册的类对象所指示的上下文适当地查阅 (。

若要释放类对象,请使用类对象的 Release 方法。 函数 CoRevokeClassObject 仅用于从系统注册表中删除类对象的 CLSID。

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

CLSCTX

COSERVERINFO

CoCreateInstanceEx

CoRegisterClassObject

CoRevokeClassObject

通过类对象创建对象

OleCreate

OleLoad