Требование FB не ниже 2.0. Само собой дистрибутив FB 2.0 планируется поставлять на CD, но в setup программе желательно проверить чего там на компьютере пользователя установлено. Разные там IB6.0, 6.5, 7.0 и.т.д.
Для этого скачал себе оригинальную программу для установки FB2.0 и начал разбираться как он сам определяет установленные версии. В конце концов ему нужнее. Скопировал все как у FB, а у меня не работает. Не засекает, что работает сервер и все тут. Проверил оригинальный setup и убедился, что тот тоже не засекает.
Любой может в этом убедиться если запустить setup от Firebird 2.0.3.12982 с работающим сервером Firebird 2.0. (прим. Сервер должен быть установлен с выключенным гвардейцем).
Пришлось разбираться как FB Setup определяет установленные и запущенные версии.
1. Сначала сканируется ключи реестра от всех возможных версий FB и IB. Тут все чисто.
2. Затем сканируются версии файлов от найденных установок в реестре. OK.
3. Так как сервер может быть установлен, но не запущен, пытается определить запущенные сервера. И тут самое интересное.
!!!!Setup не находит работающий сервер, который сам же и установил!!!
Не, ну я бы понял, если бы он не находил какой-нибудь IB 4.5 Beta или еще какую экзотику, но не находить то что сам поставил это уже оригинально.
Далее он, не найдя, считает что ничего нету, и пытается при работающем сервере перезаписать файл FBServer.exe и еще все DLL. Естественно он на этом успешно обсерается и ругается пользователю соответсвующими сообщениями. Представляете себе реакцию какого-нибудь бухгалтера на такое. А кто будет виноват? понятное дело автор программы, то есть я.
Пришлось разбираться.
Вот что показало вскрытие:
Определяется запущенный сервер так (Код Innosetup):
Код: Выделить всё
function FirebirdDefaultServerRunning: boolean;
var
Handle: Integer;
mutex_found: boolean;
begin
result := False;
//Look for a running version of Firebird 1.5 or later
Handle := FindWindowByClassName('FB_Disabled');
if ( Handle = 0 ) then
Handle := FindWindowByClassName('FB_Server');
if ( Handle = 0 ) then
Handle := FindWindowByClassName('FB_Guard');
if (Handle > 0) then
result := True
else begin
mutex_found := CheckForMutexes('FirebirdGuardianMutex,FirebirdServerMutex');
if mutex_found then
result := true;
end;
end;
окна с классом FB_Disabled FB2.0 не имеет
окна с классом FB_Server FB2.0 не имеет
окна с классом FB_Guard FB2.0 не имеет
Чего их анализируют не понятно.
Мьютекса FirebirdGuardianMutex, и FirebirdServerMutex не имеет. То есть правильно Setup не находит запущенный сервер.
Также было установлено, что если сервер установлен с гвардейцем, то mutex FirebirdGuardianMutex таки создается и все работает хорошо, а вот если установить FB c выключенным гвардейцем, то такой мьютекс не создается.
При помощи Handle.exe обнаружил что сервер создает 2 других поименованных мьютекса FIREBIRD_CONNECT_MUTEX и firebird_trace_mutex.
Обнаружить работающий FB2.0 можно по любому из этих мьютексов. Я так и сделал и всем рекомендую.
З/Ы
Передайте этот месседж аффтарам FB, если знаете куда. Может исправят приведенную процедуру из setupa, или в сервере таки создадут Mutex FirebirdServerMutex.