![]() |
DLLs con nombre desconocido
Hace cosa de una semana (o un poco más) pregunté cómo llamar a funciones de DLLs cuyo nombre desconozco. La respuesta de seoane me sirvió mucho, pero no me lo solucionó del todo, ya que una de las funciones a las que llamo mantiene una ventana abierta, por lo que no puedo llamar a FreeLibrary en la misma función, sino de otra forma.
Tras hacer varias pruebas y ojear el archivo MAPI.PAS que se encuentra en DELPHI\Source\RTL\WIN\ (al menos en la versión que tengo) logré llegar a una solución. Primero en type declaro los tipos de función que voy a necesitar. Después coloco una variable global para el manejador de la DLL, y todas las variables necesarias para almacenar todas las funciones. Todo tiene que estar inicializado. Creo un procedimiento que inicialice la DLL, a la que puedo llamar por ejemplo cuando cree la ventana, y otra que la libere cuando la cierre. Ya por último declaro todas las funciones que necesite. También quiero aclarar que en la respuesta de seoane se produce un error de acceso a memoria después de llamar a FreeLibrary. Es una cosa muy rara, porque después puse la línea ShowMessage('Se liberó') y el mensaje se mostraba, y acto seguido salía el error. Bueno, aunque parezca que lo he solucionado sigo teniendo una gran duda. Y es que HandleDLL almacena el manejador de una libraría, pero yo voy a tener varias librerías, y todas van a tener que estar cargadas a la vez, por lo que no puedo liberar una y cargar otra. Como los nombres de las librerías los almaceno en un TStringList se me ha ocurrido crear un objeto que almacene un array de integers para almacenar en cada uno de ellos el Handle de cada librería. Si me sale bien lo pondré aquí, pero si alguien me puede ayudar agradeceré muchísimo la respuesta. |
Lo Tengooooooooooooooooooooooooooo
¡¡¡Lo logré!!!
Primero creé un tipo de objeto parecido al TStrinList, pero que almacena integers en vez de strings. Aquí está el código de la unidad: Después creé un par de DLLs de ejemplo, con tres funciones que devuelven el nombre de la misma, la versión y el nombre del programador. Para comprobar que funcionaban, en un nuevo proyecto coloqué un TListView con cuatro columnas (Archivo, nombre, versión, autor). En ella se tendría que listar el nombre de las DLLs encontradas en el directorio de la aplicación y el resultado de las funciones GetName, GetVersion y GetAuthor de las librerías de ejemplo que hice. Además, las cargo al inicio del programa y las libero al final. Aquí está el códido del programa: Espero que esto le sirva de ayuda a alguien. |
Hola,
Je, je, je... bueno. Seguro que lo que dices le sirve de ayuda a más de una persona, estoy seguro. A mí lo que me llamó la atención es que planteases un problema y dieras con la solución (y qué solución) en menos de un minuto. ¡Todo un record de capacidad de respuesta! ¡Cuéntanos cómo lo haces! :D :D :D Y, en todo caso, gracias por compartir la información con nosotros. Quiero terminar diciendo que existe un apartado de Trucos en el ClubDelphi en donde tal vez podrías guardar este Hilo, si bien con algunos cambios, para que quedara allí también a disposición de a quien le pudiera hacer menester. ;) |
un poquito de trampa
:rolleyes: La verdad es esta::rolleyes:
No tengo Internet en casa:( . Voy alguna tarde a un ciber:D . La pregunta me la planteé en un cierto momento, y estuve como una hora seguida sin parar de teclear, y corregir :mad: ... Ahora he puesto la pregunta y la respuesta por separado para si alguien ve el título, que no lo vea sin respuestas:cool: . Buena observación ;) |
Veo que usas un TListView para obtener la lista de DLL's. Como la clase TListItem tiene una propiedad llamada Data, ahí podrías guardar el Handle de la DLL, así te evitas crear la clase TIntegers.
Aquí te pongo parte de tu código usando la propiedad Data de TListItem:
Saludos... |
Cita:
Gracias. |
La franja horaria es GMT +2. Ahora son las 08:28:58. |
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