delphi - 检查文件是否正在使用以及由哪个应用程序使用?

标签 delphi delphi-2009 windows-api-code-pack

尝试使用下面提到的方法来获取有关锁定文件的更多详细信息。

Is file in use

function GetFileInUseInfo(const FileName : WideString) : IFileIsInUse;
var
  ROT : IRunningObjectTable;
  mFile, enumIndex, Prefix : IMoniker;
  enumMoniker : IEnumMoniker;
  MonikerType : LongInt;
  unkInt  : IInterface;
begin
  result := nil;

  OleCheck(GetRunningObjectTable(0, ROT));
  OleCheck(CreateFileMoniker(PWideChar(FileName), mFile));

  OleCheck(ROT.EnumRunning(enumMoniker));

  while (enumMoniker.Next(1, enumIndex, nil) = S_OK) do
  begin
    OleCheck(enumIndex.IsSystemMoniker(MonikerType));
    if MonikerType = MKSYS_FILEMONIKER then
    begin
      if Succeeded(mFile.CommonPrefixWith(enumIndex, Prefix)) and
         (mFile.IsEqual(Prefix) = S_OK) then
      begin
       if Succeeded(ROT.GetObject(enumIndex, unkInt)) then
        begin
          if Succeeded(unkInt.QueryInterface(IID_IFileIsInUse, result)) then
          begin
            result := unkInt as IFileIsInUse;
            exit;
          end;
        end;
      end;
    end;
  end;
end;

但是调用

unkInt.QueryInterface(IID_IFileIsInUse, result) 

始终返回E_NOINTERFACE

平台:Windows 7 32位操作系统,打开word文件和.msg文件。

检查了从资源管理器打开文件并尝试删除。它显示有关打开文件的应用程序的正确详细信息。在我的应用程序中,我尝试显示有关打开文件的应用程序的信息。但是,当尝试将指针转换为 IFileIsInUse 接口(interface)时,QueryInterface 调用失败并返回代码 E_NOINTERFACE,这意味着 ROT 中的对象未实现 IFileIsInUse。 AFASIK,MS Office 文件实现 IFileIsInUse

知道这里出了什么问题吗?

最佳答案

事实上你的代码工作得很好。问题是您正在测试的程序确实没有实现 IFileIsInUse 。当系统返回E_NOINTERFACE时这是准确的。该接口(interface)未实现。

我用 File Is In Use Sample from the SDK 对此进行了测试。由该应用程序添加到 ROT 的文件,该应用程序确实实现了 IFileIsInUse ,被您的代码选中。另一方面,Acrobat 8​​ 和 Word 2010 打开的文件则不然。

我由此得出的结论是IFileIsInUse原则上这是一个好主意,但如果应用程序不支持它,则没有多大用处。似乎有一些主要应用程序没有这样做。

很明显,当您发现 IFileIsInUse 时,您将需要使用一种或多种其他机制来检测哪个应用程序锁定了文件。未实现。

关于delphi - 检查文件是否正在使用以及由哪个应用程序使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814624/

相关文章:

delphi - 是否可以在任务之间发送消息(OmniThreadLibrary)?

.net - 如何使用 Windows API 代码包检索存储在回收站中的项目的 'Deletion Date' 属性?

delphi - 具有多种类型的数组?

c# - 从 shell 元数据属性获取变形视频的显示大小

c# - Windows 8 备份/恢复应用程序

delphi - 如何处理复合组件中子组件的双击?

delphi - '23/02/2011 12 :34:56' is not valid date and time

delphi - 常量类实例

xml - XML和线程

database - 关于转向多层 Delphi 架构的建议