Сообщений 0    Оценка 54        Оценить  
Система Orphus

Как получить список драйверов и источников данных, установленных на компьютере?

Автор: Игорь Вартанов
Опубликовано: 30.04.2001
Исправлено: 13.03.2005
Версия текста: 1.0

Список драйверов ODBC, установленных в системе, можно получить минимум двумя способами, один их которых основан на ODBC API, унаследованном от Win16, а второй - на более современном API. Второй способ позволяет в дополнение к списку драйверов получить наборы аттрибутов, поддерживаемых каждым из драйверов.

#include <windows.h>
#include <stdio.h>
#include <odbcinst.h>   // SQLGetInstalledDrivers()
#include <sqlext.h>     // SQLDrivers()

#pragma comment(lib, "odbc32")
#pragma comment(lib, "odbccp32")
#pragma comment(lib, "user32")

void main()
{
#define MAX_BUF 1024
    char drivers[MAX_BUF] = {0};
    char descrip[MAX_BUF] = {0};
    WORD rdriv = 0, rdesc = 0;
    //----------- Способ 1 -----------------------------------
    BOOL res = SQLGetInstalledDrivers(drivers, MAX_BUF, &rdriv);
    if(rdriv == MAX_BUF)
        printf("Too few buffer size.\n");
    char* p = drivers;
    while(*p)
    {
        printf("%s\n", p);
        p += lstrlen(p) + 1;
    }
    printf("\n");
    //----------- Способ 2 ------------------------------------
    SQLHENV hEnv;
    SQLRETURN ret;
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &hEnv);
    ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION,
                            (SQLPOINTER)SQL_OV_ODBC3,
                            SQL_IS_INTEGER);
    SQLSMALLINT direction = SQL_FETCH_FIRST;
    while(1)
    {
        ret = SQLDrivers(
            hEnv, direction,
            (SQLTCHAR*)drivers, MAX_BUF, (short*)&rdriv,
            (SQLTCHAR*)descrip, MAX_BUF, (short*)&rdesc);
        if(SQL_NO_DATA == ret)
            break;
        direction = SQL_FETCH_NEXT;
        printf("* %s\n", drivers);
        p = descrip;
        while(*p)
        {
            CharToOem(p, p);
            printf("%s; ", p);
            p += lstrlen(p) + 1;
        }
        printf("\n");
    }
    SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    printf("\n");
}

Список источников данных получается аналогично получению списка драйверов по второму способу.

#include <windows.h>
#include <stdio.h>
#include <sqlext.h>

#pragma comment(lib, "odbc32")
#pragma comment(lib, "odbccp32")
#pragma comment(lib, "user32")

void main()
{
#define MAX_BUF 1024
    char  datasrc[MAX_BUF] = {0};
    char  descrip[MAX_BUF] = {0};
    short rdsrc = 0, rdesc = 0;
    SQLHENV hEnv;
    SQLRETURN ret;
    ret = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HENV, &hEnv);
    ret = SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION,
                            (SQLPOINTER)SQL_OV_ODBC3,
                            SQL_IS_INTEGER);
    SQLSMALLINT direction = SQL_FETCH_FIRST;
    while(1)
    {
        ret = SQLDataSources(
            hEnv, direction, 
            (SQLTCHAR*)datasrc, MAX_BUF, &rdsrc,    
            (SQLTCHAR*)descrip, MAX_BUF, &rdesc);
        if(SQL_NO_DATA == ret)
            break;
        direction = SQL_FETCH_NEXT;
        CharToOem(datasrc, datasrc);
        CharToOem(descrip, descrip);
        printf("* %s (%s)\n", datasrc, descrip);
    }
    SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    printf("\n");
}
ПРИМЕЧАНИЕ
Вы при необходимости можете сузить диапазон выводимых значений, указав для direction в качестве стартового параметра SQL_FETCH_FIRST_USER для пользовательских источников данных и SQL_FETCH_FIRST_SYSTEM для системных.

Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав.
    Сообщений 0    Оценка 54        Оценить