Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
2 / 1 / 0
Регистрация: 04.11.2021
Сообщений: 63

Использование готовой dll, явная загрузка

17.10.2022, 17:18. Показов 2991. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
есть dll - sqlite3, подключаю с помощью loadlibrary, получаю указатель на нужные функции, вызываю их - с этим разобрался. см. код ниже. но вот второй параметр sqlite3_open - ссылка на объект БД ее получают в примерах в интернете как sqlite3 *db но для этого используют заголовочный файл <sqlite3.h>. Но этот файл нужно как то взять из исходников sqlite3.

вопросы:
1. можно ли db handle создать без заголовочного файла только используя dll
2. если нельзя, то как лучше получить sqlite3.h

C++
1
    int sqlite3_open(const char *filename,   sqlite3 **ppDb )
C++
1
2
3
4
5
6
7
8
9
    HMODULE h;
    void (DllFunc) (char *str);
 
    h=LoadLibrary("sqlite3.dll");
 
    
    void (*pFunction)();
    (FARPROC &)pFunction = GetProcAddress(h, "sqlite3_open");
    pFunction("GRServer.sdb");
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.10.2022, 17:18
Ответы с готовыми решениями:

DLL in VC++. Создание, загрузка, использование.
Как известно, в VC++ имеется несколько типов Dll: 1.Non-MFC DLLs; 2.Regular DLLs Statically Linked to MFC; 3.Regular DLLs Dynamically...

Явная специализация шаблонной функции с использование decltype
Добрый день. Есть вопрос - в чём проблема во втором случае? Данный код компилируется: #include &lt;iostream&gt; #include...

Явная загрузка dll
Подскажите пожалуйста, что у меня в коде не так. Учился вот здесь https://www.cyberforum.ru/cpp-builder/thread154847.html но что то не...

47
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2022, 16:15
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от SergeyAK Посмотреть сообщение
явная загрузка
Это всегда плохой вариант, сейчас я не буду обосновывать свои слова.
Просто поверьте на слово. Если есть возможность. можете хранить объектные файлы. и их подгружать
Если нужны именно внешние библиотеки (.dll), подгружайте их "статически" - не явно.
Не явно, через хидеры для "имен", через спец. команды для линковщика.
А вообще может я и бред несу, "хорош" уже сегодня.

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
либо исходник sqlite добавлен в проект.
Цитата Сообщение от SergeyAK Посмотреть сообщение
нет, исходника нет.
Хидеры имелось ввиду.
0
2 / 1 / 0
Регистрация: 04.11.2021
Сообщений: 63
26.10.2022, 17:37  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это всегда плохой вариант, сейчас я не буду обосновывать свои слова.
Просто поверьте на слово. Если есть возможность. можете хранить объектные файлы. и их подгружать
Если нужны именно внешние библиотеки (.dll), подгружайте их "статически" - не явно.
Не явно, через хидеры для "имен", через спец. команды для линковщика.
А вообще может я и бред несу, "хорош" уже сегодня.
header есть. вот файлы которые в проекте, плюс скрин из предыдущего сообщения, где указаны пути к библиотеке libsqlite3.a

0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
26.10.2022, 17:55
Цитата Сообщение от SergeyAK Посмотреть сообщение
где указаны пути к библиотеке libsqlite3.a
Это для статической линковки.
Наверное придется читать весь тред. ...

Добавлено через 6 минут
Остается непонятным что именно вам нужно.
Использовать библиотеку sqlite динамически ?
Подключаем sqlite3.h, используем функции из нее, без всяких LoadLibrary.
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
26.10.2022, 18:51
Цитата Сообщение от SergeyAK Посмотреть сообщение
да подключена в проект, а когда была не подключена , то LoadLibrary("sqlite3.dll") было недостаточно для работы , вызываемые функции не находились, поэтому была dll подключена в проект.
так ?
Если пользуетесь LoadLibrary, то ничего такого подключать не надо.
Если у вас по какой-то причине не работало - надо разобраться почему.
Сейчас вы все в кучу смешали.

Добавлено через 2 минуты
Цитата Сообщение от SergeyAK Посмотреть сообщение
я так понял что каждую. в итоге я протащил sqlite3_open, sqlite3_prepare
а sqlite3_step- нет
Еще раз. Линкер нашел sqlite3_step в той библиотеке, которую вы подключили в проект. Именно в ней, а не в той, которую вы загрузили через LoadLibrary.
0
2 / 1 / 0
Регистрация: 04.11.2021
Сообщений: 63
27.10.2022, 14:31  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Еще раз. Линкер нашел sqlite3_step в той библиотеке, которую вы подключили в проект. Именно в ней, а не в той, которую вы загрузили через LoadLibrary.
убрал в настройка линкера название библиотеки и путь к ней. закомментировал "непротянутые" функции, отработало успешно. далее раскоментировал и видно что теперь ругается только на "непротянутые".

а в остальном конечно намешали в кучу, все вместе старались.

