PDA

Ver la Versión Completa : Ruta para tomar Dlls


cesar_picazo
02-07-2005, 17:35:09
Bujenas tardes, Estoy utilizando delphi 6 y estoy utilizando varias DLLs.


Al agregar una libreria mi aplicacion fallo, esto debido a que la DLL midas no se encuentra en el directorio system32, anteriormente con solo contar con esta libreria en la ruta de mi ejetuble era suficiente. Pero al utilizar otra libreria ya no busca la Dll en la ruta de mi exe.

Me imagino que existe alguna forma de decirle a mi exe que busque dicha dll en la ruta de mi exe.

Alguien sabe como establecer la ruta de donde se van a tomar las librerias?

Ya verifique el currentedir(); y esta es la misma que la de mi exe.

Les agradesco su ayuda.

dec
02-07-2005, 17:51:32
Hola,

¿Probaste con "LoadLibrary"? Lo siguiente es un extracto del ejemplo que viene en la ayuda de Delphi para esta función:


var
Time: TTimeRec;
Handle: THandle;
GetTime: TGetTime;
...
begin
Handle := LoadLibrary('libraryname');
if Handle <> 0 then
begin
@GetTime := GetProcAddress(Handle, 'GetTime');

if @GetTime <> nil then
begin
GetTime(Time);
with Time do
WriteLn('The time is ', Hour, ':', Minute, ':', Second);
end;
FreeLibrary(Handle);
end;
end;


Actualización: Evidentemente, no te respondo a lo que preguntas... puesto que, después de leer tu pregunta con más atención, una cosa no tiene que ver con la otra... o no del todo.

Respondería lo que ya sabes, a lo que se ve: que el programa tendría que tratar de localizar las "DLLs" en el directorio donde se encuentre; si no las encuentra allí buscarlas entonces en el directorio de Windows; creo que también en los directorios System y System32 del mismo directorio de Windows.

No sé... se me hace raro... si supiera cómo haces uso del archivo DLL, esto es, si llamas a alguna función en concreto, o si declaras funciones externas implementadas en alguna DLLs...

Pero me voy por los cerros de Úbeda. Porque si usaras esto último podría hacerse algo así:


procedure DoSomething; external 'MYLIB.DLL';


Y ahí ya se está dando la posibilidad de indicar dónde encontrar la DLL en cuestión para el procedimiento declarado.

O si usaras la DLL puntualmente, para lo cual podría valerte la función "LoadLibrary" indicada arriba, junto con sus "compañeras", pero esto tú ya lo sabrás... no sé a qué me canso cansándote.

Como ves, yo también estaré atento a quien pueda arrojar luz sobre este asunto. Lamento este rollo.

cesar_picazo
02-07-2005, 21:35:42
Hola, gracias por la respuesta, de hecho tambien uso algunas librerias y hago lo que tu me dices, pero porque conosco las funciones y procedimientos del mismo.

Pero en el caso de la DLL midas desconosco completamente las funciones de la libreria y ademas para agregar una libreria con loadlibrary, se me hace mucho rollo, ya que por una funcion que no prototipe bien o escriba correctamente fallaria.

Estuve viendo opciones para solucionar el problema, si no hay alguien que conosca que hacer lo que tendre que hacer es lo siguente.
Opciones
1- copiar la libreria Midas a la carpeta del sistem32 y evitar el error.
2- Es ver si agrego la libreria midas a la aplicacion aplicacion aunque aumente de tamaño el Exe.

Pero si alguien conoce alguna forma de hacerlo pues me ahorro hacer lo anterior.

dec
02-07-2005, 23:06:10
Hola,

Yo tengo entendido (creo que lo he dicho más arriba) que Windows "busca" primero en el directorio del programa, a continuación en Windows, luego en System y más allá en System32 por los recursos que necesita y no encuentra a bote pronto: recursos es mucho decir... en este caso se nota también mi estulticia, que es infinita.

Sin embargo, se me ocurrió algo cuando te he leído este último comentario que has escrito, como si se me hubiera encendido una bombilla, así que no me hagas mucho caso: ¿Y si existiera ya una librería igual a la que precisas, pero tal vez de distinta versión, en el directorio de Windows, o en System, o en System32?

¿No sería posible que por algo así Windows se volviera un poco "loco" y no supiera bien hacia dónde tirar, esto es, de qué librería trata? No sé, que hubiera una especie de conflicto de ese tipo. Supongo que no es esto, pero, es lo que se me ocurre y, por si sirve de algo quedo dicho.

Por cierto, que sí, que llevas razón, vamos, que lo de "LoadLibrary" o las declaraciones de "funciones externas" no tiene que ver con lo que nos ocupa, seguro, vamos, fue que escribí lo primero que pensé, si es que a lo que yo hago se le puede llamar así.

cesar_picazo
04-07-2005, 18:19:39
Gracias por la respuesta, estoy utilizando DbExpress para conectarme a DBs Firebird, pero por estuve buscando una libreria para compactar informacioncion y me encontre una que se llama ZIP Master, lo cual ya hace la aplicacion sin ningun problema. Pero en algun punto se pierde la ruta en donde esta la DLLs de midas. Depurando la aplicacion lo que hice fue borrar la DLLs de midas del directorio System32 para poder emular el error en mi SO en donde esta instalado Delphi.

Me supongo que la DLL hace algo para que estas rutas se cambien.

Nota: el Getcurrentdir(); me sigue regresando la ruta de la aplicacion.

Lo que hice para solucionar el problema fue quitar la dll de compactacion y voy a enseñarme a hacer DLLs para desde una DLL ejecutar el proceso de compactacion.

Por tu ayuda y comentarios gracias