L liguang Unregistered / Unconfirmed GUEST, unregistred user! 2000-09-24 #1 问题中下,知道一个应用程序的hIntsnace,或者其主窗口的HWND,如何得到这个应用程序的<br>路径.由于问题比较简单,所以只给30分.
H hubdog Unregistered / Unconfirmed GUEST, unregistred user! 2000-09-24 #2 uses tlhelp32;<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> peROCESSENTRY32;<br> me:MODULEENTRY32;<br> hp,hm:Thandle;<br> b,b1:boolean;<br>begin<br> hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);<br> pe.dwSize:=SizeOf(pe);<br> b:=Process32First(hp,pe);<br> while b do<br> begin<br> hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);<br> me.dwSize:=sizeof(ModuleEntry32);<br> if Module32First(hm,me) then<br> begin<br> b1:=Module32First(hm,me);<br> while b1 do<br> begin<br> if me.th32ModuleID=pe.th32ModuleID then<br> listbox1.Items.Add(me.szExePath);<br> b1:=Module32Next(hm,me);<br> end;<br> end;<br> b:=Process32Next(hp,pe);<br> end;<br><br>end;<br><br><br> <br> <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> {<br> HMODULE hMod;<br> DWORD cbNeeded;<br> if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )<br> {<br> char buf[MAX_PATH+1]="";<br> if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)>0)<br> // <br> // buf放的就是名字<br> //<br> }<br> CloseHandle(hProcess);<br> }<br> <br> <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,&ret_id))<br> //返回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>
uses tlhelp32;<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br> peROCESSENTRY32;<br> me:MODULEENTRY32;<br> hp,hm:Thandle;<br> b,b1:boolean;<br>begin<br> hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);<br> pe.dwSize:=SizeOf(pe);<br> b:=Process32First(hp,pe);<br> while b do<br> begin<br> hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);<br> me.dwSize:=sizeof(ModuleEntry32);<br> if Module32First(hm,me) then<br> begin<br> b1:=Module32First(hm,me);<br> while b1 do<br> begin<br> if me.th32ModuleID=pe.th32ModuleID then<br> listbox1.Items.Add(me.szExePath);<br> b1:=Module32Next(hm,me);<br> end;<br> end;<br> b:=Process32Next(hp,pe);<br> end;<br><br>end;<br><br><br> <br> <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> {<br> HMODULE hMod;<br> DWORD cbNeeded;<br> if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )<br> {<br> char buf[MAX_PATH+1]="";<br> if(GetModuleBaseName( hProcess, hMod,buf,sizeof buf)>0)<br> // <br> // buf放的就是名字<br> //<br> }<br> CloseHandle(hProcess);<br> }<br> <br> <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,&ret_id))<br> //返回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>
H hubdog Unregistered / Unconfirmed GUEST, unregistred user! 2000-09-24 #3 呵呵,没注意看hinstance其实和processid是类似的,都是枚举一下就可以了
L liguang Unregistered / Unconfirmed GUEST, unregistred user! 2000-09-24 #4 能否给一个不用DLL的方法.对了,另外我已经寄信给你啦(HUBDOG@263.NET)望查收.
H hubdog Unregistered / Unconfirmed GUEST, unregistred user! 2000-09-24 #5 可以用查注册表的方法来找到进程,你问cAkk或o*o吧,他们有一个enumstuff.zip(我的找不到了)<br>,madshi写了一个实现(支持所有windows版本,并且不需要psapi.dll