coRegisterClassObject 函数 (combaseapi.h)

将 EXE 类对象注册到 OLE,以便其他应用程序可以连接到该对象。

语法

HRESULT CoRegisterClassObject(
  [in]  REFCLSID  rclsid,
  [in]  LPUNKNOWN pUnk,
  [in]  DWORD     dwClsContext,
  [in]  DWORD     flags,
  [out] LPDWORD   lpdwRegister
);

参数

[in] rclsid

要注册的 CLSID。

[in] pUnk

指向正在发布其可用性的类对象上的 IUnknown 接口的指针。

[in] dwClsContext

要在其中运行可执行代码的上下文。 有关这些上下文值的信息,请参阅 CLSCTX 枚举。

[in] flags

指示如何与类对象建立连接。 有关这些标志的信息,请参阅 REGCLS 枚举。

[out] lpdwRegister

指向标识已注册的类对象的值的指针;稍后由 CoRevokeClassObject 函数用来撤销注册。

返回值

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

返回代码 说明
S_OK
已成功注册类对象。

注解

EXE 对象应用程序应在启动时调用 CoRegisterClassObject 。 它还可用于注册内部对象,供同一 EXE 或其他代码 (使用,如 EXE 使用的 DLL) 。 只有 EXE 对象应用程序调用 CoRegisterClassObject。 对象处理程序或 DLL 对象应用程序不调用此函数,而是必须实现和导出 DllGetClassObject 函数。

启动时,多用途 EXE 对象应用程序必须创建一个类对象, (其上的 IClassFactory 接口) ,并调用 CoRegisterClassObject 来注册类对象。 支持多个不同类 (的对象应用程序(如多种类型的可嵌入对象) 必须为每个类分配和注册不同的类对象。

同一类对象的多个注册是独立的,不产生错误。 每个后续注册都会在 lpdwRegister 中生成一个唯一密钥。

多个文档接口 (MDI) 应用程序必须注册其类对象。 单一文档接口 (SDI) 应用程序必须注册其类对象,前提是它们可以通过 /Embedding 开关启动。

类对象的服务器应调用 CoRevokeClassObject 来撤销类对象, (删除其注册) ,如果以下所有条件都成立:

  • 对象定义没有现有实例。
  • 类对象上没有锁。
  • 向类对象提供服务的应用程序不受用户控制, (在显示器) 上对用户不可见。
撤销类对象后,当其引用计数达到零时,可以释放类对象,从而允许应用程序退出。 请注意,CoRegisterClassObject 调用 IUnknown::AddRef,CoRevokeClassObject 调用 IUnknown::Release,因此这两个函数构成 AddRef/Release 对。

从 Windows Server 2003 开始,如果 COM 对象应用程序注册为服务,则 COM 会验证注册。 COM 确保服务控制管理器 (SCM) 中服务的进程 ID 与注册进程的进程 ID 匹配。 否则,COM 注册失败。 如果 COM 对象应用程序在没有注册表项的系统帐户中运行,则 COM 会将对象应用程序标识视为 “启动用户”。

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

CLSCTX

CoGetClassObject

CoRevokeClassObject

DllGetClassObject

REGCLS