liguang的一个很菜的问题.(30分)

  • 主题发起人 主题发起人 liguang
  • 开始时间 开始时间
L

liguang

Unregistered / Unconfirmed
GUEST, unregistred user!
问题中下,知道一个应用程序的hIntsnace,或者其主窗口的HWND,如何得到这个应用程序的<br>路径.由于问题比较简单,所以只给30分.
 
uses tlhelp32;<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; pe:PROCESSENTRY32;<br>&nbsp; me:MODULEENTRY32;<br>&nbsp; hp,hm:Thandle;<br>&nbsp; b,b1:boolean;<br>begin<br>&nbsp; hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);<br>&nbsp; pe.dwSize:=SizeOf(pe);<br>&nbsp; b:=Process32First(hp,pe);<br>&nbsp; while &nbsp;b do<br>&nbsp; begin<br>&nbsp; &nbsp; hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);<br>&nbsp; &nbsp; me.dwSize:=sizeof(ModuleEntry32);<br>&nbsp; &nbsp; if Module32First(hm,me) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; b1:=Module32First(hm,me);<br>&nbsp; &nbsp; while &nbsp;b1 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; if me.th32ModuleID=pe.th32ModuleID then<br>&nbsp; &nbsp; &nbsp; &nbsp; listbox1.Items.Add(me.szExePath);<br>&nbsp; &nbsp; &nbsp; b1:=Module32Next(hm,me);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>&nbsp; &nbsp; b:=Process32Next(hp,pe);<br>&nbsp; end;<br><br>end;<br><br><br>&nbsp;<br>&nbsp;<br><br>--------------------------------------------------------------------------------<br>toolhelp api 在 nt 上不支持<br>下面的可以在 nt 上运行<br>如果要copy到其他机上运行,要顺便拷贝 psapi.dll(这个dll安装delphi或者c++ builder后就有了)<br><br>#include "psapi.hpp"<br><br>假使process id是 pid 的话:<br><br>HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,pid);<br>if( NULL != hProcess )<br>&nbsp; {<br>&nbsp; HMODULE hMod;<br>&nbsp; DWORD cbNeeded;<br>&nbsp; if( EnumProcessModules( hProcess, &amp;hMod, sizeof( hMod ), &amp;cbNeeded ) )<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; char buf[MAX_PATH+1]="";<br>&nbsp; &nbsp; if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)&gt;0)<br>&nbsp; &nbsp; &nbsp; // <br>&nbsp; &nbsp; &nbsp; // buf放的就是名字<br>&nbsp; &nbsp; &nbsp; //<br>&nbsp; &nbsp; }<br>&nbsp; CloseHandle(hProcess);<br>&nbsp; }<br>&nbsp;<br>&nbsp;<br><br>--------------------------------------------------------------------------------<br>找出所有进程的 process id:<br><br>下面的程序也是可以在 nt 上运行:<br><br>下面的程序也是需要 psapi.dll<br><br>#include "psapi.hpp"<br><br>DWORD pid[1000];<br>DWORD ret_id=0;<br>if(!EnumProcesses(pid,sizeof pid,&amp;ret_id))<br>&nbsp; //返回0,就是失败了<br><br>成功的话返回 非 0 值<br><br>ret_id是返回的字节数,注意不是id的个数,<br>比如返回 1 个id,实际上ret_id等于4,(表示4个字节)<br>ret_id/4 才是 返回 的id 的个数<br><br>返回的id放在 数组 pid<br>大小要大于 id 可能的最大数才找的全,上面的例子是可以找1000个,足够了,<br>如果嫌大,200个就可以了<br>
 
呵呵,没注意看hinstance其实和processid是类似的,都是枚举一下就可以了
 
能否给一个不用DLL的方法.对了,另外我已经寄信给你啦(HUBDOG@263.NET)望查收.
 
可以用查注册表的方法来找到进程,你问cAkk或o*o吧,他们有一个enumstuff.zip(我的找不到了)<br>,madshi写了一个实现(支持所有windows版本,并且不需要psapi.dll
 
接受答案了.
 
后退
顶部