Горячий шоколад
Местный
Как известно, сервер базы данных FireBird может запускаться как служба Windows, так и обычным приложением без оконного интерфейса. Как работать со службами статьи в интернете есть. Но в своем ПО в серверной части я использую как раз второй вариант с командной строкой firebird.exe -a -n -p3050. (-a запуск как приложения; -n - не отображается значок в трее). Для завершения сервера базы данных вместе с завершением основной программы используется код (он оформлен в виде бесконсольного приложения, но можно использовать и в основном передав правильный путь к firebird.exe):
Если к базе данных висит подключение (например IBExpert), то будет выдаваться запрос самим сервером базы. Данный код в моих условиях работает не первый год, но замечания, ошибки принимаются
Если есть на данный момент для FireBird 4 стандартное решение - будет интересно узнать.
Код:
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), то будет выдаваться запрос самим сервером базы. Данный код в моих условиях работает не первый год, но замечания, ошибки принимаются