Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Console Application в Delphi


Автор: Chrumov 10.5.2013, 13:13
В общем возник вопрос сохранения некоторых данных программы перед ее закрытием, т.е. при выключении компа и т.п.
Как это можно сделать в Console Application?

Автор: kami 10.5.2013, 13:30
http://delphiworld.narod.ru/base/console_win_shutdown.html

Автор: Chrumov 10.5.2013, 13:52
А можно по подробнее? А то у меня не получатся

Автор: kami 10.5.2013, 17:13
Цитата(Chrumov @  10.5.2013,  13:52 Найти цитируемый пост)
А то у меня не получатся

Что конкретно не получается?

Автор: Chrumov 10.5.2013, 21:56
Я не понимаю как и где это писать, надо таймер ставить чтобы оно эту функцию прогоняло или как?
Если я просто сую в программу, оно не работает, хотя ошибок не показывает.

Автор: kami 10.5.2013, 22:36
Цитата(Chrumov @  10.5.2013,  21:56 Найти цитируемый пост)
Если я просто сую в программу,

Покажи, как "суешь" smile

Автор: Poseidon 10.5.2013, 22:38
Цитата(Chrumov @  10.5.2013,  21:56 Найти цитируемый пост)
Если я просто сую в программу, оно не работает
Вот прямо в том виде, в котором функция приведена, и суешь? Копи-пастом? Тогда не удивительно. А пробовал разобраться вообще что там к чему?

Автор: Chrumov 10.5.2013, 22:58

Код

program Project;

uses
  SysUtils, Classes, Windows;

function Ctrl_Handler(Ctrl: Longint): LongBool;
var
 f: textfile;
begin
  if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then
  begin
   AssignFile(f, 'text.txt');
   Append(f);
   Writeln(f, 'ololo');
   Closefile(f);
  end
  else
  begin

  end;
  Result := true;
end;

begin

end.



Вот так вот "сую"

Автор: Poseidon 10.5.2013, 23:02
Chrumov, молодец. А теперь еще раз тыкни на ссылку kami и прочти внимательно что там написано внизу, после кода. 

Автор: Chrumov 10.5.2013, 23:06
Код

program Project;

uses
  SysUtils, Classes, Windows;

function Ctrl_Handler(Ctrl: Longint): LongBool;
var
 f: textfile;
begin
  if Ctrl in [CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT] then
  begin
   AssignFile(f, '1');
   Append(f);
   Writeln(f, 'ololo');
   Closefile(f);
  end
  else
  begin

  end;
  Result := true;
end;

begin
SetConsoleCtrlHandler( Ctrl_Handler, TRUE );
end.




Not enough actual parameters...

Автор: kami 10.5.2013, 23:32
Вот, кстати, реальный пример неработающего FAQ из поисковика. А он (пример сей) разошелся в интернете...
Надо так:
Код

SetConsoleCtrlHandler(@Ctrl_Handler, TRUE )

Кстати, меня глючит или Ctrl_Handler должна быть stdcall?

Автор: Chrumov 10.5.2013, 23:47
Хоть убейте, не работает  smile 

Ошибок нет, запускаю прогу, вырубаю комп, включаю, текстовый файл пуст

Автор: northener 11.5.2013, 01:41
Цитата(kami @  10.5.2013,  23:32 Найти цитируемый пост)
Надо так:

Почему надо так?

Автор: kami 11.5.2013, 10:43
Цитата(northener @  11.5.2013,  01:41 Найти цитируемый пост)
Почему надо так?

Могу ошибаться, конечно, но:
1. если без указателя - Delphi думает, что нужно подставить результат выполнения функции. Соответственно - выдает недостаточно параметров.
2. http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016(v=vs.85).aspx указано "A pointer to the application-defined HandlerRoutine function", кроме того - в объявлении этой ф-и в Windows.pas первый параметр идет как FarProc.

Добавлено через 1 минуту и 23 секунды
И - до сих пор не понимаю:
Цитата(kami @  10.5.2013,  23:32 Найти цитируемый пост)
 меня глючит или Ctrl_Handler должна быть stdcall?


Добавлено через 6 минут и 54 секунды
Update:
меня не глючит. Действительно, правильный код выглядит так:
Код

function Ctrl_Handler(Ctrl: Longint): BOOL; stdcall;
var
  f: textfile;
begin
  if Ctrl in [CTRL_CLOSE_EVENT, CTRL_BREAK_EVENT] then
    begin
      MessageBox(0, '11234eqerf', 'asdfasdf', MB_OK);
    end;
  Result := true;
end;

begin
  SetConsoleCtrlHandler(@Ctrl_Handler, true);
  while True do
    Sleep(1000);
end.

Для Chrumov, в этом примере код реагирует на нажатие кнопки "закрыть" консольного окна и на Ctrl+Break, а не на завершение работы Windows. Нужные параметры для отлавливания можно найти в http://msdn.microsoft.com/en-us/library/windows/desktop/ms683242(v=vs.85).aspx

Автор: Alexeis 11.5.2013, 10:53
Цитата(kami @  11.5.2013,  00:32 Найти цитируемый пост)
Кстати, меня глючит или Ctrl_Handler должна быть stdcall?

   Чо думать, переходим на 
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016(v=vs.85).aspx
затем на 
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683242(v=vs.85).aspx
И видим
Код

BOOL WINAPI HandlerRoutine(
  _In_  DWORD dwCtrlType
);

Для 32х битных систем WINAPI точно имеет stdcall

Автор: Chrumov 11.5.2013, 11:40
Работает! Спасибо, помогли)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)