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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 02:17   #1
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
Вопрос убить процесс

всем доброе время суток!
У меня такая проблема, программа удаляет все файлы в папке темп и все папки с под папками, задумывалась что если файл занят чем либо, убиваю процесс и удаляю файл, но если например там лежит в папке файл лог занятый какой то пргай, то программа не может убить этот процесс и висит в памяти.
жрёт сволочь цп, а вот если находит запущенный .exe файл то свободна убивает его и удаляет.
Во общем прога работает хорошо но проблема именно в удаление процесса.
Заранее благодарен!
С уважением,
Volkogriz!
Не количеством плюсов измеряется репутация человека...!

Последний раз редактировалось Volkogriz; 14.02.2012 в 02:52.
Volkogriz вне форума Ответить с цитированием
Старый 14.02.2012, 02:45   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

а знаки препинания придумали идиоты
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 14.02.2012, 08:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а вот если находит запущенный .exe файл то свободна убивает его и удаляет.
Странная какая-то у тебя ОСа...
Если не секрет в чем применение этой задачи и чем твоя реализация лучше консольной команды del?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.02.2012, 08:57   #4
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Перед удалением можно делать проверку всех загруженных файлов в папках, потом завершать процесс загруженных и затем удаление. Напиши часть своего кода где происходит удаление, там можно немного подправить.

Накидаю нужные функции может сам их используешь по назначению, перед применением добавь
в Uses своего проекта TLHelp32, PSApi;
Код:
//Функция проверки на занятость файла
function ApplicationUse(fName: string): boolean;
var
  HFileRes: HFILE;
begin
  Result := false;
  if not FileExists(fName) then exit;
  HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil,
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  Result := (HFileRes = INVALID_HANDLE_VALUE);
  if not Result then CloseHandle(HFileRes);
end;

//Функция убивает процесс по именм файла
Function KillTask(ExeFileName: String): Integer;
Const
PROCESS_TERMINATE = $0001;
Var
ContinueLoop: Bool;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
Begin
Result:=0;
FSnapshotHandle:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.DwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
While Integer(ContinueLoop) <> 0 Do
Begin
If ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
AnsiUpperCase(ExeFileName)) Or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
AnsiUpperCase(ExeFileName))) Then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,Bool(0),
FProcessEntry32.Th32ProcessID),0));
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
End;
CloseHandle(FSnapshotHandle);
End;

//Функция завершает процесс по PID при этом меняет привилегию что помогает завершать системные процессы
Function ProcessTerminate(PID: Cardinal): Boolean;
Var
HToken: THandle;
SeDebugNameValue: Int64;
Tkp: TOKEN_PRIVILEGES;
ReturnLength: Cardinal;
HProcess: THandle;
Begin
Result:=False;
If Not OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES
Or TOKEN_QUERY,HToken) Then
Exit;
If Not LookupPrivilegeValue(Nil,'SeDebugPrivilege',SeDebugNameValue) Then
Begin
CloseHandle(HToken);
Exit;
End;
Tkp.PrivilegeCount:=1;
Tkp.Privileges[0].Luid:=SeDebugNameValue;
Tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(HToken,False,Tkp,SizeOf(Tkp),Tkp,ReturnLength);
If GetLastError()<> ERROR_SUCCESS Then
Exit;
HProcess:=OpenProcess(PROCESS_TERMINATE,FALSE,PID);
If HProcess=0 Then
Exit;
If Not TerminateProcess(HProcess,DWORD(-1)) Then
Exit;
CloseHandle(HProcess);
Tkp.Privileges[0].Attributes:=0;
AdjustTokenPrivileges(HToken,FALSE,Tkp,SizeOf(Tkp),Tkp,ReturnLength);
If GetLastError() <> ERROR_SUCCESS Then
Exit;
Result:=True;
End;

//Функция узнает PID процесса по его имени применяется для функции выше
Function GetProcessPID(ExeFileName: String): Cardinal;
Var
ContinueLoop: Bool;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
Begin
Result:=0;
FSnapshotHandle:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.DwSize:=Sizeof(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
While Integer(ContinueLoop) <> 0 Do
Begin
If ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
AnsiUpperCase(ExeFileName)) Or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
AnsiUpperCase(ExeFileName))) Then
Result:=FProcessEntry32.Th32ProcessID;
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
End;
CloseHandle(FSnapshotHandle);
End;

//Функция завершает процесс по его имени
Function ProcessExists(ExeFileName: String): Boolean;
Var
ContinueLoop: Bool;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
Begin
Result:=False;
FSnapshotHandle:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.DwSize:=SizeOf(FProcessEntry32);
ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
While Integer(ContinueLoop) <> 0 Do
Begin
If ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
AnsiUpperCase(ExeFileName)) Or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
AnsiUpperCase(ExeFileName))) Then
Begin
Result:=True;
End;
ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
End;
CloseHandle(FSnapshotHandle);
End;

Последний раз редактировалось Aliens_wolfs; 14.02.2012 в 09:10.
Aliens_wolfs вне форума Ответить с цитированием
Старый 14.02.2012, 20:20   #5
Volkogriz
Форумчанин
 
Аватар для Volkogriz
 
Регистрация: 11.10.2007
Сообщений: 384
По умолчанию

Вот сам исходник приложил!
Вложения
Тип файла: rar KillTmp.rar (1.7 Кб, 11 просмотров)
Не количеством плюсов измеряется репутация человека...!
Volkogriz вне форума Ответить с цитированием
Старый 15.02.2012, 17:23   #6
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Лови свой файл http://zalil.ru/32712148 удаляет все, я так понял что ты с темпа удаляешь, единствено что не удаляет так это файлы занятые системой.
В твоем проекте глубоко зарытые паки не удалялись, я тоже подправил.
Если кое что исправить нужно пиши, а то я толком не по тестил прграмку.

Последний раз редактировалось Aliens_wolfs; 15.02.2012 в 20:21.
Aliens_wolfs вне форума Ответить с цитированием
Старый 16.02.2012, 08:18   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Обновил твою програмку исправил загруженность ЦП добавил функцию получения привилегии к процессам что позволяет больше выгружать программ http://zalil.ru/32716595 Если хочешь завершение этой обновленной програмки когда почистит папку, для этого в проекте сделай следующее изменение
Код:
//Отключаем эту строку RemoveAllFile(c_GetTempPath); 
//Отключаем эту строку RemoveAllDir(c_GetTempPath);
//И включаем, программа будет завершаться когда все сделает
if (RemoveAllFile(c_GetTempPath))and(RemoveAllDir(c_GetTempPath))then
exit;

Последний раз редактировалось Aliens_wolfs; 16.02.2012 в 11:20.
Aliens_wolfs вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убить процесс. ApolloKid Win Api 4 12.07.2011 01:29
Как убить процесс? Effort Помощь студентам 3 24.06.2011 21:27
Как убить процесс? coolle Помощь студентам 25 02.07.2010 14:19
Убить процесс по заголовку окна Nice42ru Помощь студентам 27 21.01.2010 11:55
Как убить процесс(с++) progdev Общие вопросы C/C++ 2 22.11.2009 21:30