Показать сообщение отдельно
  #5  
Старый 15.05.2009, 19:05
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Посмотрев на пожелания общественности набросал небольшой модуль который помогает решить проблему непонятки с с именами драйверов ODBC.
Сразу скажу - тестировал мало, поэтому могут быть баги.
Код:
unit odbc_func;
{
  Модуль для получения информации о ODBC драйверах установленных в системе

  (c) Aristarh Dark (2009)
  e-mail: aristarh.dark@gmail.com

  Зависимости:
  Classes, SysUtils, Windows, Registry, StrUtils
}

{.$DEFINE debug}

interface
uses
  Classes;

function GetODBCDriversNamesList(DrvNamesList:TStrings):boolean;
function GetODBCDriversList(DrvNames,DrvList:TStrings):boolean;

function GetFileExtnsByODBCDriverName(DriverName:string;var FileExtns:string):boolean;
function GetODBCDriverNameByFileExtns(FileExtns:string; var DriverName:string):boolean;
function GetODBCDriversNamesByFileExtns(FileExtns:string; DriversNames:TStrings):boolean;

implementation

uses
  SysUtils, Windows,Registry, StrUtils
{$IFDEF debug}
  , Dialogs
{$ENDIF}
  ;

function GetODBCDriversNamesList(DrvNamesList:TStrings):boolean;
{
  Получение названий установленных в систему драйверов ODBC
  (пользовательский уровень)

  DrvNamesList - объект в который будут выгружены названия драйверов

  ВОЗВРАТ - логика, говорящая об успехе операции

  Aristarh Dark
  2009-05-15
}
var
  Reg:TRegistry;
begin
  Result:=False;
  Reg:=TRegistry.Create(KEY_READ);
  try
    if Reg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', False) then
      begin
        Reg.GetValueNames(DrvNamesList);
        Result:=True;
      end;
  finally
    Reg.Free;
  end;
end;

function GetODBCDriversList(DrvNames,DrvList:TStrings):boolean;
{
  Получение имен установленных драйверов ODBC
  (пользовательский уровень)

  DrvNames - список названий драйверов (см. GetODBCDriversNamesList)
  DrvList - объект в который будут выгружены имена драйверов

  ВОЗВРАТ - логика, говорящая об успехе операции

  Aristarh Dark
  2009-05-15
}
var
  Reg:TRegistry;
  i:integer;
begin
  Result:=False;
  DrvList.Clear;
  Reg:=TRegistry.Create(KEY_READ);
  try
    if Reg.OpenKey('\Software\ODBC\ODBC.INI\ODBC Data Sources', False) then
      begin
        for i:=0 to DrvNames.Count-1 do
          DrvList.Append(Reg.ReadString(DrvNames[i]));
        Result:=True;
      end;
  finally
    Reg.Free;
  end;
end;

function GetFileExtnsByODBCDriverName(DriverName:string;var FileExtns:string):boolean;
{
  Возвращает расширения файлов для драйвера ODBC

  DriverName - имя драйвера ODBC (см. GetODBCDriversList)
  FileExtns - переменная куда будут выгружена строка с расширениями

  ВОЗВРАТ - логика, говорящая об успехе операции

  Aristarh Dark
  2009-05-15
}
var
  Reg:TRegistry;
begin
  Result:=False;
  FileExtns:='';
  Reg:=TRegistry.Create(KEY_READ);
  try
    Reg.RootKey:=HKEY_LOCAL_MACHINE;
    if Reg.OpenKey(Format('\Software\ODBC\ODBCINST.INI\%s',[DriverName]), False) then
      begin
        FileExtns:=Reg.ReadString('FileExtns');
        Result:=True;
      end;
  finally
    Reg.Free;
  end;
end;


function GetODBCDriverNameByFileExtns(FileExtns:string; var DriverName:string):boolean;
{
  Возвращает название ODBC драйвера (для использование в ConnectionString (ADO))
  по расширению(ям) файла базы данных
  ПРИМЕЧАНИЕ: Данная функция возвращает только первый найденный драйвер

  FileExtns - расширение файла в виде ".xxx" или список расширений в виде ".xxx;.yyy;.zzz"
  DriverName - переменная в которую будет выгружено имя драйвера ODBC

  ВОЗВРАТ - логика, говорящая об успехе операции

  Aristarh Dark
  2009-05-15
}
var
  sl:TStringList;
  DriversNamesList,DriversList:TStringList;
  i,j:integer;
  FileExt:string;
begin
  Result:=False;
  DriverName:='';
  //разберем строку расширений (на случай если более одного)
  sl:=TStringList.Create;
  sl.Delimiter:=';';
  sl.DelimitedText:=FileExtns;
{$IFDEF debug}
  ShowMessage(IntToStr(sl.Count));
{$ENDIF}
  //Ну и сам поиск драйвера
  DriversNamesList:=TStringList.Create;
  DriversList:=TStringList.Create;
  if GetODBCDriversNamesList(DriversNamesList) then
    if GetODBCDriversList(DriversNamesList,DriversList)then
      begin
        for i:=0 to DriversList.Count-1 do
          begin
            for j:=0 to sl.Count-1 do
              if GetFileExtnsByODBCDriverName(DriversList[i],FileExt) then
                if pos(Trim(sl[j]),FileExt)>0 then
                  begin
                    DriverName:=DriversNamesList[i];
                    Result:=True;
                    Break;
                  end;
            if Length(DriverName)>0 then
              Break;
          end;
      end;
  DriversList.Free;
  DriversNamesList.Free;
  sl.Free;
end;

function GetODBCDriversNamesByFileExtns(FileExtns:string; DriversNames:TStrings):boolean;
{
  Возвращает название всех ODBC драйверов (для использование в ConnectionString (ADO))
  связанных расширением(ями) файла базы данных

  FileExtns - расширение файла в виде ".xxx" или список расширений в виде ".xxx;.yyy;.zzz"
  DriversNames - переменная в которую будут выгружене имена драйверов ODBC

  ВОЗВРАТ - логика, говорящая об успехе операции

  Aristarh Dark
  2009-05-15
}
var
  sl:TStringList;
  DriversNamesList,DriversList:TStringList;
  i,j:integer;
  FileExt:string;
begin
  DriversNames.Clear;
  sl:=TStringList.Create;
  sl.Delimiter:=';';
  sl.DelimitedText:=FileExtns;
  DriversNamesList:=TStringList.Create;
  DriversList:=TStringList.Create;
  if GetODBCDriversNamesList(DriversNamesList) then
    if GetODBCDriversList(DriversNamesList,DriversList)then
      for i:=0 to DriversList.Count-1 do
        for j:=0 to sl.Count-1 do
          if GetFileExtnsByODBCDriverName(DriversList[i],FileExt) then
            if pos(Trim(sl[j]),FileExt)>0 then
              DriversNames.Append(DriversNamesList[i]);
  DriversList.Free;
  DriversNamesList.Free;
  sl.Free;
  Result:=True;
end;
end.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием