2010-11-14 5 views
11

मैं एक पीआईडी ​​से पूर्ण पथ प्राप्त करने की आवश्यकता का उपयोग कर पाने के लिए, मैं इस सवाल का C++ Windows - How to get process path from its PIDएक पीआईडी ​​से पूरा पथ डेल्फी

की जाँच करें और मैं इस कोड लिखा

function GetFullPathFromPID(PID: DWORD): string; 
var 
    hProcess: THandle; 
    ModName : Array[0..MAX_PATH + 1] of Char; 
begin 
    Result:=''; 
    hProcess := OpenProcess(PROCESS_ALL_ACCESS,False, PID); 
    try 
     if hProcess <> 0 then 
     if GetModuleFileName(hProcess, ModName, Sizeof(ModName))<>0 then 
     Result:=ModName 
     else 
     ShowMessage(SysErrorMessage(GetLastError)); 
    finally 
    CloseHandle(hProcess); 
    end; 
end; 

लेकिन हमेशा इस संदेश वापस

निर्दिष्ट मॉड्यूल पाया

नहीं किया जा सका

मैं एक पिड से पूरा पथ कैसे वापस कर सकता हूं?

उत्तर

17

आपको GetModuleFileNameEx फ़ंक्शन का उपयोग करने की आवश्यकता है। MSDN से:

GetModuleFileName समारोह

पुन: प्राप्त करता फ़ाइल कि निर्दिष्ट मॉड्यूल शामिल हैं के लिए पूरी तरह से योग्य पथ। मॉड्यूल को वर्तमान प्रक्रिया द्वारा लोड किया जाना चाहिए।

एक मॉड्यूल के लिए फ़ाइल का पता लगाने के लिए किसी अन्य प्रक्रिया द्वारा लोड किया गया था, GetModuleFileNameEx फ़ंक्शन का उपयोग करें।

नमूना उपयोग (uses PsAPI):

function GetPathFromPID(const PID: cardinal): string; 
var 
    hProcess: THandle; 
    path: array[0..MAX_PATH - 1] of char; 
begin 
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID); 
    if hProcess <> 0 then 
    try 
     if GetModuleFileNameEx(hProcess, 0, path, MAX_PATH) = 0 then 
     RaiseLastOSError; 
     result := path; 
    finally 
     CloseHandle(hProcess) 
    end 
    else 
    RaiseLastOSError; 
end;