FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#1
|
|||
|
|||
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.
|
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
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:
|
#4
|
||||
|
||||
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 |
#5
|
|||
|
|||
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; |
#6
|
||||
|
||||
Cita:
// Saludos |
#7
|
|||
|
|||
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. |
|
|
|