delphi 如何获取进程的全路径名  
官方Delphi 学习QQ群: 682628230(三千人)
频道

delphi 如何获取进程的全路径名


一、Win7下如何获取进程的全路径名?
[delphi] 
1、程序必须包含配置UAC  
  
2、用以下函数代码取路径  
uses TLHelp32,psapi;  
  
function FindProcess(AFileName: string;var ID:Cardinal): boolean;  
var  
   hSnapshot: THandle;//用于获得进程列表  
   lppe: TProcessEntry32;//用于查找进程  
   Found: Boolean;//用于判断进程遍历是否完成  
begin  
   Result :=False;  
   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统进程列表  
   lppe.dwSize := SizeOf(TProcessEntry32);//在调用Process32First API之前,需要初始化lppe记录的大小  
   Found := Process32First(hSnapshot, lppe);//将进程列表的第一个进程信息读入ppe记录中  
   while Found do  
   begin  
     if ((UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AFileName)) or (UpperCase(lppe.szExeFile )=UpperCase(AFileName))) then  
     begin  
       ID:=lppe.th32ProcessID;  
  
       Result :=True;  
     end;  
     Found := Process32Next(hSnapshot,lppe);//将进程列表的下一个进程信息读入lppe记录中  
   end;  
  
end;  
  
   
function GetProcessPath(ProcessID: DWORD): string;  
var  
     Hand: THandle;  
     ModName: Array[0..Max_Path-1] of Char;  
     hMod: HModule;  
     n: DWORD;  
begin  
     Result:='';  
     Hand:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,ProcessID);  
     if Hand>0 then  
     try  
       ENumProcessModules(Hand,@hMod,Sizeof(hMod),n);  
       if GetModuleFileNameEx(Hand,hMod,ModName,Sizeof(ModName))>0 then  
         Result:=ExtractFilePath(ModName);  
     except  
     end;  
end;  
  
  
procedure TForm1.Button1Click(Sender: TObject);  
var  
  Test:Dword;  
  Path:string;  
begin  
  FindProcess('Test.exe',Test);  
  Path:= GetProcessPath(Test);  
  ShowMessage(Path);  
end;  

二、参考代码2
[delphi] 
function TfUpdate.FindProcess(AFileName: string): boolean;  
var  
  hSnapshot: THandle;//用于获得进程列表  
  lppe: TProcessEntry32;//用于查找进程  
  Found: Boolean;//用于判断进程遍历是否完成  
  KillHandle: THandle;//用于杀死进程  
begin  
  Result :=False;  
  hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统进程列表  
  lppe.dwSize := SizeOf(TProcessEntry32);//在调用Process32First API之前,需要初始化lppe记录的大小  
  Found := Process32First(hSnapshot, lppe);//将进程列表的第一个进程信息读入ppe记录中  
  while Found do  
  begin  
    if ((UpperCase(ExtractFileName(lppe.szExeFile))=UpperCase(AFileName)) or (UpperCase(lppe.szExeFile )=UpperCase(AFileName))) then  
    begin  
      {if MsShow('发现打开Excel,是否将其关闭?',2)=6 then 
      begin 
      //由于我的操作系统是xp,所以在调用TerminateProcess API之前 
      //我必须先获得关闭进程的权限,如果操作系统是NT以下可以直接中止进程 
      KillHandle := OpenProcess(PROCESS_TERMINATE, False, lppe.th32ProcessID); 
      TerminateProcess(KillHandle, 0);//强制关闭进程 
      CloseHandle(KillHandle); 
      end;}  
      Result :=True;  
    end;  
    Found := Process32Next(hSnapshot, lppe);//将进程列表的下一个进程信息读入lppe记录中  
  end;  
end;  
  
procedure TfUpdate.EndProcess(AFileName: string);  
const  
  PROCESS_TERMINATE = $0001;  
var  
  ContinueLoop: BOOL;  
  FSnapShotHandle: THandle;  
  FProcessEntry32: TProcessEntry32;  
begin  
  FSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0);  
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);  
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);  
  while integer(ContinueLoop) <> 0 do  
  begin  
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(AFileName)) or (UpperCase(FProcessEntry32.szExeFile )=UpperCase(AFileName))) then  
    TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0);  
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);  
  end;  
end;  
  
备注: TProcessEntry32 需要引用单元 uses TLHelp32  

推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.069445133209229 seconds