ниже скриншот
0
2 / 1 / 0
Регистрация: 04.11.2021
Сообщений: 63
27.10.2022, 14:32  [ТС]
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,829
27.10.2022, 15:56
Цитата Сообщение от SergeyAK Посмотреть сообщение
убрал в настройка линкера название библиотеки и путь к ней. закомментировал "непротянутые" функции, отработало успешно. далее раскоментировал и видно что теперь ругается только на "непротянутые".
И какой из этого можно сделать вывод?
0
2 / 1 / 0
Регистрация: 04.11.2021
Сообщений: 63
27.10.2022, 17:10  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
И какой из этого можно сделать вывод?
выводы уже сделал, "раскладываю" каждую процедуру. повторюсь, эта задача для наработки, эффективности использования библиотеку и программного кода - нет -)

Добавлено через 52 минуты
В общем программа моя готова. конечно еще многое можно добавить в качестве проверок, но пусть так.
код ниже. можно и поржать)

используемые файлы см. ниже
sqlite3.dll
libsqlite3.a
sqlite3.h
sqlite3ext.h -шел в архива с сайта разработчика. "расширенный" какой-то.


использование using в качестве определения типа используемой функции - очень понравилось. отдельное спасибо.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
int main()
{
    HMODULE h; //дескриптор функции по типу winAPI
    h=LoadLibrary("sqlite3.dll"); // libsqlite3.a - библиотека
    int rc, rc2;
    const char *dbName= "GRServer.sdb";
 
 
    if (h==NULL)
    {
        cout << "sqlite3.dll not found or there is a download error \n";
        return 0;
    }
 
    sqlite3 *db;
    using  sqlite3_open_t = int(const char *, sqlite3 **); // тип функции  sqlite3_open
 
    sqlite3_open_t* pFunctionOpen; //объявляем указатель pFunction
    pFunctionOpen = (sqlite3_open_t*)GetProcAddress(h, "sqlite3_open");
    rc=pFunctionOpen(dbName, &db);
 
    if (db==NULL)
    {
        cout << "is unable to allocate memory to hold the sqlite3 object \n";
        return 0;
    }
    else
    {
        if(rc==SQLITE_OK)
        {
            cout << "the database " << dbName << " has been opened(created) successfully!\n";
        }
        else
        {
           cout << "an error occurred when opening the database " << dbName << " error_code: " << rc << endl;
           return 0;
        }
    }
 
    using sqlite3_prepare_t = int(sqlite3*, const char*, int, sqlite3_stmt**, const char**);
    sqlite3_stmt *result;
 
    sqlite3_prepare_t* pFuncSelect;
    pFuncSelect = (sqlite3_prepare_t*)GetProcAddress(h, "sqlite3_prepare");
 
    rc=pFuncSelect(db, "select * from 'Order' where id = '00001389400000012245'", -1, &result, NULL);
 
    using sqlite3_cc_t = int(sqlite3_stmt*);
    sqlite3_cc_t* pFuncCountCol;
    pFuncCountCol = (sqlite3_cc_t*)(GetProcAddress(h, "sqlite3_column_count"));
 
    using sqlite3_step_t = int(sqlite3_stmt*);
    sqlite3_step_t* pFuncStep;
    pFuncStep = (sqlite3_step_t*)(GetProcAddress(h, "sqlite3_step"));
 
    using sqlite3_text_t = const unsigned char *(sqlite3_stmt*, int);
    sqlite3_text_t* pFuncText;
    pFuncText = (sqlite3_text_t*)(GetProcAddress(h, "sqlite3_column_text"));
 
    if (rc != SQLITE_OK)
    {
        cout << "function execution error sqlite3_prepare\n";
        return 0;
    }
    else
    {
        int i=0;
        int nCol;
 
        nCol=pFuncCountCol(result);
        cout << "nCol=" << nCol << endl;
 
        while ( pFuncStep(result) == SQLITE_ROW)
            {
                i++;
                for (int j=0; j<= nCol; j++ )
                {
                  cout << "j="<< j<< endl;
                  cout << pFuncText(result, j) << endl;
                }
 
            }
 
 
        cout << i << " lines were output\n";
 
    }
 
    int sqlite3_close(sqlite3*);
    using  sqlite3_close_t = int( sqlite3 **);
 
    sqlite3_close_t* pFunctionClose;
    pFunctionClose = (sqlite3_close_t*)GetProcAddress(h, "sqlite3_close");
    rc=pFunctionClose(&db);
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.10.2022, 17:10

Явная загрузка .dll
Поблема: библиотеку подключил, но внутри никак не найду функцию HMODULE hLibrary = 0; hLibrary = LoadLibrary(&quot;MyDll.dll&quot;); ...

Явная загрузка DLL
Господа начал изучать , первая программа и проблема , буду признателен за помощь . вот кот dll #include &quot;dll.h&quot; #include...

явная загрузка dll
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;tchar.h&gt; HMODULE p_dll = LoadLibrary(L&quot;create_dll.dll&quot;); ...

Явная загрузка DLL
Доброго дня всем! Мне надо сделать явную подгрузку dll в проекте и использовать с нее некую функцию (например FormMatrix() ). Эта...

Явная загрузка DLL из ДРУГОЙ DLL
Помогите явно загрузить DLL из исходной DLL Исходная DLL Unit1.h HINSTANCE dllInstance2; typedef int(__import *FType(int)); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
48
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru