ロックされたファイルの詳細については、下記の方法を試してみてください。ファイルが使用中で、どのアプリケーションによってチェックされていますか?
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
何が間違っていますか?
http://stackoverflow.com/questions/2479733/file-locked-by-which-process/にも同様の質問がありますが、.NETの場合は同じです。あなた自身の質問に答えるのに役立つかもしれません。 –