xtensp
@xtensp

Как подключиться к SQLite3?

Решила подключить библиотеку sqlite3.dll к проекту используя явное связывание. Но при попытке подключиться к базе идея терпит провал... Студия указывает на ' identifier is undefined ' . Я не могу понять что не так делаю. Помогите пожалуйста

typedef int (*function);
    {
        HMODULE hm = LoadLibrary(L"sqlite3.dll");

        if (NULL == hm)
        {
            cout << (" not found!\\n");
        }
        else
        {
            function SQLITE_OPEN_READONLY = (function)GetProcAddress(hm, "sqlite3_open_v2");
            function sqlite3_close = (function)GetProcAddress(hm, "sqlite3_open_v2");
            if ((NULL == SQLITE_OPEN_READONLY) || (NULL == sqlite3_close))
            {
                cout << (" doesn't export functions\\n");
            }
            else
            {   
                              
                sqlite3* sql_db = NULL;
                status = sqlite3_open_v2(TEMP_DB_PATH, &sql_db, SQLITE_OPEN_READONLY, NULL);
                   
                if (status != SQLITE_OK) 
                {
                    sqlite3_close(sql_db);
                    DeleteFile(TEXT(TEMP_DB_PATH));
                }
                 cout << "OK"<< endl;
            }
           
        }      
        FreeLibrary(hm);
        _getch();
    }    
    return 0;
  • Вопрос задан
  • 252 просмотра
Пригласить эксперта
Ответы на вопрос 3
saboteur_kiev
@saboteur_kiev Куратор тега C++
software engineer
identifier is undefined

Где именно она это указывает?
Она либо не знает про указанную переменную, либо про указанную функцию. Их нужно определить либо правильно подключить.
Ответ написан
@galaxy
А заголовочный файл подключить?
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
typedef int (*function);

Это не определение типа указателя на функцию. Это указатель на int. Указатель на функцию выглядит как-то так:
typedef int (*function)(void);

status = sqlite3_open_v2(TEMP_DB_PATH, &sql_db, SQLITE_OPEN_READONLY, NULL);

Это выглядит как обычное связывание. Потому что sqlite3_open_v2 выглядит как имя функции, а не указателя, полученного через GetProcAddress. Чтобы оно работало нужно правильное объявление функции sqlite3_open_v2 во время компиляции и нужно линковаться с implib sqlite3 во время линковки.
Но в чём смысл мешать в одном и том же коде такое связывание и LoadLibrary/GetProcAddress?

sqlite3_close(sql_db);

Если sqlite3_close принимает параметр, этот параметр должен быть и в typedef которым определён его тип. Например:
typedef sqlite3;
typedef int (*fn1) (sqlite3* db);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы