如何根据句柄获取执行文件的名称(100分)

  • 主题发起人 主题发起人 foxly
  • 开始时间 开始时间
F

foxly

Unregistered / Unconfirmed
GUEST, unregistred user!
&nbsp;有两个执行程序A和B,在A中已经取得了B的句柄,如何根据此句柄获取B的文件名称?我试过GetWindowModuleFileName,但此函数工作不是特别稳定,很多时候无法正常去的B的文件名?求教各位有没有其他的API函数可以实现此要求?或者有什么其他的方法可以实现此要求?<br>&nbsp; Thanks in advance.
 
偶已经查到了用<br>&nbsp; nInsHandle := GetWindowLong(Handle, GWL_HINSTANCE);<br>&nbsp; GetModuleFileName(nInsHandle,cBuffer,Maxlen);<br>&nbsp;各位还有其他的好方法吗?
 
Function &nbsp;GetProcessList(Ts_Exe,Ts_EMS,Ts_PID:Tstrings):boolean;<br>var Pn: TProcesseNtry32; sHandle: THandle;<br>&nbsp; &nbsp; &nbsp; &nbsp; Found: Boolean;<br>begin<br>&nbsp; &nbsp; &nbsp; &nbsp; Ts_Exe.Clear;Ts_EMS.Clear;<br>&nbsp; &nbsp; &nbsp; &nbsp; Ts_PID.Clear;<br>&nbsp; &nbsp; &nbsp; &nbsp; sHandle := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);<br>&nbsp; &nbsp; &nbsp; &nbsp; Found := Process32First(sHandle, Pn);<br>&nbsp; &nbsp; &nbsp; &nbsp; While Found do<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ts_Exe.Add(ExtractFileName(Pn.szExeFile));<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Ts_EMS.Add(ExtractFilePath(Pn.szExeFile));<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TS_PID.Add(IntToStr(Pn.th32ProcessID));<br>&nbsp; &nbsp; &nbsp; &nbsp; Found := Process32Next(sHandle, Pn);<br>&nbsp; &nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; &nbsp; &nbsp; Result:= Found;<br>end; &nbsp;<br><br><br>来自:wdy801229, 时间:2004-3-19 10:46:20, ID:2510857<br>to jfyes :能否给点注释,吾乃菜鸟<br>多谢! &nbsp;<br><br><br>来自:jfyes, 时间:2004-3-19 10:58:52, ID:2510890 | 编辑<br>在uses 加入TlHelp32单元,“Pn”是TProcesseNtry32 record记录类型; &nbsp;<br>
 
相关问题:<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=2509742<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=2510239<br>&nbsp;<br>&nbsp;
 
很简单,用getwindowthreadprocessid(that handle, id);<br>得到id再列举所有进程比对id,最后得到exename<br>我以前就做过这样的程序
 
转贴一位我敬佩的高手一程序中 部分代码<br>procedure Killpro(s:string); &nbsp;//杀文件名为指定串的程序<br>var<br>&nbsp; lppe:tprocessentry32;<br>&nbsp; sshandle:thandle;<br>&nbsp; hh:hwnd;<br>&nbsp; found:boolean;<br>begin<br>//建立系统进程快照<br>&nbsp; sshandle:=createtoolhelp32snapshot(TH32CS_SNAPALL,0);<br>//取得第一个进程<br>&nbsp; found:=process32first(sshandle,lppe);<br>//如果找到<br>while found do<br>begin<br>&nbsp; //去掉路径后的文件名<br>&nbsp; if (uppercase(extractfilename(lppe.szExeFile))=s) or (uppercase(lppe.szExeFile)=s) then<br>&nbsp; begin<br>&nbsp; &nbsp; hh:=OpenProcess(PROCESS_ALL_ACCESS,true,lppe.th32ProcessID);<br>&nbsp; &nbsp; //关闭进程 &nbsp;强制<br>&nbsp; &nbsp; TerminateProcess(hh,0);<br>&nbsp; end;<br>&nbsp; //下一个进程。。。。<br>&nbsp; found:=process32next(sshandle,lppe);<br>end;<br>CloseHandle(sshandle);<br>end;
 
看这里 : &nbsp;http://www.delphibbs.com/delphibbs/dispq.asp?lid=2529601
 
&nbsp;问题已经解决 , 楼主 请结帐 !
 
to 刘麻子,<br>那段代码好象不能在2k以后的操作系统上执行
 
当然,createtoolhelp32snapshot只是在Win9X,Me下面,<br>Win2K下边是psapi.h里头的<br>1、EnumProcesses //知道当前进程数量,<br>2、OpenProcess//逐一打开,获取句柄(循环)<br>3、GetBaseModuleName //获取基模块文件名,<br>注意:部分函数名可能不是很清楚,<br>不过在psapi.h里头,几个函数的定义靠得很近,<br>MSDN里头有参考,已经试验过,有问题再说,
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2545845<br>?我这边xp怎么能用 createtoolhelp32snapshot ??要 uses tlhelp32 ;
 
抄书:<br>在 Windows 9x 下 取得系统进程的方法就是 ToolHelp,但是NT的开发小组不喜欢这个函数<br>,于是又自行开发了其他的专用函数,包含在 psAPI.dll中,由于造成了软件的不兼容,微软<br>在后来的 2000 、 XP 下可以同时使用这两种方法。。。
 
后退
顶部