Cố gắng sử dụng phương pháp được đề cập dưới đây để biết thêm chi tiết về tệp bị khóa.Kiểm tra xem tệp có đang được sử dụng hay ứng dụng nào không?
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;
Nhưng cuộc gọi đến
unkInt.QueryInterface(IID_IFileIsInUse, result)
luôn trả E_NOINTERFACE
.
Nền tảng: Windows 7 32 bit-OS, mở tệp từ và tệp .msg.
Đã kiểm tra các tệp mở từ trình khám phá và cố gắng xóa. Nó hiển thị chi tiết thích hợp về ứng dụng trong đó tệp được mở. Trong ứng dụng của tôi, tôi cố gắng hiển thị thông tin về ứng dụng trong đó tệp được mở. Nhưng khi cố gắng đưa con trỏ đến giao diện IFileIsInUse
, các cuộc gọi QueryInterface
không thành công với mã trả về E_NOINTERFACE
có nghĩa là đối tượng trong ROT không thực hiện IFileIsInUse
. Tệp AFASIK, MS Office triển khai IFileIsInUse
Bất kỳ ý tưởng nào là sai ở đây?
Câu hỏi tương tự tại http://stackoverflow.com/questions/2479733/file-locked-by-which-process, nhưng đối với .NET. Có thể là một trợ giúp trong việc trả lời câu hỏi của riêng bạn. –