FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Problema con DLL
Hola, como os va por aquí !
Bueno hoy traigo este "problemon" resulta que tengo una DLL ya compilada en C++ la cual no puedo modificar el codigo fuente y necesito utilizar una de sus funciones ya tengo encuenta que tengo que pasar una String por la "Char*" de C++ que en Delphi equivale a PChar Bueno, buscando información he intentado varias maneras, alojando memoria con getmem, usando un array de char y demas chorradas pero una de 2, o no tengo ninguna respuesta o bytes basura, debería ser sencillo de arreglar pero buscando solo veo ejemplos para el lenguaje .NET, para ese tipo de llamada a la "Char*" bueno, le he dado 1000 vueltas, espero que alguien me pueda iluminar un poco Hice un ejemplo sencillo de una DLL en C++ para emular el problema e ir buscando una solución.
En C++ Código PHP:
Última edición por Reasen fecha: 08-11-2018 a las 02:38:06. |
#2
|
|||
|
|||
Falta stdcall
Te faltó agregar stdcall al final de la declaración.
Quedaría algo así:
Saludos y espero te sirva! |
#3
|
|||
|
|||
Cita:
|
#4
|
||||
|
||||
El tema de las cadenas de texto no es tan simple. Te recomiendo que definas tipos de datos nuevos para evitarte problemas. Te paso las definiciones que hice yo para Allegro.pas:
Uso PAnsiChar ya que CHAR, en las versiones modernas de Delphi, es de 2 bytes (UNICODE) no 1 (ASCII). Quizá por eso te sale "sucio", al intentar decodificar una cadena ASCII como UNICODE. Por otro lado, uso AL_STR cuando es un parámetro y AL_STRptr cuando es una cadena devuelta por una función. El compilador se encarga de las conversiones adecuadas (siempre que no olvides el CDECL o el STDCALL, claro). |
#5
|
|||
|
|||
Hola, ahora mismo estoy trabajando con Delphi 7, he intentando también con Embarcadero 10 lo que me dices pero obtengo los mismos resultados.
Examinando memoria he visto algo curioso que pasa en Delphi 7, en embarcadero ni siquiera tengo ese puntero https://prnt.sc/lg0g0p Si cambio ESP al valor al correcto ya sale el texto correctamente pero desde luego no quiero llegar a tener que escanear y escribir memoria por algo así... Dejo la DLL ya compilada aquí por si alguien quiere echar un ojo sin tener que compilarla https://www7.zippyshare.com/v/Qa6UdBgA/file.html |
#6
|
||||
|
||||
El error está en los parámetros. Mientras en la dll C/C++ la función espera un DWORD64 tu le pasas un integer. Además debes declarar el estilo de paso de parametros C: cdecl
Declárala así:
Saludos. Última edición por escafandra fecha: 08-11-2018 a las 22:28:14. |
|
|
|