![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
#1
|
|||
|
|||
Acceso a DLL
Hola.
Estoy desarrollando un motor para jugar a las damas españolas http://www.terra.es/personal9/aggg63/damas/damas.htm con la interficie CheckerBoard http://www.fierz.ch/checkers.htm de Martin Fierz. Ed Gilbert ha desarrollado una DLL que accede a las bases de datos de finales de las damas americanas http://pages.prodigy.net/eyg/Checkers/egdb_rev3.zip. He creado un pequeño programa que intenta acceder a las bases de datos, pero no me carga bien las funciones que exporta la DLL. A continuacion teneis un resumen de las unidades que uso. La primera funcion me identifica la base de datos pero cuando intento abrir un handle con la segunda, me da un error. ¿Alguien puede ayudarme un poco? Gracias.
Última edición por dec fecha: 03-09-2005 a las 17:19:21. Razón: (Encerrar el código en la etiqueta DELPHI) |
#2
|
|||
|
|||
Correccion a las unidades
Eliminar la linea
HandleDLL:=LoadLibrary('egdb.dll'); del procedimiento procedure TForm1.btnIdentificarTFClick(Sender:TObject); Disculparme, estoy usando 2 formas de acceder a la libreria y se ha colado codigo que no uso ahora. |
#3
|
||||
|
||||
Hola,
aggg63, he editado tu mensaje para encerrar el código fuente dentro de la etiqueta [ DELPHI ]. Por favor, en sucesivas ocasiones utiliza dicha etiqueta, pues, como puedes apreciar, el código fuente pasa a ser más legible, al menos. ¿Cómo puedes hacer uso de la etiqueta [ DELPHI ]? Así: [ DELPHI ] // Tu código fuente aquí [ DELPHI ] Observa que incluyo espacios dentro de la etiqueta porque de no ser así no podría explicarte su uso. Tampoco estaría demás, aparte de lo dicho, que echaras un vistazo a la guía de estilo de los Foros, fíjate en el apartado "Títulos descriptivos para los mensajes". Por otra parte sé bienvenido. |
#4
|
||||
|
||||
intenta esto:
y la funcion freeLibrary usala solo cuando estes seguro que no vas a volver a hacer una llamada a loadlibrary de esa DLL sino resultará en una violación de acceso |
#5
|
|||
|
|||
Acceso a DLL, errores al cargar funcion
Hola.
He probado casi todas las opciones stdcall, cdecl, safecall, etc. Sigue sin funcionar cuando intento acceder a la funcion HandleEGDB. No soy un experto en Delphi, siento insistir en el problema. Para aclarar ideas he desarrollado 2 versiones del programa. Una carga la libreria estaticamente y otra la carga dinamicamente. En separados mensajes pongo los codigos de ambas versiones. La unidad comun uTiposEGDB esta en otro mensaje para no cargar demasiado este. Si esta permitido, puedo enviar 2 ficheros zip con todos los ficheros de los proyectos. Ocupan unos 70KB por proyecto, sin los ficheros de las bases de datos que consulta la libreria. Estos se encuentran en CheckerBoard o en KingsRow. Gracias dec por la modificacion y por la sugerencia. Sin embargo, he consultado la guia de estilo y no he encontrado referencias a la la etiqueta DELPHI. Creo que seria conveniente poner una lista de las etiquetas permitidas. Algo que si que está en la FAQ, pero con la referencia CODE de VB. Ademas, antes de enviar la consulta, investigue si alguien habia hecho alguna referencia a errores de este tipo buscando hilos sobre DLL, pero en los que vi, no habia codigo que pudiese darme una pista para poner el mio bien formateado. Gracias por la ayuda. Última edición por aggg63 fecha: 04-09-2005 a las 20:55:47. |
#6
|
|||
|
|||
Unidad estatica
|
#7
|
|||
|
|||
Unidad dinamica
Última edición por aggg63 fecha: 04-09-2005 a las 20:57:23. |
#8
|
|||
|
|||
Unida comun
|
#9
|
||||
|
||||
Saludos aggg63!
Te aconsejo identar un poco el código para que sea más legible y, sobretodo, que, en vez de crear varios hilos, comprimas las fuentes que quieres mostrar en un .zip y lo adjuntes al hilo, porque sino se hace muy dificil analizar tu problema. (Para poder adjuntar un archivo al hilo, pulsa sobre el boton "Responder" y busca en la parte inferior el bóton "Administrar Adjuntos", el cual te permitirá subir un archivo al foro). Chao! Última edición por jmariano fecha: 05-09-2005 a las 01:43:45. |
#10
|
||||
|
||||
bueno te aconsejo leer esta pagina con la cual aprendí sobre las DLL con ejemplo y todo, puede que por ahi te falte una @:http://www.delphi-central.com/dynamicdll.aspx
ahora con las DLL hay problemas que a veces son dificiles de entender hace poco hice una DLL que cargaba un TForm, cuando la llamaba desde mi aplicacion desde el explorer corria sin problemas, pero cuando otra q usaba winexec para llamar a mi aplicacion simplemente colgaba la maquina, asi que tuve q pasar a shellExecute, prueba con crearte una app pequeña y trata de ejecutar la llamada |
#11
|
|||
|
|||
Unidades para acceder a la DLL
Gracias droguerman por la sugerencia pero sigue sin funcionar. He recibido confirmacion del autor de la dll que todas las llamadas son cdecl y no stdcall. Sin embargo, he probado combinaciones y no funciona. Le he pedido que haga una dll sin la funcion que devuelve un menaje a ver si asi aislamos el problema. Estoy a la espera. De momento envio un fichero zip con 3 unidades que llaman a la dll de 3 maneras distintas, si alguien puede echarle un vistazo, estaria agradecido.
|
#12
|
||||
|
||||
Este hilo es muy largo y quizá me he saltado algo pero creo que hasta ahora no has mencionado cuál es el error que te dá excepto la mención original de "no me carga bien las funciones que exporta la DLL" pero supongo que sí las carga ya que verificas el resultado de GetProcAddress.
Además del convenio de llamada, ¿has revisado la forma en que declaras el encabezado? Es decir, en
¿estás seguro que el último parámetro debe ser así? Según la declaración de TFMensajes:
infiero que el último parámetro es una función pero a juzgar por otras declaraciones en Delphi de la API de Windows, cuando un parámetro es una función, lo declaran como LongInt y luego hacen un moldeo para acceder a la función, es decir, que en ese tipo de parámetros reciben la dirección (LongInt) de la función. Bueno, a lo mejor no tiene nada que ver pero igual te da una idea. // Saludos |
#13
|
|||
|
|||
Cambiar funcion por direccion
Hola.
El error que obtengo es: "Access violation at address 00000000. Write of address 00000000" al ejecutar la linea: Código:
HandleEGDB:=AbrirTablaFinalesEGDB_NORMAL,piezas,30,directorio,FMensajes); Intentare hacer unas pruebas y averiguar algo mas. Gracias por la sugerencia. Cita:
|
#14
|
||||
|
||||
Dime una cosa; este parámetro del que hablamos, ¿es para recibir una función o para mandar una función? Es decir, ¿no será que egdb_open espera una función ya hecha? Porque de ser así, tendrías no sólo que declararla sino implementarla:
y al llamar a egdb_open pasas @Mensajes (arroba incluida) como parámetro. // Saludos |
#15
|
|||
|
|||
Hola.
La funcion esta implementada y ya probe tambien la opcion de pasar la direccion como @FMensaje, aunque en el codigo expuesto en un mensaje no aparezca. Da el mismo error. Código:
procedure FMensaje(texto: pAnsiChar); cdecl; var FicheroTexto: TextFile; begin AssignFile(FicheroTexto,'FicheroEGDB.txt'); Rewrite(FicheroTexto); Write(FicheroTexto,texto); CloseFile(FicheroTexto); end; |
#16
|
||||
|
||||
Cita:
// Saludos |
#17
|
|||
|
|||
Cambio de tipos
Supongo que te refieres a que cambie la definicion de la funcion
Código:
AbrirTablaFinales:function(bitmap_type: EGDB_BITMAP_TYPE; pieces,cache_mb: Integer; directory: pAnsiChar; FMensajes: TFMensajes) :PEGDB_DRIVER; cdecl; Código:
AbrirTablaFinales:function(bitmap_type: EGDB_BITMAP_TYPE; pieces,cache_mb: Integer; directory: pAnsiChar; direccion: longint): PEGDB_DRIVER; cdecl; Gracias por la ayuda. |
#18
|
|||
|
|||
Solucionado el problema pero ...
Gracias a todos por los consejos, pero mi supina ignorancia en temas avanzados de Delphi me han llevado a cometer un error de principiante
![]()
|
#19
|
|||
|
|||
Necesito ese motor de damas esp...
hola viejo, a estas alturas que vengo a dar con este tema, supongo que solucionaste el problema y terminaste de desarrolar el motor de damas españolas que empezaste, sabes, tengo tiempo buscando un motor que juege la variante española de damas y hasta aqui no lo eh conseguido, quisiera tu ayuda. Ojala pudieras poporcionarme ese motro o darme el link de donde pueda descargar uno...
|
#20
|
||||
|
||||
Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración
![]()
__________________
La otra guía de estilo | Búsquedas avanzadas | Etiquetas para código | Colabora mediante Paypal |
![]() |
|
|
![]() |
|