IFileIsInUse 接口 (shobjidl_core.h)

公开可调用的方法,以便获取有关或关闭另一个应用程序正在使用的文件的信息。 当应用程序尝试访问某个文件时发现该文件已在使用中时,它可以使用此接口的方法收集信息,以在对话框中向用户显示。

继承

IFileIsInUse 接口继承自 IUnknown 接口。 IFileIsInUse 还具有以下类型的成员:

方法

IFileIsInUse 接口包含以下方法。

 
IFileIsInUse::CloseFile

关闭当前正在使用的文件。
IFileIsInUse::GetAppName

检索正在使用该文件的应用程序的名称。
IFileIsInUse::GetCapabilities

确定是否可以关闭文件,以及 UI 是否能够切换到使用该文件的应用程序的窗口。
IFileIsInUse::GetSwitchToHWND

检索正在使用该文件的应用程序的顶级窗口的句柄。
IFileIsInUse::GetUsage

获取一个值,该值指示正在使用的文件的使用方式。

注解

在 Windows Vista 之前的 Windows 版本中,当用户尝试访问在另一个应用程序中打开的文件时,用户只会收到一个对话框,其中包含一条消息,指出该文件已打开。 该消息指示用户关闭另一个应用程序,但未标识它。 除了该建议之外,对话框不提供任何用户操作来解决这种情况。 此接口提供了一些方法,可以生成一个信息性更高的对话框,用户可以从中直接执行操作。

正在运行的对象表

当应用程序打开文件时,该应用程序通过将实例化的 IFileIsInUse 对象插入正在运行的对象表中来注册该文件, (ROT) 。 ROT 是一个全局可访问的查找表,用于跟踪当前正在运行的对象。 这些对象可由名字对象标识。 当客户端尝试将名字对象绑定到对象时,该名字对象会检查 ROT 以确定该对象是否已在运行。 这允许名字对象绑定到当前实例,而不是加载新实例。

执行以下步骤,将文件添加到 ROT:

  1. 调用 GetRunningObjectTable 函数以检索 IRunningObjectTable 的实例。
  2. 为当前正在使用的文件创建 IFileIsInUse 对象。
  3. 为当前正在使用的文件创建 IMoniker 对象。
  4. 通过调用 IRunningObjectTable::RegisterIFileIsInUseIMoniker 对象插入 ROT。

在对 Register 的调用中,指定 ROTFLAGS_ALLOWANYCLIENT 标志。 这允许 ROT 条目跨安全边界工作。 使用此标志要求调用应用程序具有显式应用程序用户模型 ID (AppUserModelID) (System.AppUserModel.ID) 。 显式 AppUserModelID 允许组件对象模型 (COM) 检查应用程序的安全设置。 尝试 调用 Register with ROTFLAGS_ALLOWANYCLIENT 且没有显式 AppUserModelID 将失败。 可以在没有ROTFLAGS_ALLOWANYCLIENT标志的情况下调用 Register ,应用程序将正常工作,但只能在其自己的安全级别内工作。

在 Register 方法的 [out] 参数中检索的值用于标识后续调用中的条目,以便从 ROT 中检索或删除该条目。

何时实现

打开可由其他应用程序打开的文件类型的应用程序应实现 IFileIsInUse。 应用程序实现此接口使 Windows 资源管理器能够发现共享错误的来源,使用户能够处理和重试因这些错误而失败的操作。

何时使用

应用程序调用 IFileIsInUse 与其他应用程序通信以解决共享错误。 这些错误发生于响应文件系统中的用户操作。 例如,当用户尝试重命名某个文件夹时,该文件夹中的文件在应用程序中打开时,重命名操作会失败。 Windows 资源管理器可以调用该应用程序的 IFileIsInUse 实现,以帮助用户识别冲突并解决此问题。

样品

请参阅 File Is In Use 示例,该示例演示如何实现 IFileIsInUse 并使用 ROT 注册文件。 然后演示如何自定义“ 正在使用中的文件 ”对话框,以显示当前在应用程序中打开的文件的其他信息和选项。

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 shobjidl_core.h (包括 Shobjidl.h)

另请参阅

应用程序用户模型 ID (AppUserModelIDs)