Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 15:28   #1
fedakdenis
Пользователь
 
Регистрация: 10.06.2010
Сообщений: 11
По умолчанию Получить список DSN средствами WinApi

Всем доброго времени суток.
Начал писать функцию заполняющую список строк источниками данных DSN
Для этого вытащил из odbc32.dll следующие функции:
Код:
function SQLDataSources(EnvironmentHandle:LongWord;Direction:Smallint;
    ServerName:PAnsiChar;BufferLength1:Smallint;NameLength1Ptr:PSmallInt;
    Description:PAnsiChar;BufferLength2:Smallint;NameLength2Ptr:PSmallInt): Smallint; stdcall; external 'odbc32.dll';
function SQLAllocHandle(HandleType:Smallint;InputHandle:Smallint;
    OutputHandlePtr:Pointer): Smallint; stdcall; external 'odbc32.dll';
function SQLSetEnvAttr(EnvironmentHandle:LongWord;Attribute:Integer;
    ValuePtr:Pointer;StringLength:Integer): Smallint; stdcall; external 'odbc32.dll';
function SQLFreeHandle(HandleType:Smallint;Handle:LongWord): Smallint; stdcall; external 'odbc32.dll';
А вот и сама функция:
Код:
procedure TfmConnection.UpdateDSNList(Strins: TStrings);
const
  MAX_BUF=1024;
  SQL_HANDLE_ENV=1;
  SQL_NULL_HENV=0;
  SQL_ATTR_ODBC_VERSION=200;
  SQL_IS_INTEGER=-6;
  SQL_FETCH_FIRST_USER=31;
  SQL_FETCH_FIRST=2;
  SQL_FETCH_NEXT=1;
  SQL_OV_ODBC3=3;
  SQL_NO_DATA=100;
var
  datasrc,descrip,datasrcoem,descripoem:PAnsiChar;
  tmpstr:string;
  direction,ValuePtr,ret:Smallint;
  rdsrc,rdesc:PSmallInt;
  hEnv:Cardinal;
  UL3:Cardinal;
begin
  ret := SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, @hEnv);
  ret := SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION,POINTER(SQL_OV_ODBC3),SQL_IS_INTEGER);
  direction:=SQL_FETCH_FIRST;
  Strins.Clear;
    ret := SQLDataSources(hEnv,direction,
      datasrc,MAX_BUF,rdsrc,
      descrip,MAX_BUF,rdesc
    );
    Strins.Add(String(datasrc));
  SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
end;
Поидее этот код должен вывести имя первого DSN, но начинаются проблемы в строке
Код:
ret := SQLDataSources(hEnv,direction,
      datasrc,MAX_BUF,rdsrc,
      descrip,MAX_BUF,rdesc
    );
Выкидываются access violation то в модуле odbc32.dll то в ntdll.dll то в kernel32.dll
Теряюсь в догадках в чем проблема, помогите кто чем может.
fedakdenis вне форума Ответить с цитированием
Старый 14.10.2010, 11:59   #2
fedakdenis
Пользователь
 
Регистрация: 10.06.2010
Сообщений: 11
По умолчанию

Как говорится, кто ищет тот всегда найдет . Сам спрашивал - сам отвечаю, может поможет кому-нибудь.
Демонстрирую правильный пример кода на Delphi:
Код:
procedure TfmConnection.UpdateDSNList(Strins: TStrings);
const
  MAX_BUF=1024;
  SQL_HANDLE_ENV=1;
  SQL_NULL_HENV=0;
  SQL_ATTR_ODBC_VERSION=200;
  SQL_IS_INTEGER=-6;
  SQL_FETCH_FIRST_USER=31;
  SQL_FETCH_FIRST=2;
  SQL_FETCH_NEXT=1;
  SQL_OV_ODBC3=3;
  SQL_NO_DATA=100;
var
  datasrc,descrip:array [0..MAX_BUF-1] of Char;
  tmpstr,descstring,datastring:string;
  direction,ValuePtr,ret:Smallint;
  rdsrc,rdesc:SmallInt;
  hEnv:Cardinal;
  UL3:Cardinal;
begin
  rdsrc:=0;
  rdesc:=0;
  datasrc[0]:=#0;
  descrip[0]:=#0;
  ret := SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, @hEnv);
  ret := SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION,POINTER(SQL_OV_ODBC3),SQL_IS_INTEGER);
  direction:=SQL_FETCH_FIRST;
  Strins.Clear;
  while (SQLDataSources(hEnv,direction,@datasrc[0],MAX_BUF,@rdsrc,@descrip[0],MAX_BUF,@rdesc)<>SQL_NO_DATA)do begin
    Strins.Add(string(datasrc));
    direction:=SQL_FETCH_NEXT;
  end;
  SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
end;
fedakdenis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Список с заглавным звеном, из текстового файла получить список из записей и по нему уже сделать задание Zigfried Помощь студентам 2 04.10.2010 20:29
Как на WinApi получить все дочерние окна приложения? Wadimka Работа с сетью в Delphi 8 27.05.2009 14:25
Как средствами делфи получить данные из dxdiag CraZZy RabbIt Общие вопросы Delphi 4 25.02.2009 10:28
Как средствами VBA получить доменное имя пользователя? Прохожий Microsoft Office Excel 3 04.10.2008 18:28
Получить список папок Иллидан Общие вопросы Delphi 1 22.03.2008 15:24