2013-02-11 5 views
7

ロックされたファイルの詳細については、下記の方法を試してみてください。ファイルが使用中で、どのアプリケーションによってチェックされていますか?

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ビットOS、ワードファイルと.msgファイルを開く。

エクスプローラからファイルを開いて、削除しようとしました。ファイルが開かれているアプリケーションに関する適切な詳細が表示されます。私のアプリケーションでは、ファイルが開かれているアプリケーションに関する情報を表示しようとしています。しかし、IFileIsInUseインターフェイスへのポインタをキャストしようとすると、の戻りコードQueryInterfaceで呼び出しが失敗します。これは、ROTのオブジェクトがIFileIsInUseを実装していないことを意味します。 AFASIK、MS Officeファイルの実装IFileIsInUse

何が間違っていますか?

+0

http://stackoverflow.com/questions/2479733/file-locked-by-which-process/にも同様の質問がありますが、.NETの場合は同じです。あなた自身の質問に答えるのに役立つかもしれません。 –

答えて

7

実際にコードは正常に動作します。問題は、あなたが実際にテストしているプログラムがIFileIsInUseを実装していないことです。システムがE_NOINTERFACEを返すときは正確です。インターフェイスは実装されていません。

私はこれをFile Is In Use Sample from the SDKでテストしました。 IFileIsInUseを実装している、そのアプリケーションによってROTに追加されたファイルは、あなたのコードによって取り上げられました。一方、Acrobat 8​​とWord 2010で開かれたファイルはそうではありませんでした。

私がこれから引き出す結論は、基本的には良い考えですが、アプリケーションがそれをサポートしていない場合はそれほど役に立ちません。そして、それはない主要なアプリケーションがあるように見えます。

IFileIsInUseが実装されていないことがわかったときに、ファイルがロックされているアプリケーションを検出するために、1つ以上の他のメカニズムを使用する必要があることは明らかです。

+0

@Pavanこれが役に立ちましたか? –

+0

はい。ありがとうございました。フォールバックアプローチは、オブジェクトがIFileIsInUseを実装していないときにデータをフェッチするために使用されます。 – Pavan

関連する問題