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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2010, 13:42   #1
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию Получение списка процеcсов

код:
Код:
var
  h,hp: THandle;
  p: PROCESSENTRY32;
  pid: integer;
begin
h:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if h=-1 then exit;
if Process32First(h,p) then   // либо здесь false
 repeat
  if p.szExeFile='notepad.exe' then break;
 until not process32next(h,p)
else exit;
if p.th32ProcessID = 0 then exit;
pid:= p.th32ProcessID;   // при трасеровке F7 даную строку прчемуто пропускает а если и не пропускает то вирубает на TerminateProcess
hp:= OpenProcess(PROCESS_TERMINATE, true, pid);	  
TerminateProcess(hp,0);  //  либо здесь вирубает как будь то снимает сама себя	
closehandle(h);
closehandle(hp);
end;
GetLastError показывает 'Runtime error 216 at 7E378944'

Почему даная процедура по событию OnClick работает отлично, а когда ее использовать в dll или Source с постоянним оновлениям то она исполняется только раз либо вобще не работает??????????

для умников: з асм знаком но только на уровне написаныя небольших прог а не откладки кода
legendary вне форума Ответить с цитированием
Старый 31.08.2010, 19:27   #2
|{ot
Форумчанин
 
Аватар для |{ot
 
Регистрация: 09.03.2008
Сообщений: 127
По умолчанию

Код:
var
  h,hp: THandle;
  p: PROCESSENTRY32;
  pid: integer;
  serr: string;
begin
h:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if h=-1 then 
 begin
  IntToStr(GetLastError,serr);
  MessageBox(0,'CreateToolhelp32Snapshot',serr,0);
  exit;
 end;
if Process32First(h,p) then   // либо здесь false
 repeat
  if p.szExeFile='notepad.exe' then break;
 until not process32next(h,p)
else 
 begin
  IntToStr(GetLastError,serr);
  MessageBox(0,'Process32First',serr,0);
  exit;
 end;
if p.th32ProcessID = 0 then exit;
pid:= p.th32ProcessID;   // при трасеровке F7 даную строку прчемуто пропускает а если и не пропускает то вирубает на TerminateProcess
hp:= OpenProcess(PROCESS_TERMINATE, true, pid);	
//здесь проверка: а открылся ли процесс?
TerminateProcess(hp,0);  //  либо здесь вирубает как будь то снимает сама себя	
closehandle(h);
closehandle(hp);
end;
//Будут ошибки поправь, я на паскале не пишу.

Что выдает MessageBox?
|{ot вне форума Ответить с цитированием
Старый 31.08.2010, 19:55   #3
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

Код:
program Project1;

uses
  windows,
  messages,
  SysUtils,
  tlHelp32;

{$R *.res}

procedure kill;
label 1;
var
  hp,h: THandle;
  p: PROCESSENTRY32;
  pid: integer;
  serr: string;
begin
h:= CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if h=-1 then
begin
  serr:= IntToStr(GetLastError);
  MessageBox(0,'CreateToolhelp32Snapshot',pchar(serr),0);
  exit;
 end;
if Process32First(h,p) then
 repeat
  if p.szExeFile='notepad.exe' then break;
 until not process32next(h,p)
else begin
  serr:= IntToStr(GetLastError);
  MessageBox(0,'CreateToolhelp32Snapshot',pchar(serr),0);
  exit;
 end;
if p.th32ProcessID = 0 then goto 1;
pid:= p.th32ProcessID;
hp:= OpenProcess(PROCESS_TERMINATE, false, pid);
TerminateProcess(hp,0);
closehandle(hp);
1: 
closehandle(h);
end;


var
  WhEvent: THandle;
begin
WhEvent:=CreateEvent(nil, true, false, 'et');
while (true) do
begin
WaitForSingleObject(WhEvent,1000);
kill;
end;
end.
все пучком до TerminateProcess(hp,0), дальше прога закрывается

Цитата:
Сообщение от |{ot Посмотреть сообщение
Что выдает MessageBox?
вроде я писал выше:
GetLastError показывает 'Runtime error 216 at 7E378944'

Последний раз редактировалось Stilet; 01.09.2010 в 17:24.
legendary вне форума Ответить с цитированием
Старый 01.09.2010, 17:06   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

начнем с того что GetLastError даст число а не сообщение.

трассировку юзали?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.09.2010, 17:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
if hp=0 then RaiseLastWin32Error else
 TerminateProcess(hp,0);
Какую ошибку покажет?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2010, 15:54   #6
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

ошибки нет прога как обычно завершилась на TerminateProcess(hp,0); мне кажеться что проблема в том что компилятор почемуто все время пропускает строчку
Код:
pid:= p.th32ProcessID;
даже после компиляцыи возле ие нет синей точки

Спец для неверующых:
Изображения
Тип файла: bmp 111.bmp (126.7 Кб, 121 просмотров)

Последний раз редактировалось Stilet; 02.09.2010 в 16:23.
legendary вне форума Ответить с цитированием
Старый 02.09.2010, 16:23   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
даже после компиляцыи возле ие нет синей точки
Окружи эту функцию директивами {$o-}...{$o+} чтоб отключить для нее оптимизатор.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2010, 16:35   #8
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

Не помогло
legendary вне форума Ответить с цитированием
Старый 02.09.2010, 16:38   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит сделай все чтоб избавится от goto, которого компиляторы уже давно сторонятся, натравливая на него клыки оптимизаторов.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2010, 16:46   #10
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

Код:
pid:= p.th32ProcessID;
  serr:= IntToStr(GetLastError);
  MessageBox(0,pchar(serr),'CreateToolhelp32Snapshot',0);
{messagebox(0,pchar(pid),'pid',mb_ok);}  // если использовать ето строку то вылазит ошибка ''Access violation at address ... in module 'user32.dll'. Read on address ...''
hp:= OpenProcess(PROCESS_TERMINATE, false, pid);
MessageBox показывает 18.
legendary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление последнего элемента из списка и реверс этого списка. Goose Общие вопросы C/C++ 8 16.05.2010 16:12
Получение списка Database Names или AliasNames в свойство GRIPH Компоненты Delphi 0 14.05.2010 17:11
Получение списка файлов кроссплатформа kin63camapa Общие вопросы C/C++ 2 13.02.2010 00:24
Получение списка файлов Костян Пират Общие вопросы Delphi 11 16.02.2009 09:58
получение 1 списка из 2-х Neznau Помощь студентам 0 10.12.2008 22:16