RAD Studio Корректное завершение процесса FireBird

Регистрация
4 Окт 2008
Сообщения
25
Реакции
14
Credits
463
Как известно, сервер базы данных FireBird может запускаться как служба Windows, так и обычным приложением без оконного интерфейса. Как работать со службами статьи в интернете есть. Но в своем ПО в серверной части я использую как раз второй вариант с командной строкой firebird.exe -a -n -p3050. (-a запуск как приложения; -n - не отображается значок в трее). Для завершения сервера базы данных вместе с завершением основной программы используется код (он оформлен в виде бесконсольного приложения, но можно использовать и в основном передав правильный путь к firebird.exe):

Код:
program FBShutdown;

uses
  Winapi.Windows,
  Winapi.Messages,
  Winapi.PsAPI,

  System.SysUtils;

function EnumProc(Wd: HWnd; Param: LongInt): Boolean; stdcall;
Var
  ModuleName: array [0 .. 1024] of Char;
  ProcessId, HProcess: Cardinal;
  hMod: HMODULE;
  cb: DWORD;
Begin
  EnumProc := TRUE;
  GetWindowThreadProcessId(Wd, ProcessId);

  HProcess := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
  if HProcess <> 0 then
  begin
    EnumProcessModules(HProcess, @hMod, SizeOf(hMod), cb);
    GetModuleFilenameEx(HProcess, hMod, ModuleName, SizeOf(ModuleName));

    if (ExtractFileName(ModuleName) = 'firebird.exe') and
       (ExtractFilePath(ModuleName).ToLowerInvariant = ExtractFilePath(ParamStr(0)).ToLowerInvariant) then
    begin
      SendMessage(Wd, WM_CLOSE, 0, 0);
      WaitForSingleObject(ProcessId, 60000);
    end;

    CloseHandle(HProcess);
  end;
end;

begin
  try
    EnumWindows(@EnumProc, 0);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Если к базе данных висит подключение (например IBExpert), то будет выдаваться запрос самим сервером базы. Данный код в моих условиях работает не первый год, но замечания, ошибки принимаются :) Если есть на данный момент для FireBird 4 стандартное решение - будет интересно узнать.