Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error uso de sqlite3.dll por Zeos (https://www.clubdelphi.com/foros/showthread.php?t=79739)

Sapiem 06-08-2012 15:10:20

Error uso de sqlite3.dll por Zeos
 
Saludos:
Resulta que teniendo una sqlite3.dll en las carpetas del sistema (windows, system32, etc) tiene prioridad que la propia distribuida en nuestra aplicación que normalmente ponemos en la carpeta de nuestra app. Me he dado cuenta de esto puesto que la que tengo en la carpeta de mi app es la última de la distro del original sitio sqlite.com pero sin embargo cuando llamo la función para ver la versión (usando delphi, claro está) me informa que la versión es inferior, y esta corresponde con las dll distribuidas por otras aplicaciones como Opera, Adobe, etc ya previamente instaladas.

Cómo puedo obligar a Zeos a que utilice la dl que está en la carpeta de mi app y no en la que encuentre por defecto en las carpetas del sistema?

Gracias

Casimiro Notevi 06-08-2012 16:18:08

En el título que has puesto (Error uso de sqlite3.dll por Zeos) haces mención a un error, ¿cual es?

roman 06-08-2012 19:03:08

El comportamiento que mencionas es raro porque, usualmente, el directorio de la aplicación tiene prioridad sobre cualquier otro directorio.

Como alternativa, lo único que se me ocurre es que coloques esta unidad en tu aplicación (pones la ruta adecuada en SQLite3DllLocation):

Código Delphi [-]
unit SqliteLoader;

interface

implementation

uses ZPlainSqlite3, ZPlainLoader;

const
  SQLite3DllLocation = 'c:\ruta\a\la\biblioteca\sqlite3.dll';

type
  {** Implements a loader for SQLite native library. }
  TZSQLiteNativeLibraryLoader = class(TZNativeLibraryLoader)
  public
    function Load: Boolean; override;
  end;

{ TZSQLiteNativeLibraryLoader }

function TZSQLiteNativeLibraryLoader.Load: Boolean;
begin
  Result := inherited Load;

{!}        @sqlite_open                   := GetAddress('sqlite3_open');
{!}        @sqlite_close                  := GetAddress('sqlite3_close');
{!}        @sqlite_column_count           := GetAddress('sqlite3_column_count');
{!}        @sqlite_column_bytes           := GetAddress('sqlite3_column_text');
{!}        @sqlite_column_name            := GetAddress('sqlite3_column_name');
{!}        @sqlite_column_decltype        := GetAddress('sqlite3_column_decltype');
{!}        @sqlite_exec                   := GetAddress('sqlite3_exec');
{!}        @sqlite_last_insert_rowid      := GetAddress('sqlite3_last_insert_rowid');
{!}        @sqlite_changes                := GetAddress('sqlite3_changes');
{!}        @sqlite_errmsg                 := GetAddress('sqlite3_errmsg');
{ ?-       @sqlite_last_statement_changes := GetAddress('sqlite3_last_statement_changes');}
{!}        @sqlite_interrupt              := GetAddress('sqlite3_interrupt');
{!}        @sqlite_complete               := GetAddress('sqlite3_complete');
{!}        @sqlite_busy_handler           := GetAddress('sqlite3_busy_handler');
{!}        @sqlite_busy_timeout           := GetAddress('sqlite3_busy_timeout');
{!}        @sqlite_get_table              := GetAddress('sqlite3_get_table');
{!}        @sqlite_free_table             := GetAddress('sqlite3_free_table');
{!}        @sqlite_freemem                := GetAddress('sqlite3_free');
{!}        @sqlite_libversion             := GetAddress('sqlite3_libversion');
{ ?-       @sqlite_libencoding            := GetAddress('sqlite3_libencoding');
{ ?-       @sqlite_create_function        := GetAddress('sqlite3_create_function');}
{ ?-       @sqlite_create_aggregate       := GetAddress('sqlite3_create_collation');}
{ ?-       @sqlite_function_type          := GetAddress('sqlite3_function_type');
{!}        @sqlite_set_result_string      := GetAddress('sqlite3_result_string');
{!}        @sqlite_set_result_int         := GetAddress('sqlite3_result_int');
{!}        @sqlite_set_result_double      := GetAddress('sqlite3_result_double');
{!}        @sqlite_set_result_error       := GetAddress('sqlite3_result_error');
{!}        @sqlite_user_data              := GetAddress('sqlite3_user_data');
{!}        @sqlite_aggregate_context      := GetAddress('sqlite3_aggregate_context');
{!}        @sqlite_aggregate_count        := GetAddress('sqlite3_aggregate_count');
{!}        @sqlite_set_authorizer         := GetAddress('sqlite3_set_authorizer');
{!}        @sqlite_trace                  := GetAddress('sqlite3_trace');
{!}        @sqlite_compile                := GetAddress('sqlite3_prepare');
{!}        @sqlite_step                   := GetAddress('sqlite3_step');
{!}        @sqlite_finalize               := GetAddress('sqlite3_finalize');
{!}        @sqlite_reset                  := GetAddress('sqlite3_reset');
{ ?-       @sqlite_bind                   := GetAddress('sqlite3_bind');}
{!}        @sqlite_progress_handler       := GetAddress('sqlite3_progress_handler');
{!}        @sqlite_commit_hook            := GetAddress('sqlite3_commit_hook');
{ ?-       @sqlite_open_encrypted         := GetAddress('sqlite3_open_encrypted');}
{!}        @sqlite_rekey                  := GetAddress('sqlite3_rekey');
{!}        @sqlite_key                    := GetAddress('sqlite3_key');
end;

initialization
  if Assigned(ZPlainSqlite3.LibraryLoader) then
    ZPlainSqlite3.LibraryLoader.Free;

  ZPlainSqlite3.LibraryLoader :=
    TZSQLiteNativeLibraryLoader.Create([SQLite3DllLocation]);
end.

Básicamente, esta unidad "copia" lo que hace la unidad ZPlainSqlite3 que es donde se carga la biblioteca de sqlite.

// Saludos

roman 06-08-2012 19:12:43

Otra forma, menos drástica que la anterior:

Importas la función SetDllDirectory (al menos en Delphi 7 no está importada, posiblemente en versiones posteriores ya lo esté)

Código Delphi [-]
function SetDllDirectory(lpPathName: LPCTSTR):LongBool; stdcall; external 'kernel32.dll' name 'SetDllDirectoryA';

Y, antes de abrir la conexión, la usas para agregar el directorio deseado a la búsqueda de dllls:

Código Delphi [-]
SetDllDirectory('c:\rura\a\la\biblioteca\');

Tal como dice la documentación de SetDllDirectory, la ruta que pongas tendrá preferencia sobre cualquier otra, excepto la de la aplicación.

// Saludos

Sapiem 09-08-2012 17:21:58

Gracias por las respuestas
 
Saludos.

A mi también me sorprende que ocurra esta situación con la dll de la misma carpeta, pero lo probé en varias ocasiones, incluso en una PC Virtual virgen que tengo y entonces es como único reconoce la dll de la carpeta, puesto que en el sistema no hay ninguna.

Ok, trataré de utilizar ambas variantes. Ya me había metido en la unidad que mencionas, pero no me atreví a modificar nada.

Sobre la segunda variante, me preocupa que estableciendo esta dirección como preferencial, las app no me quieran reconocer otras dll del sistema que usamos cotidianamente y quizás no nos demos cuenta que se usan (printers, etc). Aunque no creo que esto sea una limitación, pues si no encuentra nada en mi carpeta, saltaría entonces para la del sistema, pienso que sea así..

Muchas gracias

Luego les comento como me fue.

Sapiem 09-08-2012 17:31:08

Se me olvidó decirles que ahora estoy usando el ZEOSDBO-7.0.0-alpha

Muchas gracias

ElMug 13-08-2012 20:01:48

Esta alternativa, simple, tal vez te funcione, Sapiem:

Pongo esto como primera linea en onFormCreate:

////SQLITE3 VERSION ...........................
SQLiteLibraryName:='sqlite3.dll';
////...........................................

y como no tiene "path", usa el sqlite3.dll que esta en el directorio del proyecto, y es el mismo .dll que acompaña al .exe resultante, tambien en su mismo folder.

Tambien tengo el mismo .dll en el folder donde esta instalado Lazaro (en mi caso).

Si quieres aun mas control, le puedes cambiar el nombre al .dll (en la aplicacion) siempre y cuando coincida con el nombre en el codigo mostrado.

roman 14-08-2012 01:44:36

¿Dónde está declarada la variable SQLiteLibraryName?

// Saludos

ElMug 14-08-2012 02:38:06

Cita:

Empezado por roman (Mensaje 439536)
¿Dónde está declarada la variable SQLiteLibraryName?

// Saludos


Es interna en Lazarus. No tengo que declararla antes. Tal vez sea parte de instalar el paquete SQlite3.

roman 14-08-2012 03:29:56

Es que a mi me da el error "Identifier not found"

// Saludos

ElMug 14-08-2012 03:53:53

Cita:

Empezado por roman (Mensaje 439540)
Es que a mi me da el error "Identifier not found"

// Saludos

En delphi o en Lazarus?

En Lazarus, realmente es una propiedad de SQLite3.Connection, pero no es visible en diseño.

Asi que lo que mencione, depende de que se use ese componente.

Me interesa saber que componente usan para la conexion con SQLite3, si viene ya en Delphi, o es externo, pues me intersaria probar otros, si acaso no sea ese componente el que me cause ciertos prolbemas.

roman 14-08-2012 20:11:00

Sí, ya vi. Está definida en la sección interface de la unidad sqlite3conn. Pero esto es para los componentes que vienen con Lázarus, no sirve para Zeos. La variable equivalente en zeos está definida en una sección implementation por lo que no puede modificarse.

// Saludos

Sapiem 16-08-2012 16:07:11

Sobre SQLiteLibraryName
 
Entonces no hay SQLiteLibraryName o algo similar para Delphi, porque me interesa eso de poder también asignarle otro nombre a la dll.


La franja horaria es GMT +2. Ahora son las 06:06:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi