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
function TMReadDefaultPort(P: Pointer; T: Pointer): SmallInt; StdCall; function TMGetAdapterSpec(H: LongInt; P: Pointer; S: Pointer): SmallInt; StdCall; implementation { Session Layer } function TMExtendedStartSession; external 'IBFS32.DLL'; function TMStartSession; external 'IBFS32.DLL'; function TMValidSession; external 'IBFS32.DLL'; function TMEndSession; external 'IBFS32.DLL';
Y aquí, los cambios que he realizado:
delphi
function TMReadDefaultPort(P: Pointer; T: Pointer): SmallInt; cdecl; <-- SUSTITUYO STDCALL POR CDECL function TMGetAdapterSpec(H: LongInt; P: Pointer; S: Pointer): SmallInt; cdecl; <-- SUSTITUYO STDCALL POR CDECL implementation { Session Layer } function TMExtendedStartSession; cdecl; external 'IBFS32.DLL'; <-- DELANTE DE EXTERNAL AÑADO CDECL function TMStartSession; cdecl; external 'IBFS32.DLL'; <-- DELANTE DE EXTERNAL AÑADO CDECL function TMValidSession; cdecl; external 'IBFS32.DLL'; <-- DELANTE DE EXTERNAL AÑADO CDECL 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