Ir al contenido


Foto

No puedo llamar a una dll desde un programa en codetyphon


  • Por favor identifícate para responder
3 respuestas en este tema

#1 AngelF

AngelF

    Advanced Member

  • Miembros
  • PipPipPip
  • 100 mensajes
  • LocationValencia - España

Escrito 25 febrero 2015 - 03:26

Hola a todos.

Tengo un problema para llamar a una dll externa a un programa hecho con free pascal utilizando codetyphon 5.10 en windows vista.

El programa en cuestión es un ejemplo para delphi que distribuye la casa Maxim Integrated Products para acceder a sensores conectados via usb al ordenador.
El caso es que en delphi7 el programa funciona perfectamente, pero al convertirlo a freepascal y retocarlo un poco (he tenido que quitar del uses la unit wintype y sustituirla por la unit windows), compila bien pero al arrancar muestra el siguiente mensaje:
"Error al iniciar la aplicación porque no se encontró IBFS32.DLL. La reinstalación de la aplicación puede solucionar el problema".

La dll en cuestión se encuentra en el directorio c:\windows\syswow64 (en windows vista). He intentado copiar el fichero dll en c:\windows\system32 y también en el mismo directorio del archivo exe y sigue dando el mismo error.

Por tanto, deduzco de que a pesar de lo que indica el mensaje de error, no se trata de que no encuentre la dll, sino de que hay un problema en otra parte.
Buscando, encontré que para llamar a una dll hecha en C++ (desconozco si esta dll está hecha en este lenguaje, pero tiene toda la pinta) hay que colocar cdecl en vez de stdcall. Corrijo el fichero pas correspondiente:

Extracto del fichero original (el que funciona en delphi7):


delphi
  1. function TMReadDefaultPort(P: Pointer; T: Pointer): SmallInt; StdCall;
  2. function TMGetAdapterSpec(H: LongInt; P: Pointer; S: Pointer): SmallInt; StdCall;
  3.  
  4.  
  5. implementation
  6.  
  7.  
  8. { Session Layer }
  9. function TMExtendedStartSession; external 'IBFS32.DLL';
  10. function TMStartSession; external 'IBFS32.DLL';
  11. function TMValidSession; external 'IBFS32.DLL';
  12. function TMEndSession; external 'IBFS32.DLL';



Y aquí, los cambios que he realizado:



delphi
  1. function TMReadDefaultPort(P: Pointer; T: Pointer): SmallInt; cdecl;  <-- SUSTITUYO STDCALL POR CDECL
  2. function TMGetAdapterSpec(H: LongInt; P: Pointer; S: Pointer): SmallInt; cdecl; <-- SUSTITUYO STDCALL POR CDECL
  3.  
  4.  
  5. implementation
  6.  
  7.  
  8. { Session Layer }
  9. function TMExtendedStartSession; cdecl; external 'IBFS32.DLL'; <-- DELANTE DE EXTERNAL AÑADO CDECL
  10. function TMStartSession; cdecl; external 'IBFS32.DLL';  <-- DELANTE DE EXTERNAL AÑADO CDECL
  11. function TMValidSession; cdecl; external 'IBFS32.DLL';  <-- DELANTE DE EXTERNAL AÑADO CDECL
  12. function TMEndSession; cdecl; external 'IBFS32.DLL';  <-- DELANTE DE EXTERNAL AÑADO CDECL



Bueno, pues los cambios no dan resultado y obtengo el mismo mensaje de error.

¿Alguna idea de qué estoy haciendo mal? ¿Se trata de una mala ubicación de las librerías dll o de una mala forma de llamarlas?

Os adjunto el fichero con los ficheros y con las dll, por si os interesa probarlo en vuestro lazarus o codetyphon. (Se puede descargar libremente de la web de maxim's)

Un saludo

Archivos adjuntos


  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 25 febrero 2015 - 08:09

Si con la DLL junto al exe da error, creo que la DLL es de 32 bits y tu exe de 64 o al reves.
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 25 febrero 2015 - 08:36

Si con la DLL junto al exe da error, creo que la DLL es de 32 bits y tu exe de 64 o al reves.


Me pareció lo mismo que a ti amigo, pues la dll se encuentra en el directorio 64 de windows.
  • 0

#4 AngelF

AngelF

    Advanced Member

  • Miembros
  • PipPipPip
  • 100 mensajes
  • LocationValencia - España

Escrito 25 febrero 2015 - 01:47

Pues me parece que va a ser eso.
A ver si encuentro la versión dll de x64.

Gracias.
  • 0




IP.Board spam blocked by CleanTalk.