Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

Как програмно узнать, установлен ли InterBase   Найти похожие ветки 

 
volser   (2004-04-19 19:23) [0]

Как програмно узнать, установлен ли InterBase и какая версия?


 
Romkin ©   (2004-04-19 19:28) [1]

Посмотри в реестре. Все прописывается как положено, в HKLM/Software. Правда, несколько различно :)


 
volser   (2004-04-19 21:13) [2]


> Посмотри в реестре. Все прописывается как положено, в HKLM/Software.
> Правда, несколько различно :)

Как узнать что установленная именно 6 или 7 версия InterBase


 
Vlad ©   (2004-04-19 21:51) [3]

TIBDataBaseInfo ?


 
gire   (2004-04-20 01:13) [4]

мне нужен помощник (с оплатой) по Delphi


 
y-soft ©   (2004-04-20 08:50) [5]

Romkin ©   (19.04.04 19:28) [1]
Посмотри в реестре. Все прописывается как положено, в HKLM/Software. Правда, несколько различно :)


Вот именно, что различно :) К тому же одновременно может быть установлено несколько движков разных версий...

Тут можно предложить разные способы:

На стороне сервера:

1.1 Читать из реестра путь к директории \Bin для каждого

Для IB X.X и FB 1.0X

 HKLM\Software\InterBase Corp\InterBase\CurrentVersion\ServerDitrectory

Для Yaffil

 HKLM\Software\Yaffil\ServerDitrectory

Для FB 1.5 и выше точно не помню :)

1.2 В директории \Bin читать версию исполняемого файла

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

На стороне как сервера, так и клиента:
 
Проще всего прочитать версию из gds32.dll (В InterBase Express так и реализовано) Но способ не дает 100% гарантии, т.к. клиенты могут работать вместе с серверами более старых версий, к тому же сразу с несколькими :(


 
iKS1 ©   (2004-04-20 11:59) [6]

Если речи идет об IB вообще и его (ее) клонах, то никак. Если о конткретных реализациях то см. выше.


 
Romkin ©   (2004-04-20 12:14) [7]

HKLM\Software\InterBase Corp\InterBase\CurrentVersion\
В ключе Version написана версия, так что больше никуда заглядывать не надо :))


 
y-soft ©   (2004-04-20 14:01) [8]

>Romkin ©   (20.04.04 12:14) [7]

Оно, однако, не всегда верно - ключик может быть, а IB отсутствовать :)

Сам производитель в руководстве по написанию инсталляторов настоятельно рекомендует проверять наличие файлов


 
Romkin ©   (2004-04-20 14:40) [9]

НУ это уже детали :))
Самая хорошая проверка - подключиться.
Кстати, и наличие строки gds_db в Services неплохо проверить, мало ли...
Вот, проверяет и записывает, если что:

resourcestring
 Sgds = "gds_db 3050/tcp";
 SIBServ = "gds_db";

const
 ServiceKey = "\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters";

function TfrmPages.LogServices: boolean;

 function GetIBService(var IBPort: integer): boolean;
 var
   ServEnt: PServEnt;
 begin
   Result := false;
   ServEnt := GetServByName(PChar(SIBServ), "tcp");
   if assigned(ServEnt) then
   begin
     Result := true;
     IBPort := ntohs(ServEnt.s_port);
   end;
 end;

 function WriteServString(const ServString: string): boolean;
 var
   ServFile: textFile;
   reg: TRegistry;
   ServPath: string;
   PathStr: array [0..MAX_PATH] of char;
 begin
   Result := false;
   //Путь
   if GetWindowsDirectory(PathStr, MAX_PATH) = 0 then
     RaiseLastOSError;
   ServPath := IncludeTrailingPathDelimiter(PathStr);
   Reg := TRegistry.Create(KEY_READ);
   try
     Reg.RootKey := HKEY_LOCAL_MACHINE;
     if Reg.OpenKeyReadOnly(ServiceKey) then
     begin
       ServPath := reg.ReadString("DataBasePath");
       ExpandEnvironmentStrings(PChar(ServPath), PathStr, MAX_PATH);
       ServPath := IncludeTrailingPathDelimiter(PathStr);
     end;
   finally
     reg.CloseKey;
     reg.Free;
   end;
   assignFile(ServFile, ServPath + "Services");
   append(ServFile);
   try
     Writeln(ServFile, Sgds);
     Result := true;
   finally
     CloseFile(ServFile);
   end;
 end;

var
 ErrorCode: integer;
 WSAData: TWSAData;
 IBPort: integer;
begin
 Result := false;
 ErrorCode := WSAStartup($0101, WSAData);
 if ErrorCode <> 0 then
   raiseLastOSError;
 try
   if GetIBService(IBPort) then //Запись есть
     Result := true
   else  //Записи нет, будем ставить
   begin
     if not WriteServString(Sgds) then
       raise Exception.Create("Не получилось что-то");
   end;
 finally
   ErrorCode := WSACleanup;
   if ErrorCode <> 0 then
     raiseLastOSError;
 end;
