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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отлов сообщения WM_KILL без *.dll 
:(
    Опции темы
RamIreZz
  Дата 31.3.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Veni, vidi, vici.



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 9.3.2008
Где: Химки

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



Собственно сабж, существует ли такая возможность?

Вопрос зачем?!

У меня требование, что даже при экстренном закрытии {Выключение компьютера/перезагрузка и т.д.}, нужно сохранить кое какие данные, для восстановления утерянного процесса...

Заранее спасибо...
PM MAIL   Вверх
kami
Дата 1.4.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(RamIreZz @  31.3.2009,  23:55 Найти цитируемый пост)
даже при экстренном закрытии

Длительное нажатие кнопки Power или нажатие Reset, а равно и исполнение функции InitiateSystemShutdown с флагом EWX_FORCE не отследить.

Сообщение, отосланное непосредственно своей форме, можно поймать в ней же, например:

Код

type 
  TForm1=class(...)
  private
    procedure MyWMCapture(var message:TMessage); message WM_.....;
  .....
  end;


procedure TForm1.MyWMCapture(.....);
begin
  // вот мы его и поймали.
end;

Вот только MSDN на вопрос WM_KILL ничего не находит, как локальная, так и on-line версии
Очень хочется посмотреть, что же это такое. Ссылочку можно?

Добавлено @ 00:17
Цитата(kami @  1.4.2009,  00:15 Найти цитируемый пост)
 исполнение функции InitiateSystemShutdown с флагом EWX_FORCE не отследить

поправка:
отследить (вернее, ощутить выполнение) этой ф-и можно, но вот если не успеешь среагировать, то ничего не поможет - процесс будет просто терминирован жесточайшим образом.

Это сообщение отредактировал(а) kami - 1.4.2009, 00:18
PM MAIL WWW   Вверх
RockClimber
Дата 1.4.2009, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 15



Цитата(RamIreZz @  31.3.2009,  23:55 Найти цитируемый пост)
нужно сохранить кое какие данные, для восстановления утерянного процесса...

Может, проще их держать всегда сохраненными во временном файле? По мере надобности обновлять, а при запуске - проверять временный файл на наличие экстренно сохраненной информации.


--------------------
Хорошо кинутый дятел далеко летит, крепко встревает, долго торчит.
PM MAIL GTalk   Вверх
Virtuals
Дата 1.4.2009, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



RockClimber, логично, и думаю единственно правильно, 
ЗЫ винда так и делает в отношении минидампа при критическом сбое, (минидамп памяти это постоянно обновляемый кусок в файле подкачки)  smile 
PM MAIL ICQ   Вверх
RamIreZz
Дата 1.4.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Veni, vidi, vici.



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 9.3.2008
Где: Химки

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



Цитата(kami)
поправка:
отследить (вернее, ощутить выполнение) этой ф-и можно, но вот если не успеешь среагировать, то ничего не поможет - процесс будет просто терминирован жесточайшим образом.


Среагировать можно, нужно залочить данное сообщение, сохранить данные, посде чего осуществить терминэйт.

Цитата(RockClimber)
Может, проще их держать всегда сохраненными во временном файле?


Данные меняются динамически и идут большим потоком, и сохраняются при завершении анализа... 

Цитата(RockClimber)
Сообщение, отосланное непосредственно своей форме, можно поймать в ней же, например:


А если должен app поймать данное сообщение, то тогда как?


Это сообщение отредактировал(а) RamIreZz - 1.4.2009, 13:02
PM MAIL   Вверх
kami
Дата 1.4.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(RamIreZz @  1.4.2009,  13:01 Найти цитируемый пост)
реагировать можно, нужно залочить данное сообщение

Да ну?
Тогда, пожалуйста, пример кода, в котором лочится вызванная из другой программы
Код

ExitWindowsEx(EWX_SHUTDOWN or EWX_FORCE, 0)

На всякий случай - цитата из MSDN:
Цитата

Windows 2000/NT:  Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
Starting with Windows XP, these messages will always be sent.

During a shutdown or log-off operation, applications that are shut down are allowed a specific amount of time to respond to the shutdown request. If the time expires, the system displays a dialog box that allows the user to forcibly shut down the application, to retry the shutdown, or to cancel the shutdown request. If the EWX_FORCE value is specified, the system always forces applications to close and does not display the dialog box.

Если приложение своевременно не ответит на WM_QUERYENDSESSION - ему не поздоровится.


Цитата(RamIreZz @  1.4.2009,  13:01 Найти цитируемый пост)
А если должен app поймать данное сообщение, то тогда как?

TApplication.OnMessage + F1 ?

Это сообщение отредактировал(а) kami - 1.4.2009, 17:50
PM MAIL WWW   Вверх
Virtuals
Дата 1.4.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



RamIreZz, 

попробуйте хоть как-то среагировать на это

Код

type
  TTypeShutDown=(tsShoutdown,tsRestart,tsPowerOff);

  function RtlAdjustPrivilege(dwPrivilegeId: DWORD;bSet:boolean;
           AdjType: integer; Unc: PDWORD): word; stdcall;  external 'ntdll.dll';

  function NtShutdownSystem(dwShutDown: DWORD): DWORD; stdcall;  external 'ntdll.dll';
var
  unc:DWORD;
begin
  RtlAdjustPrivilege(19,True,0,@unc);
  try
    Result:=NtShutdownSystem(Ord(tsShoutdown));
  finally
    RtlAdjustPrivilege(19,False,0,@unc);
  end;
end;



думаю очень неприятно удивитесь  smile 

ВНИМАНИЕ!, данный пример вырубит винду быстрее чем вы сможете вилку из розетки вынуть, так что за порчу несохраненных данных в ответе только вы сами.

Добавлено через 4 минуты и 41 секунду
имхо, похоже рыть в сторону аналога виндового файла подкачки, ...
PM MAIL 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.

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


 




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


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

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