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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запуск и завершение процесса дефрагментации, Как правильно завершить процесс defrag? 
V
    Опции темы
MadCoder
Дата 1.4.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте!

Мне жизненно необходимы функции запуска и завершения процесса дефрагментации (встроенной утилитой Defrag, которая находится в составе Windows XP). Если с запуском все понятно, то вот с завершением возникают проблемы.

Я уже писал об этом здесь, но проблема не разрешилась к сожалению.

Из-за того, что дефрагментация вещь достаточно капризная, ее нельзя просто килить, нужно отправлять системное сообщение на завершение. Ситуация осложняется тем, что defrag.exe запускает еще процессы DfrgFat и DfrgNtfs в зависимости от файловой системы. Их тоже необходимо корректно завершать.

Далее пишу свой код.

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

var
Stop: Boolean;
Process: cardinal;

procedure StartDefrag(Drive: String);
const
  ReadBuffer = 2400;
var
  Security: TSecurityAttributes;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
//  Error: integer;
  ExitCode: Cardinal;
begin
  with Security do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
    FillChar(Start, Sizeof(Start), #0);
    start.cb := SizeOf(start);
    start.dwFlags := STARTF_USESTDHANDLES +
      STARTF_USESHOWWINDOW;
    start.wShowWindow := SW_HIDE;
    if CreateProcess(nil,
      PChar('defrag '+Drive+' -f'),
      @Security,
      @Security,
      true,
      NORMAL_PRIORITY_CLASS,
      nil,
      nil,
      start,
      ProcessInfo) then
    begin
    with ProcessInfo do
    begin
    Process:=ProcessInfo.hProcess;
    hThread:=ProcessInfo.hThread;
    WaitForInputIdle(Process, INFINITE); // ждем завершения инициализации
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE); // ждем завершения процесса
    GetExitCodeProcess(ProcessInfo.hProcess, ExitCode); // получаем код завершения
    CloseHandle(hThread); // закрываем дескриптор процесса
    CloseHandle(Process); // закрываем дескриптор потока
    end;
  end;
//else Error := GetLastError;
end;


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

function StopDefrag: Boolean;
begin
Stopped:=True;
// завершаем процесс дефрагментации
try
postmessage(FindWindow('Defrag', NIL), WM_CLOSE,0,0);
postmessage(FindWindow('DfrgNtfsClass', NIL), WM_CLOSE,0,0);
postmessage(FindWindow('DfrgFatClass', NIL), WM_CLOSE,0,0);
// завершаем процесс очистки
if WaitForSingleObject(Process, 3000) <> WAIT_OBJECT_0 then
TerminateProcess(Process, 0);
except
end;
Result:=True;
end;


И такой еще вопрос: я так понимаю, что запаузить дефрагментацию нельзя, только остановить?
PM WWW ICQ   Вверх
MetalFan
Дата 1.4.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



а зачем работать с оболочкой?
копай в сторону WMI - Win32_Volume Class


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MadCoder
Дата 1.4.2008, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MetalFan @ 1.4.2008,  22:18)
а зачем работать с оболочкой?
копай в сторону WMI - Win32_Volume Class

Подскажи, как и где копать пожалуйста, почитаю smile.
PM WWW ICQ   Вверх
MetalFan
Дата 2.4.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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





--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MadCoder
Дата 3.4.2008, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ничего не получается :(.
PM WWW ICQ   Вверх
MadCoder
Дата 3.4.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MetalFan @ 1.4.2008,  22:18)
а зачем работать с оболочкой?
копай в сторону WMI - Win32_Volume Class

Судя по документации, такой код невозможно будет преврать\остановить:
Цитата

If your code cancels the call by calling IWbemServices::CancelAsyncCall (or SWbemSink.Cancel in script or Visual Basic), then the provider is not notified and the operation continues to completion.

Это так?
PM WWW ICQ   Вверх
MetalFan
Дата 3.4.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



прям таки ничего? ну хоть что-то получается? до объекта достучался?
может имеет смысл поискать(задать вопрос) на королевстве...


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
MadCoder
Дата 3.4.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MetalFan @ 3.4.2008,  11:00)
прям таки ничего? ну хоть что-то получается? до объекта достучался?
может имеет смысл поискать(задать вопрос) на королевстве...

 smile 
PM WWW ICQ   Вверх
MetalFan
Дата 3.4.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



я с WMI плотно не работал и пример пока делать некогда.


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 4.4.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



для начала, TerminateProcess - не лучшее решение для остановки дефрагментатора: уж лучше не остановить, чем порушить файловую систему, не так ли? хотя опасаться в таком случае можно только за судьбу fat'а. но в твоем варианте и это не страшно, так как ты "убиваешь" только "запускалку"(defrag.exe), а dfrgfat/ntfs.exe, к счастью, таким образом не трогаешь.

в целом, код сносный, но я бы увеличил время ожидания завершения - 3 сек маловато.

по вопросу приостановки:
Код

PostMessage(FindWindow('DfrgFatClass', NIL), WM_COMMAND, $1fa7, 0); // pause
PostMessage(FindWindow('DfrgFatClass', NIL), WM_COMMAND, $1fa8, 0); // continue

hiew рулед. smile

ps. Win32_Volume "начался" только в w2k3. smile
PM MAIL   Вверх
MadCoder
Дата 27.9.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



dumb, спасибо большущее! Сейчас буду пробовать smile.

Добавлено через 9 минут и 35 секунд
dumb, а есть ли подобная WM_COMMAND команда для остановки дефрагментации? И подходят ли эти команды также для DfrgNtfsClass?
PM WWW ICQ   Вверх
dumb
Дата 28.9.2008, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Код

// окошко ищем тупо, ну да пофиг
  HWND hDfrg = FindWindow("DfrgNtfsClass", 0);
  if (!hDfrg) hDfrg = FindWindow("DfrgFatClass", 0);
  if (!hDfrg) return;
  PostMessage(hDfrg,WM_COMMAND,0x1fa5,0); // start defrag (если уже запущен конечно, иначе - CreateProcess("defrag X: -f"...))
  PostMessage(hDfrg,WM_COMMAND,0x1fa6,0); // id_stop
  PostMessage(hDfrg,WM_COMMAND,0x1fa7,0); // id_pause
  PostMessage(hDfrg,WM_COMMAND,0x1fa8,0); // id_continue
  PostMessage(hDfrg,WM_COMMAND,0x1fa9,0); // id_abort
  PostMessage(hDfrg,WM_CLOSE, 0, 0); // простое закрытие дефрагментатора

PM MAIL   Вверх
MadCoder
Дата 28.9.2008, 04:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Офигенно! Спасибо громадное, очень помог. А откуда такие сведения?
PM WWW ICQ   Вверх
dumb
Дата 28.9.2008, 04:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(MadCoder @  28.9.2008,  05:19 Найти цитируемый пост)
А откуда такие сведения? 

Цитата(dumb @  4.4.2008,  03:30 Найти цитируемый пост)
hiew рулед. smile

smile
PM MAIL   Вверх
MadCoder
Дата 20.10.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спасибо!
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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