IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Delphi: список процессов (https://www.imho.ws/showthread.php?t=70512)

Ghost 08.10.2004 18:07

Delphi: список процессов
 
У меня есть список процессов, созданный кодом:
Код:

var
  hSnap: integer;
  proc:  PROCESSENTRY32;
...
begin
...
  hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Process32First(hSnap, proc) then repeat with proc do
      writeln (Format('%6d | %20s', [th32ProcessID, szExeFile]));
  until not Process32Next(hSnap, proc);
...
end;

Но при его выполнении отображаются только имя экзешника и идентификатор процесса, а мне нужно еще и кроме этого командная строка, которой запущен процесс, и путь к папке, из которой эта командная строка была вызвана. Например:

PID: 12345
NAME: notepad.exe
CMD: edit.bat bla-bla-bla.txt
PATH: D:\TEXTS\

Структуры PROCESSENTRY32 подобной информации не содержат. Но это как-то можно выковырять (я видел такие проги), только - как? Никто не подскажет?

Gem Single 09.10.2004 00:08

Для каждого из процессов нужно ещё раз вызвать CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, proc.th32ProcessID);
Первый модуль, полученный по Module32First, должен быть самим exe-шником (MODULEENTRY32.szExePath).

p.s.: не забывай закрывать хэндлы, полученные по CreateToolHelp32SnapShot...

/7y3uK 09.10.2004 01:05

Как комментарий, щоб понятней было, к сказанному Gem Single
ты делаешь слепок системы, ну или слепок памяти системы, в которой ты работаешь, так вот, как совершенно правильно заметил Gem Single
, тыж ведь в память че-то грузишь, заполняя тем самым адресное пространство всей системы. Поэтому как сделаешь слепок, незабывай удалять его ибо он также занимает память. Золотое правило программиста - занял память - освободи явно, не полагаясь на компилятор.

Ghost 09.10.2004 09:18

Вложений: 1
Гыхм... Все равно - не то. Посмотрите на скриншот (с проги TaskInfo2003). То, что было предложено вами, дает мне третью строку - имя exe-шника с полным путем. Меня же интересуют две первые строки - с какими параметрами и из какой директории он был запущен.

Gem Single 09.10.2004 23:30

эхх... вторая строка -- это не из какой директории, а _текущий_ каталог (установленный функцией SetCurrentDirectory()).
Придётся тебе воспользоваться функцией CreateRemoteThread() для интересующего процесса. В созданном потоке будешь вызывать GetCommandLine() и GetCurrentDirectory(), ну и передавать полученную инфу в свой процесс при помощи file mapping.

/7y3uK 10.10.2004 15:06

ИМХО при использовании CreateProcess есть ряд структур, в которых есть то, что тебе надо... но это при создании ручками... незнаю, если в памяти эти структуры после запуска процесса не чистятся, имхо они чистятся при закрытии процесса, то их можно поиска в адресном пространстве...
BOOL CreateProcess(

LPCTSTR lpApplicationName, // pointer to name of executable module
LPTSTR lpCommandLine, // pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes, // pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer to thread security attributes
BOOL bInheritHandles, // handle inheritance flag
DWORD dwCreationFlags, // creation flags
LPVOID lpEnvironment, // pointer to new environment block
LPCTSTR lpCurrentDirectory, // pointer to current directory name
LPSTARTUPINFO lpStartupInfo, // pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation // pointer to PROCESS_INFORMATION
);

Gem Single 10.10.2004 23:30

А при чём здесь CreateProcess?

Ghost 11.10.2004 10:56

Gem Single
Спасибо. Принцип ясен. Буду мучить.


Часовой пояс GMT +4, время: 09:14.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.