Как в Delphi подключить к проекту драйвер базы данных SQLite3 Multiple Ciphers?
Этот вопрос в продолжение этой темы: Как подключить к проекту драйвер базы данных SQLite3 Multiple Ciphers?
Прошу помочь подключить к проекту драйвер базы данных SQLite3 Multiple Ciphers. Использую Windows 11 x64, Delphi 12 CE, драйвер sqlite3mc-2.2.4-sqlite-3.50.4-icu-win64. В архиве в папке dll файл sqlite3mc_icu_x64.dll.
Дело в том, что не получается загрузить 5 библиотек из папки bin, как это получилось сделать в Lazaruse (ссылку см. выше). Вот код проекта:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, FireDAC.Stan.Intf, FireDAC.Stan.Option,
FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Stan.Param,
FireDAC.DatS, FireDAC.DApt.Intf, FireDAC.DApt, FireDAC.VCLUI.Wait,
FireDAC.Stan.ExprFuncs,
FireDAC.Phys.SQLiteDef, FireDAC.Phys.SQLite, FireDAC.Comp.UI,
FireDAC.Comp.Client, Data.DB, FireDAC.Comp.DataSet,
FireDAC.Phys.SQLiteWrapper.Stat;
type
TForm1 = class(TForm)
FDConnection1: TFDConnection;
FDTransaction1: TFDTransaction;
FDQuery1: TFDQuery;
FDGUIxWaitCursor1: TFDGUIxWaitCursor;
FDPhysSQLiteDriverLink1: TFDPhysSQLiteDriverLink;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure ConnectWithSqlite3Dll;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.FormShow(Sender: TObject);
begin
ConnectWithSqlite3Dll;
end;
procedure TForm1.ConnectWithSqlite3Dll;
const
LIB_NAME = 'sqlite3mc_icu_x64.dll';
DB_NAME = 'test.db';
// наименование dll и порядок важен!
ICU_DLLs: array[0..4] of String = (
'icudt77.dll',
'icuuc77.dll',
'icuin77.dll',
'icuio77.dll',
'icutu77.dll'
);
var
hDll: HMODULE;
LibPath, icu: string;
begin
LibPath := ExtractFilePath(ParamStr(0)) + 'libs\Win64\';
//загрузка необходимых библиотек
for icu in ICU_DLLs do
begin
FreeLibrary(GetModuleHandle(PChar(icu)));
hDll := LoadLibrary(PChar(LibPath + icu));
if hDll = 0 then
raise Exception.Create('Не удалось загрузить: ' + icu);
end;
// Настраиваем драйвер
FDPhysSQLiteDriverLink1.DriverID := 'SQLite';
FDPhysSQLiteDriverLink1.VendorLib := LibPath + LIB_NAME;
// Альтернативный способ указания динамической библиотеки
FDConnection1.Params.Clear;
FDConnection1.Params.DriverID := 'SQLite';
FDConnection1.Params.Database := DB_NAME;
// Проверка версии
FDQuery1.SQL.Text := 'SELECT sqlite_version() AS version';
FDQuery1.Open;
ShowMessage('SQLite version: ' + FDQuery1.FieldByName('version').AsString);
end;
end.
Пояснения:
- в папке 'libs\Win64' находятся 6 dll-файлов:
- 'sqlite3mc_icu_x64.dll',
- 'icudt77.dll',
- 'icuuc77.dll',
- 'icuin77.dll',
- 'icuio77.dll',
- 'icutu77.dll';
- в компоненте FDPhysSQLiteDriverLink1 свойство EngineLinkage обязательно выставить в slDynamic;
- свойство Transaction компонента FDConnection1 выставлено в FDTransaction1;
- свойство Connection компонента FDQuery1 выставлено в FDConnection1.
В рантайме получаю следующую ошибку:
Project Project1.exe raised exception class Exception with message 'Не удалось загрузить: icuuc77.dll'.
То есть первая библиотека 'icudt77.dll' из массива ICU_DLLs успешно загрузилась, а вторая - нет. Менял порядок загрузки библиотек - бесполезно.
Собственно, вопрос, как правильно использовать динамическую линковку для SQLite3 Multiple Ciphers?