लॉक की गई फ़ाइल के बारे में अधिक जानकारी प्राप्त करने के लिए नीचे उल्लिखित दृष्टिकोण का उपयोग करने का प्रयास कर रहा है।जांच कर रहा है कि फ़ाइल उपयोग में है या किस एप्लिकेशन से?
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
देता है।
प्लेटफ़ॉर्म: विंडोज 7 32 बिट-ओएस, शब्द फ़ाइलों और .msg फ़ाइलों को खोलना।
एक्सप्लोरर से खोलने वाली फ़ाइलों की जांच की गई और हटाने की कोशिश की गई। यह उस एप्लिकेशन के बारे में उचित विवरण दिखाता है जिसमें फ़ाइल खोला जाता है। मेरे आवेदन में, मैं उस एप्लिकेशन के बारे में जानकारी प्रदर्शित करने का प्रयास कर रहा हूं जिसमें फ़ाइल खोली गई है। लेकिन पॉइंटर को IFileIsInUse
इंटरफ़ेस पर डालने का प्रयास करते समय, QueryInterface
कॉल रिटर्न कोड E_NOINTERFACE
के साथ विफल रहता है जिसका अर्थ है कि आरओटी में ऑब्जेक्ट IFileIsInUse
लागू नहीं करता है। AFASIK, एमएस ऑफिस फाइलें IFileIsInUse
कोई विचार क्या गलत है?
http://stackoverflow.com/questions/2479733/file-locked-by-which-process पर समान सवाल, लेकिन .NET के लिए। अपने स्वयं के प्रश्न का उत्तर देने में मदद हो सकती है। –