-
tippa (05.01.11 13:26) [0]Вот функция, возвращающая пути к запущенным процессам:function exefindall(str:string):string;
var H,H2:cardinal;
info:PROCESSENTRY32;
info2:MODULEENTRY32;
bm:boolean;
buf:string;
begin
result:='';
H:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if H=0 then exit;
info.dwSize := sizeof(TPROCESSENTRY32);
if Process32First(H,info) then
repeat
H2:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,info.th32ProcessID);
if H2=0 then exit;
info2.dwSize := sizeof(TMODULEENTRY32);
bm:=Module32First(H2,info2);
while bm do
begin
buf:=info2.szExePath;
if copy(buf,length(buf)-2,3)='exe' then result:=result+buf+#13#10;
bm:=Module32Next(H2,info2);
end;
CloseHandle(H2);
until not Process32Next(H,info);
CloseHandle(H);
end;
почему свой процесс ('auto.exe') записывается 2 раза, в первую и последнюю строкуC:\Program Files\Borland\Delphi7\Projects\auto\auto.exe
C:\WINDOWS\system32\WLTRAY.exe
C:\WINDOWS\system32\ctfmon.exe
C:\Program Files\ICQ7.2\ICQ.exe
C:\Program Files\EmEditor\emedtray.exe
C:\Program Files\Telstra Turbo Connection Manager\Telstra Turbo Connection Manager.exe
C:\Program Files\Opera\opera.exe
C:\Program Files\Borland\Delphi7\Bin\delphi32.exe
C:\WINDOWS\system32\taskmgr.exe
C:\Program Files\Borland\Delphi7\Projects\auto\auto.exe -
из под ide? а почему бы и нет?
-
Игорь Шевченко © (05.01.11 15:25) [2]А зачем ты два раза snapshot делаешь ?
-
tippa (05.01.11 16:09) [3]
> из под ide? а почему бы и нет?
и так и так
> А зачем ты два раза snapshot делаешь ?
вот здесь высмотрел _http://www.sql.ru/forum/actualthread.aspx?bid=20&tid=114705&hl=
задача - получить список путей для запущенных процессов, буду признателен если подскажите другой вариант -
> буду признателен если подскажите другой вариант
в JEDI делается немного по другому, наверное не спростаprocedure BuildModulesList;
type
TProcessData = packed record
UsageCnt: Word;
RelocateCnt: Word;
end;
var
ML: TStringList;
SnapProcHandle, SnapModuleHandle: THandle;
ProcessEntry: TProcessEntry32;
ModuleEntry: TModuleEntry32;
ProcessNext, ModuleNext: Boolean;
I: Integer;
PD: TProcessData;
begin
ML := TStringList.Create;
Screen.Cursor := crHourGlass;
try
ML.Sorted := True;
ML.Duplicates := dupIgnore;
SnapProcHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapProcHandle <> THandle(-1) then
begin
ProcessEntry.dwSize := Sizeof(ProcessEntry);
ProcessNext := Process32First(SnapProcHandle, ProcessEntry);
while ProcessNext do
begin
SnapModuleHandle := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID);
if SnapModuleHandle <> THandle(-1) then
begin
ModuleEntry.dwSize := Sizeof(ModuleEntry);
ModuleNext := Module32First(SnapModuleHandle, ModuleEntry);
while ModuleNext do
begin
I := ML.Add(ModuleEntry.szExePath);
PD := TProcessData(ML.Objects[I]);
Inc(PD.UsageCnt);
if GetImageBase(ModuleEntry.szExePath) <> DWORD(ModuleEntry.modBaseAddr) then
Inc(PD.RelocateCnt);
ML.Objects[I] := Pointer(PD);
ModuleNext := Module32Next(SnapModuleHandle, ModuleEntry);
end;
CloseHandle(SnapModuleHandle);
end;
ProcessNext := Process32Next(SnapProcHandle, ProcessEntry);
end;
CloseHandle(SnapProcHandle);
end;
with ModulesListView do
begin
Items.BeginUpdate;
Items.Clear;
for I := 0 to ML.Count - 1 do
with Items.Add do
begin
Caption := AnsiLowerCase(ExtractFileName(ML[I]));
PD := TProcessData(ML.Objects[I]);
if PD.RelocateCnt = 0 then
ImageIndex := 20
else
ImageIndex := 19;
with SubItems do
begin
Add(IntToStr(PD.UsageCnt));
if PD.RelocateCnt = 0 then Add('-') else Add(IntToStr(PD.RelocateCnt));
Add(ML[I]);
end;
end;
AlphaSort;
Items.EndUpdate;
end;
with StatusBar do
begin
Panels.BeginUpdate;
Panels[0].Text := Format(sModulesCount, [ML.Count]);
Panels.EndUpdate;
end;
finally
ML.Free;
Screen.Cursor := crDefault;
end;
end;