IRunningObjectTable::Register 方法 (objidl.h)

在运行的对象表中注册对象及其标识名字对象, (ROT) 。

语法

HRESULT Register(
  [in]  DWORD    grfFlags,
  [in]  IUnknown *punkObject,
  [in]  IMoniker *pmkObjectName,
  [out] DWORD    *pdwRegister
);

参数

[in] grfFlags

指定 ROT 对 punkObject 的引用是弱的还是强的,并通过 ROT 中的条目控制对对象的访问。 有关详细信息,请参见“备注”部分。

含义
ROTFLAGS_REGISTRATIONKEEPSALIVE
设置后,指示对象的强注册。
ROTFLAGS_ALLOWANYCLIENT
设置后,任何客户端都可以通过 ROT 中的条目连接到正在运行的对象。 如果未设置,则只有注册对象的窗口工作站中的客户端才能连接到该对象。

[in] punkObject

指向正在注册为正在运行的 对象的指针。

[in] pmkObjectName

指向标识 punkObject 的名字对象的指针。

[out] pdwRegister

此 ROT 条目的标识符,可用于 IRunningObjectTable::RevokeIRunningObjectTable::NoteChangeTime 的后续调用。 调用方不能为此参数指定 NULL 。 如果发生错误,则 *pdwRegister 设置为零。

返回值

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

返回代码 说明
S_OK
该方法已成功完成。
MK_S_MONIKERALREADYREGISTERED
已成功注册名字对象/对象对,但另一个对象 (可能同一对象) 已注册到同一名字对象。

注解

此方法在标识对象的名字对象下注册指向对象的指针。 使用 IRunningObjectTable::GetObject 搜索表时,该名字对象用作键。

注册对象时,ROT 始终对对象调用 AddRef 。 对于未) 设置弱注册 (ROTFLAGS_REGISTRATIONKEEPSALIVE,每当释放对对象的最后一个强引用时,ROT 就会释放该对象。 对于强注册 (ROTFLAGS_REGISTRATIONKEEPSALIVE 设置) ,ROT 会阻止对象被销毁,直到显式撤销对象的注册。

注册为 LocalService 或 RunAs 的服务器可以在调用 Register 中设置ROTFLAGS_ALLOWANYCLIENT标志,以允许任何客户端连接到它。 设置此位的服务器必须在注册表的 AppID 节中具有其可执行文件名称,该名称引用可执行文件的 AppID。 “激活为激活器”服务器 (未注册为 LocalService 或 RunAs) 不得在 调用 Register 时设置此标志。 有关安装服务的详细信息,请参阅 作为服务应用程序安装

使用同一名字对象注册第二个对象,或者使用相同的名字对象重新注册同一对象,会在 ROT 中创建第二个条目。 在这种情况下, Register 返回MK_S_MONIKERALREADYREGISTERED。 每次对 Register 的调用都必须通过对 IRunningObjectTable::Revoke 的调用进行匹配,因为即使是重复的条目也具有不同的 pdwRegister 标识符。 重复注册的一个问题是,如果在对 IRunningObjectTable::IsRunning 的后续调用中指定了名字对象,则无法确定将返回哪个对象。

调用方备注

如果你是名字对象提供程序 (即分发标识对象以使其可供其他人访问) ,则必须调用 Register 方法在对象开始运行时注册对象。 如果在加载对象时重命名对象,则还必须调用此方法。

最常见的名字对象提供程序类型是复合文档链接源。 这包括支持链接到文档 (或文档) 部分文档的服务器应用程序,以及支持链接到文档中嵌入项的容器应用程序。 不支持链接的服务器应用程序还可以使用 ROT 与支持链接到嵌入的容器应用程序合作。

如果要编写服务器应用程序,则应在开始运行时向 ROT 注册对象,通常在 IOleObject::D oVerb 的实现中。 对象必须在其完整名字对象下注册,这需要使用 IOleClientSite::GetMoniker 获取其容器文档的名字对象。 还应在 IOleObject::SetMoniker 的实现中撤销并重新注册对象,如果重命名容器文档,则会调用该对象。

如果要编写支持链接到嵌入的容器应用程序,则应在加载文档时向 ROT 注册文档。 如果文档已重命名,则应撤销该文档并将其重新注册到 ROT,并为文档中的任何嵌入对象调用 IOleObject::SetMoniker ,以便它们有机会重新注册自己。

当对象不再运行或其名字对象更改时,必须在 ROT 中注册的对象被显式撤销。 此吊销很重要,因为系统无法自动从 ROT 中删除条目。 必须缓存通过 pdwRegister 写入的标识符,并在调用 IRunningObjectTable::Revoke 时使用该标识符来撤销注册。 对于强注册,在撤销对象注册时会释放强引用。

从 Windows Server 2003 开始,如果由于意外的服务器问题而导致 ROT 中仍然存在过时条目,COM 将自动从 ROT 中删除这些过时条目。

System 的 Register 实现对 pmkObjectName 参数调用 IMoniker::Reduce,以确保在注册前完全减少名字对象。 如果对象由多个完全缩减的名字对象所知,则应在所有此类名字对象下注册该对象。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 objidl.h

另请参阅

IRunningObjectTable