end;


 
igoreha   (2004-04-20 20:10) [10]

Так, на мой взгляд, проще и надежнее:

function GetIBClientInformation: string;
var
 Buffer: array[0..261] of Char;
 FileName: string;
 VerInfo: TVersionInfo;
 IBLibrary: THandle;
begin
 result:= "";
 try
   IBLibrary:= LoadLibrary("gds32.dll");
   SetString(FileName, Buffer, Windows.GetModuleFileName(IBLibrary, Buffer, SizeOf(Buffer)));
   FreeLibrary(IBLibrary);
   if FileName <> "" then begin
     VerInfo:= TVersionInfo.Create(FileName);
     try
       if VerInfo.Valid then
         result:= VerInfo.FileDescription + " " + VerInfo.FileVersion;
      finally
       VerInfo.Free;
     end;
   end;
  except
 end;
end;


 
AndrewVolkov   (2004-04-20 23:37) [11]

>>igoreha

только надо добавить, что надо воспользоваться классом TVersionInfo из набора RxLib.

Uses ..,RxVerInf;


 
sniknik ©   (2004-04-20 23:50) [12]

igoreha   (20.04.04 20:10) [10]
у меня дллка лежит в системной директории но сам ib не установлен (dll от персонал версии) и...? это же не установлен.


 
y-soft ©   (2004-04-21 09:33) [13]

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


uses
 Windows,Classes,WinSvc,SysUtils;
...

type
 TIBServer = (ibInterBase,ibYaffilSS,ibYaffilCS,ibFirebird10X,ibFirebird15orHigher);
 TEnumIBServicesCbk = procedure(ServerKind : TIBServer; const Cfg : TQueryServiceConfigA;
   const Status : TServiceStatus);
procedure EnumIBServices(EnumCbk : TEnumIBServicesCbk);
const
 SvcNames : array[TIBServer] of string = ("InterBaseServer",
                                            "YaffilSQLServer(SS)",
                                            "YaffilSQLServer(CS)",
                                            "FireBirdServer",
                                            "FirebirdServerDefaultInstance");
var
 ibs : TIBServer;
 SCM, Service : THandle;
 ServiceStatus : TServiceStatus;
 CfgSize, LastErr : DWORD;
 Cfg : PQueryServiceConfigA;

begin
 for ibs = Low(TIBServer) to High(TIBServer) do
 begin
   SCM := OpenSCManager(nil,nil,SC_MANAGER_CONNECT);
   if SCM = 0 then
     raise Exception.CreateFmt("Ошибка OpenSCManager"#13#10"%s",
       [SysErrorMessage(GetLastError)]);
   try
     Service := OpenService(SCM,PChar(SvcNames[ibs]),SERVICE_QUERY_STATUS or SERVICE_QUERY_CONFIG);
     if Service = 0 then
     begin
       LastErr := GetLastError;
       case LastErr of
         ERROR_SERVICE_DOES_NOT_EXIST, ERROR_INVALID_NAME : Continue
       else
         raise Exception.CreateFmt("Ошибка OpenService"#13#10"%s",
           [SysErrorMessage(LastErr)]);
       end;
     end
     else
       try
         if QueryServiceStatus(Service,ServiceStatus) then
         begin
           QueryServiceConfig(Service,nil,0,CfgSize);
           LastErr := GetLastError;
           if LastErr = ERROR_INSUFFICIENT_BUFFER then
           begin
             GetMem(Cfg,CfgSize);
             try
               if QueryServiceConfig(Service,Cfg,CfgSize,CfgSize) then
                 EnumCbk(ibs, Cfg^, ServiceStatus)//В обработчике получаем все необходимые сведения
               else
               begin
                 LastErr := GetLastError;
                 raise Exception.CreateFmt("Ошибка QueryServiceConfig"#13#10"%s",
                   [SysErrorMessage(LastErr)]);
               end;
             finally
               FreeMem(Cfg);
             end;
           end
           else
             raise Exception.CreateFmt("Ошибка QueryServiceConfig"#13#10"%s",
               [SysErrorMessage(LastErr)]);
         end
         else
         begin
           raise Exception.CreateFmt("Ошибка QueryServiceStatus"#13#10"%s",
             [SysErrorMessage(GetLastError)]);
         end;
       finally
         CloseServiceHandle(Service);
       end;
   finally
     CloseServiceHandle(SCM);
   end;
 end;


P.S. Заранее sorry за возможные огрехи - выдрано на скорую руку из реального проекта...



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.07 c
1-1083728597
Dark Man
2004-05-05 07:43
2004.05.16
Работа с 1С


8-1076921082
AlexV
2004-02-16 11:44
2004.05.16
Как получить размер изобр jpg,bmp файлов,не загружая их в память?


14-1082711459
ISP
2004-04-23 13:10
2004.05.16
Дыра в TCP


1-1083183959
Михаил
2004-04-29 00:25
2004.05.16
Многомерные динамические массивы


1-1083311730
Ш-К
2004-04-30 11:55
2004.05.16
FreeAndNil





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский