Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Paths de la aplicacion (https://www.clubdelphi.com/foros/showthread.php?t=55467)

cascarrabias 17-04-2008 17:21:25

Paths de la aplicacion
 
Buen dia, seguramente esto es sencillo pero no pude dar con informacion sobre esto en los foros, pues resulta que mi aplicaction utiliza los componentes zeos para la conexion a bdd postgre , para esto...zeos necesita algunas dll, las cual o bien se pueden poner en las carpetas del sistema o en su defecto en la misma carpeta del ejecutable.... de cualquiera de estas dos maneras no ha problema alguna, ahora bien, si digamos dentro de la carpeta donde esta mi ejecutable, creo una carpeta que se llame 'lib' y meto alli las dll, mi aplicacion dice que no las encuentra, la pregunta es como agrego esta path entonces a mi aplicacion??? " ..\lib " .

Gracias

Caro 17-04-2008 17:24:37

Hola cascarrabias, con ExtractFilePath obtienes el path donde se esta ejecutando tu aplicación.

Código Delphi [-]
 path:= ExtractFilePath(Application.ExeName)+'lib\';
Saluditos

Neftali [Germán.Estévez] 17-04-2008 17:44:51

Cita:

Empezado por cascarrabias (Mensaje 280770)
la pregunta es como agrego esta path entonces a mi aplicacion??? " ..\lib " .

En todo caso deberás añadir ese directorio al path del sistema.
Busca/Revisa sobre variables de entorno.

Revisa SetEnvironmentVariable.

roman 17-04-2008 18:55:18

Hola,

Pienso que añadir la ruta al PATH puede no ser la mejor opción puesto que pueden existir otras librerías que entren en conflicto con la que nos proponemos usar y que se encuentren antes que la nuestra en el path. Por decir algo, acabo de hacer una búsqueda por libmysql.dll y he encontrado por lo menos ocho copias en mi sistema, varias de la cuales se encuentran en directorios del PATH.

Lo ideal, creo yo, sería cargar manualmente la librería de manera que podamos especificar explícitamente la ruta. Sumergiéndome un poco en el código de ZEOS, he visto que cada driver se implementa en una unidad del tipo ZPlainXXXXX, y en la inicialización de cada una de estas unidades se instancia un objeto Loader que es el que se encarga de cargar las librerías correspondientes al driver. Por ejemplo, para MySQL5 se ve algo similar a esto:

Código Delphi [-]
LibraryLoader := TZMySQLNativeLibraryLoader.Create(
  [WINDOWS1_DLL_LOCATION, WINDOWS2_DLL_LOCATION);

El parámetro del constructor es una lista de librerías a buscar, en este caso, libmysl.dll y libmysql5.dll, pero no veo una manera limpia de agregar librerías a este constructor.

Entonces, y para no alterar el código fuente de ZEOS, he probado esto:

1. Asegurarnos de que la aplicación no intente conectar automáticamente al inicio. Para ello basta poner ZConnection.Active en false en el inspector de objetos.

2. Hacer explícitamente la conexión al inicio, cepillándonos el Loader de la inicializacion de ZPlainXXXXX y creándonos el nuestro:

Código Delphi [-]
uses ZPlainMySQL5

procedure Conectar;
var
  AppPath: String;

begin
  AppPath := ExtractFilePath(Application.ExeName);

  if Assigned(ZPlainMySQL5.LibraryLoader) then
    ZPlainMySQL5.LibraryLoader.Free;

  ZPlainMySQL5.LibraryLoader := TZMySQLNativeLibraryLoader.Create([AppPath + 'lib\libmysql.dll']);
  ZConnection1.Connect;
end;

Al parecer funciona aunque no he probado más a fondo. En el caso de Postgres habría que sustituir ZPlainMySQL5 por ZPlainPostgreSql87 o ZPlainMySQL58, según la versión que se use.

// Saludos

cascarrabias 17-04-2008 19:08:35

ok
 
Cita:

Empezado por Caro (Mensaje 280772)
Hola cascarrabias, con ExtractFilePath obtienes el path donde se esta ejecutando tu aplicación.

Código Delphi [-] path:= ExtractFilePath(Application.ExeName)+'lib\';

Saluditos

Gracias a todos, si bien, creo que no me he dado ha entender....miren...si me llevo mi ejecutable a una maquina ajena a la mia, al ejecutar mi aplicacion me pide las dll, si estas estan en el mismo directorio del ejecutable, no hay problema y mi aplicacion funciona correctamente, ahora pasa que yo las quiero meter ahi mismo pero dentro de una subcarpeta, entonces, ya no me toma en cuenta ...es como si no las tuviera, entonces una solucion es aventarlas en la carpeta del sistema, pero como dije, yo deseo ponerla en mi subcarpeta de donde esta el ejecutable, que codigo necesito agregar a mi aplicacion(antes de comilar) para que busque la libreria en la subcarpeta, espero haberme dado a entender esta vez, y gracias a todos!

cascarrabias 17-04-2008 19:15:11

Cita:

Empezado por roman (Mensaje 280805)
Hola,

Pienso que añadir la ruta al PATH puede no ser la mejor opción puesto que pueden existir otras librerías que entren en conflicto con la que nos proponemos usar y que se encuentren antes que la nuestra en el path. Por decir algo, acabo de hacer una búsqueda por libmysql.dll y he encontrado por lo menos ocho copias en mi sistema, varias de la cuales se encuentran en directorios del PATH.

Lo ideal, creo yo, sería cargar manualmente la librería de manera que podamos especificar explícitamente la ruta. Sumergiéndome un poco en el código de ZEOS, he visto que cada driver se implementa en una unidad del tipo ZPlainXXXXX, y en la inicialización de cada una de estas unidades se instancia un objeto Loader que es el que se encarga de cargar las librerías correspondientes al driver. Por ejemplo, para MySQL5 se ve algo similar a esto:

Código Delphi [-]LibraryLoader := TZMySQLNativeLibraryLoader.Create(
[WINDOWS1_DLL_LOCATION, WINDOWS2_DLL_LOCATION);


El parámetro del constructor es una lista de librerías a buscar, en este caso, libmysl.dll y libmysql5.dll, pero no veo una manera limpia de agregar librerías a este constructor.

Entonces, y para no alterar el código fuente de ZEOS, he probado esto:

1. Asegurarnos de que la aplicación no intente conectar automáticamente al inicio. Para ello basta poner ZConnection.Active en false en el inspector de objetos.

2. Hacer explícitamente la conexión al inicio, cepillándonos el Loader de la inicializacion de ZPlainXXXXX y creándonos el nuestro:

Código Delphi [-]uses ZPlainMySQL5

procedure Conectar;
var AppPath: String;

begin AppPath := ExtractFilePath(Application.ExeName); if Assigned(ZPlainMySQL5.LibraryLoader) then ZPlainMySQL5.LibraryLoader.Free; ZPlainMySQL5.LibraryLoader := TZMySQLNativeLibraryLoader.Create([AppPath + 'lib\libmysql.dll']);
ZConnection1.Connect;
end;


Al parecer funciona aunque no he probado más a fondo. En el caso de Postgres habría que sustituir ZPlainMySQL5 por ZPlainPostgreSql87 o ZPlainMySQL58, según la versión que se use.

// Saludos


Gracias Roman.....hare unas cuantas pruebas haber si lo logro hacer!

MAXIUM 21-04-2008 16:58:32

Estoy en la duda sobre que sera más optimo:

Código Delphi [-]
 path:= ExtractFilePath(Application.ExeName)+'lib\';
ó
Código Delphi [-]
 path:= GetCurrentDir+'lib\';

cascarrabias 22-04-2008 01:18:27

gracias
 
Gracias...sigo trabajando en lo que me comento roman ya que no lo pude lograr para postgre....gracias de nuevo roman y saludos


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

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