2010-11-14 32 views
11

tôi cần để có được đường dẫn đầy đủ từ một PID, tôi kiểm tra câu hỏi này C++ Windows - How to get process path from its PIDlấy đường dẫn đầy đủ từ một PID sử dụng delphi

và tôi đã viết mã này

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; 

nhưng luôn luôn trở lại thông điệp này

module cụ thể không thể tìm thấy

cách tôi có thể trả lại đường dẫn đầy đủ từ một pid?

Trả lời

17

Bạn cần sử dụng chức năng GetModuleFileNameEx. Từ MSDN:

GetModuleFileName Chức năng

Lấy con đường đủ điều kiện cho các tập tin có chứa các module cụ thể. Mô-đun phải được tải bởi quy trình hiện tại.

Để định vị tệp cho mô-đun mà đã được tải bởi một quy trình khác, hãy sử dụng hàm GetModuleFileNameEx.

sử dụng mẫu (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; 
Các vấn đề liên quan