IMoniker::BindToStorage 方法 (objidl.h)

绑定到指定对象的存储。 与 IMoniker::BindToObject 方法不同,此方法不会激活由名字对象标识的对象。

语法

HRESULT BindToStorage(
  [in]  IBindCtx *pbc,
  [in]  IMoniker *pmkToLeft,
  [in]  REFIID   riid,
  [out] void     **ppvObj
);

参数

[in] pbc

指向绑定上下文对象上的 IBindCtx 接口的指针,该接口在此绑定操作中使用。 绑定上下文缓存绑定过程中绑定的对象,包含应用于使用绑定上下文的所有操作的参数,并提供名字对象实现应检索有关其环境的信息的方法。

[in] pmkToLeft

如果名字对象是复合名字对象的一部分,则指向此名字对象左侧的名字对象的指针。 此参数主要由名字对象实现者用来启用复合名字对象的各个组件之间的协作。 名字对象客户端应使用 NULL

[in] riid

对所请求的存储接口标识符的引用,其指针将在 ppvObj 中返回。 通常请求的存储接口包括 IStorageIStreamILockBytes

[out] ppvObj

接收 riid 中请求的接口指针的指针变量的地址。 成功返回后,*ppvObj 包含指向名字对象所标识的对象的存储的请求接口指针。 成功后,实现必须在存储上调用 AddRef 。 调用 发布由调用方负责。 如果发生错误,*ppvObj 应为 NULL

返回值

此方法可以返回E_UNEXPECTED的标准返回值,以及以下值。

返回代码 说明
S_OK
绑定操作成功。
MK_E_NOSTORAGE
此名字对象标识的对象没有自己的存储。
MK_E_EXCEEDEDDEADLINE
无法在绑定上下文的 BIND_OPTS 结构指定的时间限制内完成绑定操作。
MK_E_CONNECTMANUALLY
操作无法连接到存储,可能是因为无法连接到网络设备。 有关详细信息,请参阅 IMoniker::BindToObject
MK_E_INTERMEDIATEINTERFACENOTSUPPORTED
找到了中间对象,但它不支持完成绑定操作所需的接口。 例如,如果项名字对象容器不支持 IOleItemContainer 接口,则返回此值。
STG_E_ACCESSDENIED
无法访问存储对象。
 

此方法还可以返回与 IOleItemContainer::GetObject 方法关联的错误。

注解

BindToObjectBindToStorage 方法之间存在重要区别。 例如,如果有标识电子表格对象的名字对象,则调用 BindToObject 提供对电子表格对象本身的访问权限,而调用 BindToStorage 提供对电子表格所在的存储对象的访问。

调用方备注

尽管没有 COM 名字对象类在其绑定操作中调用此方法,但在新的名字对象类的实现中调用此方法可能合适。 可以在 BindToObject 的实现中调用此方法,该方法需要 pmkToLeft 参数标识的对象中的信息,并且无需激活即可从对象的持久存储中获取它。 例如,如果使用名字对象来标识可以在不激活其容器的情况下激活的对象,你可能会发现此方法很有用。

可以读取其名字对象标识的对象的存储的客户端也可以调用此方法。

实施者说明

实现应找到由当前名字对象标识的 对象的持久存储,并返回所需的接口指针。 某些类型的名字对象表示伪对象,这些对象没有自己的持久存储。 此类对象包含其容器内部状态的某些部分,例如电子表格中的单元格区域。 如果名字对象类标识此类型的对象,则 BindToStorage 的实现应MK_E_NOSTORAGE返回错误。

如果绑定上下文的 BIND_OPTS 结构指定了 BINDFLAGS_JUSTTESTEXISTENCE 标志,则实现可以选择在 ppvObj (中返回 NULL,不过你也可以忽略标志并) 执行完整的绑定操作。

特定于实现的说明

实现 备注
反名字对象 此方法返回E_NOTIMPL。
类名字对象 此方法转发到类名字对象的 BindToObject
文件名字对象 此方法打开由名字对象表示的路径指定的文件,并返回指向该文件的 IStorage 指针。 方法仅支持绑定到 IStorage 接口;如果在 riid 中请求 IStreamILockBytes,则该方法返回E_UNSPEC,如果请求其他接口,则此方法返回E_NOINTERFACE。 除非 pmkToLeft 是类名字对象, 否则 pmkToLeft 应为 NULL,如 IMoniker::BindToObject 的实现中所示。
泛型复合名字对象 此方法以递归方式调用复合组件最右侧的 BindToStorage ,将复合的其余部分作为该调用的 pmkToLeft 参数传递。
项名字对象 如果 pmkToLeftNULL,则此方法返回E_INVALIDARG。 否则,该方法对 pmkToLeft 参数调用 IMoniker::BindToObject,请求 IOleItemContainer 接口指针。 然后, 方法为请求的接口调用 IOleItemContainer::GetObjectStorage
OBJREF 名字对象 此方法获取一个封送指针,该指针指向包含运行对象的存储上请求的接口。 由于 OBJREF 名字对象表示正在运行的对象,因此不会进行激活。 如果表示的对象不再运行, BindToStorage 将失败并E_UNEXPECTED。
指针名字对象 此方法查询所请求接口的包装指针。
URL 名字对象 URL 名字对象的系统实现支持 BindToStorage 用于所有 URL 上的流对象以及指定资源是复合文件时的存储对象。

由于 URL 名字对象支持异步绑定,因此其 BindToStorage 的实际返回值可能因绑定上下文中建立的对象参数而异。 但是,无论同步还是异步使用,绑定操作的语义都是相同的,如下所示:

要求

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

另请参阅

IMoniker