| imho.ws |
![]() |
|
|
|
# 1 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
У меня есть список процессов, созданный кодом:
Код:
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 подобной информации не содержат. Но это как-то можно выковырять (я видел такие проги), только - как? Никто не подскажет?
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 08.10.2004 в 18:11. Причина: чертов склероз... |
|
|
|
|
# 2 |
|
Newbie
Регистрация: 21.07.2004
Адрес: Брест
Сообщения: 26
![]() |
Для каждого из процессов нужно ещё раз вызвать CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, proc.th32ProcessID);
Первый модуль, полученный по Module32First, должен быть самим exe-шником (MODULEENTRY32.szExePath). p.s.: не забывай закрывать хэндлы, полученные по CreateToolHelp32SnapShot...
__________________
Spel chekers, hoo neeeds em?
|
|
|
|
|
# 3 |
|
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
Как комментарий, щоб понятней было, к сказанному Gem Single
ты делаешь слепок системы, ну или слепок памяти системы, в которой ты работаешь, так вот, как совершенно правильно заметил Gem Single , тыж ведь в память че-то грузишь, заполняя тем самым адресное пространство всей системы. Поэтому как сделаешь слепок, незабывай удалять его ибо он также занимает память. Золотое правило программиста - занял память - освободи явно, не полагаясь на компилятор. |
|
|
|
|
# 4 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
Гыхм... Все равно - не то. Посмотрите на скриншот (с проги TaskInfo2003). То, что было предложено вами, дает мне третью строку - имя exe-шника с полным путем. Меня же интересуют две первые строки - с какими параметрами и из какой директории он был запущен.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! |
|
|
|
|
# 5 |
|
Newbie
Регистрация: 21.07.2004
Адрес: Брест
Сообщения: 26
![]() |
эхх... вторая строка -- это не из какой директории, а _текущий_ каталог (установленный функцией SetCurrentDirectory()).
Придётся тебе воспользоваться функцией CreateRemoteThread() для интересующего процесса. В созданном потоке будешь вызывать GetCommandLine() и GetCurrentDirectory(), ну и передавать полученную инфу в свой процесс при помощи file mapping.
__________________
Spel chekers, hoo neeeds em?
|
|
|
|
|
# 6 |
|
Advanced Member
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498
![]() ![]() ![]() ![]() |
ИМХО при использовании 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 ); |
|
|