Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дефрагментация штатными средствами, Не могу остановить дефрагментацию 
:(
    Опции темы
MadCoder
  Дата 10.9.2007, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Приветствую всех!

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

Запуск:
Код

// Запуск
function StartDefrag(Drive: String): Boolean;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
begin
// Очистка полей структуры StartInfo
FillChar(StartInfo, Sizeof(StartInfo), #0);
StartInfo.cb:=Sizeof(StartInfo);
If CreateProcess(nil, PChar('defrag '+Drive+' -a'), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo) then
ProcId:=ProcInfo.hProcess;
end;

Остановка:
Код

// Остановка плагина
function StopPlugin: Boolean;stdcall;
begin
  Stopped:=True;
  // завершаем процесс дефрагментации
  CloseHandle(ProcID);
  TerminateProcess(ProcID, 0);
end;


Это сообщение отредактировал(а) MadCoder - 10.9.2007, 00:11
PM WWW ICQ   Вверх
Yanis
Дата 10.9.2007, 08:39 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(MadCoder @  10.9.2007,  01:11 Найти цитируемый пост)
Что неверно?

Цитата(MadCoder @  10.9.2007,  01:11 Найти цитируемый пост)
  CloseHandle(ProcID);
  TerminateProcess(ProcID, 0);




--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
MadCoder
Дата 10.9.2007, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(Yanis @ 10.9.2007,  08:39)
Цитата(MadCoder @  10.9.2007,  01:11 Найти цитируемый пост)
Что неверно?

Цитата(MadCoder @  10.9.2007,  01:11 Найти цитируемый пост)
  CloseHandle(ProcID);
  TerminateProcess(ProcID, 0);

А как верно?
PM WWW ICQ   Вверх
MetalFan
Дата 10.9.2007, 09:56 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



MadCoder, ты хоть понимаешь, что делают написанные тобой строки кода? нет? а нафиг тогда их писал?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Yanis
Дата 10.9.2007, 12:21 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(MadCoder @  10.9.2007,  10:41 Найти цитируемый пост)
А как верно?

Задом наперёд.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Virtuals
Дата 10.9.2007, 16:33 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



перевожу.... 
ты сначало закрываеш указатель на процесс (тоесть он начинает ссылатся на... да фиг его знает куда)
а потом этот "фиг его знает" ты пытаешся терменировать smile 
PM MAIL ICQ   Вверх
dumb
Дата 15.9.2007, 04:52 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



MadCoder, ник выбрал правильно. smile но лучше штеккер из розетки выдерни во время дефрага - быстрее добьешся результата.
PM MAIL   Вверх
MadCoder
Дата 15.9.2007, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Спасибо за информацию.
Заметил, что при запуске процесс defrag.exe порождает еще один процесс dfgntfs.exe. Как не просто убить процесс, но и все порожденные им процессы?

Пример

Это сообщение отредактировал(а) MadCoder - 15.9.2007, 12:12
PM WWW ICQ   Вверх
Virtuals
Дата 15.9.2007, 20:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



MadCoder, имхо у тебя изначально подход не верен! smile 

хоть представляеш что происходит при дефрагментации?
//берутся данные с одного места - переносятся в другое - правится фат (ну или ее подобие в нтфс)

а теперь представь что будет при убийстве процесса во время данной операции (TerminateProcess и есть жесткое убийство)
ничего кроме мусора на диске не получим, от краха спасает только система журналирования нтфс

попробуй воспользовтся wm_close wm_quit окну дефрагментации
думаю будет более корректно
 smile 

Код

postmessage(FindWindow('DfrgNtfsClass'NIL), WM_QUIT,0,0);
postmessage(FindWindow('DfrgFatClass'NIL), WM_QUIT,0,0);

 smile

Добавлено через 5 минут и 37 секунд
dumb, хоть бы намекнул человеку что хотел сказать! ни есть гут такая манера обьяснений smile 
перевожу уважаемого 
dumb
убьеш файловую систему на раз!
но вилку из розетки круче, можно и винт убить smile 
PM MAIL ICQ   Вверх
MadCoder
  Дата 16.9.2007, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Virtuals, большое человеческое спасибо!

Финальный вариант.

Функция запуска дефрагментации:
Код

// Запуск
function StartDefrag(Drive: String): Boolean;
var
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
begin
// Очистка полей структуры StartInfo
FillChar(StartInfo, Sizeof(StartInfo), #0);
StartInfo.cb:=Sizeof(StartInfo);
CreateProcess(nil, PChar('defrag '+Drive+' -f'), nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo);
end;


Функция остановки плагина:
Код

// Остановка плагина
function StopPlugin: Boolean;stdcall;
begin
// завершаем процесс дефрагментации
postmessage(FindWindow('Defrag', NIL), WM_QUIT,0,0);
postmessage(FindWindow('DfrgNtfsClass', NIL), WM_QUIT,0,0);
postmessage(FindWindow('DfrgFatClass', NIL), WM_QUIT,0,0);
end;


Теперь все верно?

Это сообщение отредактировал(а) MadCoder - 16.9.2007, 00:54

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  defrag.rar 3,41 Kb
PM WWW ICQ   Вверх
Virtuals
Дата 16.9.2007, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



???
а как работает?
PM MAIL ICQ   Вверх
MadCoder
Дата 16.9.2007, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 24.8.2007
Где: Москва

Репутация: 1
Всего: 2



Цитата(Virtuals @ 16.9.2007,  12:28)
???
а как работает?

Программа сканирует (defrag.exe Диск -a) каждый раздел жестких дисков, после чего дефрагментацию тех, степень фрагментации которых превышает 15 %. Остановка сканирования\дефрагментации осуществляется через StopPlugin.
PM WWW ICQ   Вверх
Virtuals
Дата 16.9.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 476
Регистрация: 27.11.2006

Репутация: 3
Всего: 11



я имел ввиду как срабатывет StopPlugin
корректно?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0911 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.