我实在想不出办法了(100分)

  • 主题发起人 主题发起人 onedolph
  • 开始时间 开始时间
O

onedolph

Unregistered / Unconfirmed
GUEST, unregistred user!
想杀掉一个进程,是不是一定要知道它的ProcessID?
在NT下很容易从ProcessID知道它的ModuleName.
然后我从ModuleName反找ProcessId,然后杀掉它。
可是在98下就不好办了。

那位知道在98下怎么从ProcessId得到ModuleName.
或者不用ProcessId就能杀掉一个进程?
先谢了!
 
>> 跟踪一下,灌水一下
 
没人知道?
 
有个TerminateProcess的API
有是有个TerminateModual就好办了,
可惜没有。
 
你枚举process不就得乐? 枚举的时候会得到moudlename的
 
先问一下: ProcessId用Win98如何得到?是否有良方!?请给出!
 
想必cAKK知道,可是我用的枚举process的API是:
function EnumProcesses(lpidProcess: LPDWORD; cb: DWORD; var cbNeeded: DWORD): BOOL;
这个API里面怎么得到ModuleName;
不知是否我用错了,还是另外还有一个。

to jams,我也没有良方,还是可以得到的,不是全部的罢了。
 
或者从window的Handle得到ModuleName也行啊。
各位大虾,我需要你们的帮助,
 
用 handle 得到 实例句柄,
GetWindowLong(aHandle, GWL_HINSTANCE);
不知道是不是这个?
 
SuperMMX,我用GetWindowLong(aHandle, GWL_HINSTANCE),得到一个句柄,
不知道是不是HMODULE,有可能是,通过它,再用GetModuleFileName可一得到
一个ModuleFileName,
可是GetWindowLong只能对自己的Handle取正确,对别的应用程序的Hanele去取
时,得到的结果都是跟取自己的得到的结果一样。
最后得到的ModuleName都只自己ModuleName.
请教SuperMMx,GetWindowLong是否还有什么设置之类的?
 
不太清楚。
 
在98下,要用那个"老掉牙的"CreateToolhelp32Snapshot,
例如:

var
ProcessSnap: THandle;
ProcessEntry32: TProcessEntry32;
More: Boolean;
begin
try
ProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPProcess,GetCurrentProcessID);
if ProcessSnap = -1 then Exit;
ProcessEntry32.dwSize := SizeOf(ProcessEntry32);
More := Process32First(ProcessSnap, ProcessEntry32);
while More do
begin
if pos('DesiredExeName',strpas(ProcessEntry32.szExeFile))>0 then TerminateProcess(ProcessEntry32.th32ProcessID);
More := Process32Next(ProcessSnap, ProcessEntry32);
end;
finally
CloseHandle(ProcessSnap);
end;
end;

也就是说,ProcessEntry32的szExeFile属性返回的就是程序EXE名,
根据它kill掉你所需要的processID。
 
管它是掉牙不掉牙,解决问题就行了。
还说什么,给分。
 
我所说的"老掉牙的"CreateToolhelp32Snapshot,
是指这个过程无论在internet上还是本论坛,都随处可见,
几乎是尽人皆知,您老兄竟然头疼,确实奇怪。
而且一般人都是知道98下用这个,不知道NT下怎么做,
你正好相反,更让人奇怪了 :-)

另外,你的NT下根据processID得到ModuleName的过程也贴在这里怎么样?
这样这个问题就完整了,以后有人问到此类问题,看这个帖子就够了。
 
有没有搞错,在NT下这么简单的,你老兄居然不会,是搞笑吧。:-)
NT下是这么做的:
1,用EnumProcesses得到所有的进程Pid,
2,根据Pid用EnumProcessModule得到该Pid的所有HModule,
3,根据hmodule用GetModuleFileNameEx得到ModuleName,
注意,每个进程的第一个hmodule才是exe文件,其他的是dll,之类
这写API在psapi.pas里面声明,
运行的时候还有有psapi.dll的支持。

另外,温柔一刀老兄所说,在98下一般人都知道,也不尽然吧,
至少前面几位老兄就不知道,我也不知道啊.
不过,还是很感谢你的。
 
>>有没有搞错,在NT下这么简单的,你老兄居然不会,是搞笑吧
(为了温柔家族的荣誉,不得不纠正一下)

我不是不知道,而是希望知道你的方法,因为总有可能有不同方法的,
尤其是你说“在NT下很容易从ProcessID知道它的ModuleName”
让我误以为你有什么非常简单的办法 :-)

还是非常感谢你的解释。
 
>>而且一般人都是知道98下用这个,不知道NT下怎么做,
是这句话让我误解了温柔一刀老兄了,实在不好意思。

其实呢,原来我也不会,
我是看见有个EnumWindows,联想到应该有个EnumProcesses的吧,
折腾了半天终于找到了,然后就找到了其他的函数,可是在98下却用不了。
折腾了N个半天,还是没办法,于是我就想,肯定很难做,要是容易的话,
我早就找到了,NT下我还能找到。
怪我没把话说清楚,看来是我笨的缘故。:)
 
后退
顶部