Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2007, 19:22   #1
kozei
 
Регистрация: 27.06.2007
Сообщений: 6
Сообщение Как получить список запускаемых программ?

Помогите разобраться с вопросом: как получить список запускаемых программ в винде за время работы данной программы(которая это все и проворачивает)??? пож-та
kozei вне форума Ответить с цитированием
Старый 04.10.2007, 19:58   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

один из простых способов:
создай отдельно поток, в котором получай каждую секунду список процессов. При первом перечислении начале создай список потом только добавляй в него новые имена процессов.
P.S. в книге "Delphi глазами хакера", есть пример мониторинга приложений у которых есть окна.
rpy3uH вне форума Ответить с цитированием
Старый 04.10.2007, 22:52   #3
kozei
 
Регистрация: 27.06.2007
Сообщений: 6
По умолчанию ну, а точнее...

как создать этот поток, т.е.где у нас есть этот список.откуда его вынуть?
kozei вне форума Ответить с цитированием
Старый 05.10.2007, 20:13   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Создать поток - функция CreateThread
Код:
HANDLE CreateThread(
    LPSECURITY_ATTRIBUTES lpThreadAttributes,// pointer to thread security attributes  
    DWORD dwStackSize,	// initial thread stack size, in bytes 
    LPTHREAD_START_ROUTINE lpStartAddress,	// pointer to thread function 
    LPVOID lpParameter,	// argument for new thread 
    DWORD dwCreationFlags,	// creation flags 
    LPDWORD lpThreadId 	// pointer to returned thread identifier 
   );
как получить список процессов: ищи по форуму, 100 раз обсуждалось
(например здесь, второй пост)
при получении первого списка процессов ты сохраняешь этот список в в отдельный (общий) список, при последующем получении списка процессов, смотришь какого процесса нет в общем списке и если есть таковые добавляешь туда этот процесс
rpy3uH вне форума Ответить с цитированием
Старый 30.10.2007, 17:54   #5
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

Цитата:
Как получить список запускаемых программ?
Варианты:
1. Через драйвер режима ядра и регистрации своего коллбэка с помощью PsSetCreateProcessNotifyRoutine - самый правильный и сложный вариант, полагаю вам не подойдет
2. Через функции ToolHelp API
3. Через функции Psapi
4. С помощью Native API

Реализация 2 - здесь:
http://www.delphikingdom.com/asp/vie...catalogid=1167
Реализация 4 - здесь:
http://www.delphikingdom.com/asp/vie...catalogid=1279
Если интересны реализации 1 и 3 - поищите в интернете сами, ключевые слова я дал.

rpy3uH
Не рекомендуется использовать CreateThread в Delphi, лучше BeginThread. Знаете почему?
Slovinsky вне форума Ответить с цитированием
Старый 01.11.2007, 13:27   #6
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

в принципе мне по барабану, что лучше а что хуже. я просто привык именно к API функции. BeginThread это не API это просто оболочка вокруг CreateThread. Функция BeginThread отличается тем чтов ней есть проверка на тип функции: чтобы у неё был один параметр. Разумеется в Delphi лучше использовать BeginThread.
rpy3uH вне форума Ответить с цитированием
Старый 01.11.2007, 14:25   #7
Slovinsky
Пользователь
 
Регистрация: 26.10.2007
Сообщений: 79
По умолчанию

BeginThread в отличие от CreateThread производит следующие действия:
1. Присваивает переменной IsMultiThread значение true, что заставит менеджер памяти работать в потокобезопасном режиме - использовать критические секции при выделении/освобождении памяти. Иначе всегда рискуем получить исключение при попытках выделить/освободить память.
2. Помещает тело потока в SEH-фрейм. В результате необработанное исключение в теле потока не приведет к краху процесса.
3. Инициализирует FPU (нужно, для операций с плавающей точкой).

Если не использовать BeginThread, то все вышеперечисленное придется делать ручками.
Slovinsky вне форума Ответить с цитированием
Старый 01.11.2007, 15:18   #8
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

МОЛОДЕЦ!!!! опять ты прав.....
исходник функции BeginThread
Код:
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
  ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
  var ThreadId: LongWord): Integer;
var
  P: PThreadRec;
begin
  New(P);
  P.Func := ThreadFunc;
  P.Parameter := Parameter;
  IsMultiThread := TRUE;
  Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
    CreationFlags, ThreadID);
end;
я просто сразу не заметил (блин, на пенсию пора......), что изначально вызывается функция ThreadWrapper, которая в последствиии вызывает твою поточную функцию, и которая и является первоначалом для всех потоков

P.S. жаль что я тебе не могу написать ещё один отзыв.... (придётся ждать)

Последний раз редактировалось rpy3uH; 01.11.2007 в 15:23.
rpy3uH вне форума Ответить с цитированием
Старый 01.11.2007, 16:07   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
Сообщение от kozei Посмотреть сообщение
Помогите разобраться с вопросом: как получить список запускаемых программ в винде за время работы данной программы(которая это все и проворачивает)??? пож-та
Можно получить по нажатию кнопки:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
wnd: hwnd;
buff: array [0..127] of char;
begin
ListBox1.clear;
wnd := getwindow(handle, gw_hwndfirst);
while wnd <> 0 do
begin // Не показываем:
if (wnd <> application.handle) // Собственное окно
and iswindowvisible(wnd) // Невидимые окна
and (getwindow(wnd, gw_owner) = 0) // Дочерние окна
and (getwindowtext(wnd, buff, sizeof(buff)) <> 0) then
begin
getwindowtext(wnd, buff, sizeof(buff));
ListBox1.items.add(strpas(buff));
end;
wnd := getwindow(wnd, gw_hwndnext);
end;
ListBox1.itemindex := 0;
end;
Никто не мешает повесить это на таймер, например.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить список процессов? SoLL Win Api 19 28.01.2012 09:52
как получить список запущенных процессов на компе One.Love Win Api 10 17.03.2009 01:36
Получить список сетевых принтеров Старовъръ Win Api 4 12.08.2008 17:06
Получить список автозагрузки, из меню ПУСК Alter Общие вопросы Delphi 5 03.05.2008 17:45
Получить список папок Иллидан Общие вопросы Delphi 1 22.03.2008 15:24