在Win2000下如何得到正在运行程序的路径?(50分)

  • 主题发起人 主题发起人 paf
  • 开始时间 开始时间
P

paf

Unregistered / Unconfirmed
GUEST, unregistred user!
var
lppe: TProcessEntry32;
found: boolean;
Hand: THandle;
begin
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
found := Process32First(Hand, lppe);
form1.caption:=StrPas(lppe.szExeFile); //在win98下可以得到程序名和路径的信息,但在win2000下只有程序名的信息
end;

在win98下可以得到程序名和路径的信息,但在win2000下只有程序名的信息,
我想知道在win2000下怎样才可以得到程序名和路径!

 
没有人知道吗?
 
真的没人知道吗?

如果在win2000下,知道了句柄或进程的ID 可以用函数得到程序的位置吗?
请大家帮忙!
 
在WIN2000中可以
var FilePath:String;
begin
FilePath:=ExtractFilePath(ParamStr(0));//ExtractFilePath(Application.ExeName);
end;
 
2000和98通用
ExtractFilePath(ParamStr(0));
ExtractFilePath(Application.ExeName);
 
path:=GetCurrentDir;//string 类型的
 
[:)]开始分赃了。
 
ParamStr(0) 是什么来的!

其实我做了一个查看进程序的小软件,把所有正在运行的程序名和程序的位置列出来!
 
ExtractFilename(application.ExeName)
只这一句话完全能解决你的问题。

 
分了吧,都说了
 
大家说的并不是搂主真正需要的,
说说我的办法:

第一步,先得到所有的进程列表,就像你的方法一样
第二步,对每个进程,再创建一个快照,获取这个进程所有模块的列表
其实,也不用所有的,通常获取第一个就行了,
他的信息里面就含有这个程序模块的全路径,我用的就是这种方法,没有问题
 
可以写出代码出来吗?
 
可惜我的机子遭遇了黑客,东西全丢了,
否则也可以给你源码,
我是自己摸索着写的,
你试试吧,不难的
 
你说的“创建快照”我都不知是什么东西,我不知道怎样写啊,帮忙啊!
谁可以给我代码啊!
 
CreateToolhelp32Snapshot
Snapshot就是快照的意思
 
我没有搞方面的东西,不懂!我去看看!
如果有源码就好。。。。。
 
GetModuleFileName
 
------------------------------------------------------------
Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
说明
获取一个已装载模板的完整路径名称
返回值
Long,如执行成功,返回复制到lpFileName的实际字符数量;零表示失败。会设置GetLastError
参数表
参数 类型及说明
hModule Long,一个模块的句柄。可以是一个DLL模块,或者是一个应用程序的实例句柄
lpFileName String,指定一个字串缓冲区,要在其中容纳文件的用NULL字符中止的路径名,hModule模块就是从这个文件装载进来的
nSize Long,装载到缓冲区lpFileName的最大字符数量
------------------------------------------------------------
Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
说明
获取一个应用程序或动态链接库的模块句柄
返回值
Long,如执行成功成功,则返回模块句柄。零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpModuleName String,指定模块名,这通常是与模块的文件名相同的一个名字。例如,NOTEPAD.EXE程序的模块文件名就叫作NOTEPAD
-------------------------------------------------------------------


当我只知道进程的ID,或者知道 lppe 的值, 怎样用GetModuleFileName得到程序的位置?
要怎样把进程序ID或 lppe 转为 hModule 里的值?

用“GetModuleHandle”函数可以得到 Hmodule 的值,但现在是不知道程序的位置,
GetModuleHandle 就用不着了!


 
我找到以前的程序了,原来信箱里面还有一份,
把部分的源代码贴给你吧

function FindApp(AppName: String): Integer;
function KillApp(ProcessId: Integer): Integer;
function IsRun(ProcessId: Integer): Boolean;
function IsBusy(ProcessId: Integer): Integer;
function RunApp(AppName, CmdLine: String; nCmdShow: Integer): Integer;

function TCcfRunMonitor2.FindApp(AppName: String): Integer;
var
PShot: THandle;
Pe: TProcessEntry32;
CanNext: Boolean;
ProcessId: Integer;
Found: Boolean;
function FindModule: Boolean;
var
MShot: THandle;
HasNext: Boolean;
Me: TModuleEntry32;
MfName: String;
begin
Result := False;
MShot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessId);
Me.dwSize := SizeOf(Me);
HasNext := Module32First(MShot, Me);
while HasNext do
begin
MfName := Me.szExePath;
if SameText(MfName, AppName) then
begin
Result := True;
Break;
end;
HasNext := Module32Next(MShot, Me);
end;
CloseHandle(MShot);
end;
begin
PShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Pe.dwSize := SizeOf(Pe);
ProcessId := 0;
Found := False;
CanNext := Process32First(PShot, Pe);
while CanNext do
begin
ProcessId := Pe.th32ProcessID;
if ProcessId > 0 then
begin
Found := FindModule;
if Found then Break;
end;
CanNext := Process32Next(PShot, Pe);
end;
CloseHandle(PShot);
if Found then Result := ProcessId else Result := 0;end;

function TCcfRunMonitor2.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;

function TCcfRunMonitor2.IsBusy(ProcessId: Integer): Integer;
var
Ph: THandle;
begin
Ph := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
if Ph <> 0 then
begin
if WaitForInputIdle(Ph, 10) = WAIT_TIMEOUT then
Result := 1
else
Result := 0;
CloseHandle(Ph);
end
else Result := -1;
end;

function TCcfRunMonitor2.IsRun(ProcessId: Integer): Boolean;
var
Ph: THandle;
begin
Ph := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
if Ph <> 0 then
begin
Result := WaitForSingleObject(Ph, 0) = WAIT_TIMEOUT;
CloseHandle(Ph);
end
else Result := False;
end;

function TCcfRunMonitor2.KillApp(ProcessId: Integer): Integer;
var
Ph: THandle;
begin
Ph := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
if Ph <> 0 then
begin
Result := Integer(TerminateProcess(Ph, 2701));
CloseHandle(Ph);
end
else Result := 0;
end;

function TCcfRunMonitor2.RunApp(AppName, CmdLine: String;
nCmdShow: Integer): Integer;
var
Sti: TStartupInfo;
Psi: TProcessInformation;
begin
FillMemory(@Sti, SizeOf(Sti), 0);
Sti.wShowWindow := nCmdShow;
Sti.dwFlags := STARTF_USEFILLATTRIBUTE;
Sti.dwFillAttribute := FOREGROUND_INTENSITY or BACKGROUND_BLUE;
if CreateProcess(PChar(AppName), PChar(CmdLine),
nil, nil, False,
0, nil, PChar(ExtractFilePath(AppName)),
Sti, Psi) then
begin
Result := Psi.dwProcessId;
end
else Result := 0;
end;
 
后退
顶部