Recent

Author Topic: Pasar punteros de DLL C a Pascal  (Read 1070 times)

Oscar82

  • New Member
  • *
  • Posts: 21
Pasar punteros de DLL C a Pascal
« on: March 26, 2023, 12:52:13 pm »
Hola, lo primero me estoy divirtiendo mucho con pascal y este fin de semana he estado liado un poco intentando pasar punteros de una DLL creada en C a pascal, pero con el resultado de que el programa se cae, sin embargo al pasar de struct a record, funciona muy bien.

Code: Pascal  [Select][+][-]
  1. C...
  2. struct Data{
  3. char *info
  4. };
  5.  
  6. Pascal...
  7. type Data = record
  8. info: PAnsiChar;
  9. end;
  10.  
  11. type PData = ^Data;
  12.  
  13. procedure InfoFunc(): PData; cdecl; external ...
  14.  
  15. form...
  16. procedure ...
  17. var
  18. ptr:PData;
  19. ...
  20. ptr:=InfoFunc();
  21. ??

Un saludo :)

Edson

  • Hero Member
  • *****
  • Posts: 1283
Re: Pasar punteros de DLL C a Pascal
« Reply #1 on: March 27, 2023, 04:36:37 pm »
La verdad es que no he intentado manejar punteros desde una DLL externa. En teoría deberái funcionar. Lo único que se me ocurre es que podrías tener una incompatibilidad con el tamaño (32 o 64 bits).

Si deseas ayuda más especializada, te recomendaría consultar en inglés. Aquí hay muy buenos especialistas en interacción Pascal/C.
Lazarus 2.0.10 - FPC 3.2.0 - x86_64-win64 on Windows 8

BlueIcaro

  • Hero Member
  • *****
  • Posts: 765
    • Blog personal
Re: Pasar punteros de DLL C a Pascal
« Reply #2 on: March 27, 2023, 06:10:28 pm »
Hola, yo no soy un especialista pero tengo algo de experiencia. Convertí algunas librerías en C para usar en Pascal.
Échale un vistazo a estos enlaces:
https://github.com/Blueicaro/GLFW
https://github.com/Blueicaro/Pascal-Librealsense

El código que muestras no es muy detallado. Y no sé a que te refieres a que el código se cae.
¿Puedes poner ejemplo más detallado e indicar en que línea tienes problemas?

Asegurate que esta línea, no devuelve null :
Code: [Select]
ptr:=InfoFunc();

Para acceder a la información puedes escribir la siguiente:
Code: [Select]
MiPAnsiChar:= prt^.info;

Saludos
Editado: En este enlace explico como he ido solucionando algunas situaciones: https://github.com/Blueicaro/Pascal-Librealsense/blob/main/info/NotasConversion.md
« Last Edit: March 27, 2023, 06:21:09 pm by BlueIcaro »

edgarrod71

  • Jr. Member
  • **
  • Posts: 68
Re: Pasar punteros de DLL C a Pascal
« Reply #3 on: March 28, 2023, 03:45:00 am »
BlueIcaro, muy interesante... sería bueno ponernos en contacto.

BlueIcaro

  • Hero Member
  • *****
  • Posts: 765
    • Blog personal
Re: Pasar punteros de DLL C a Pascal
« Reply #4 on: March 28, 2023, 12:49:17 pm »
Hola, no hay problema en mantener contacto. Puedes enviarme un mensaje personal por el foro,
Por otra parte, sería interesante exponer en el foro la duda que tienes, y tratar de resolverla entre todos, de este modo queda la solución para todo el mundo.
Saludos

mosquito

  • Full Member
  • ***
  • Posts: 138
Re: Pasar punteros de DLL C a Pascal
« Reply #5 on: July 12, 2023, 10:19:03 am »
|@BlueIcaro| Gracias por compartir esas notas de conversión, muy bueno !
* En la tabla de conversión que tienes, creo que el tipo 'smalint' es 'smallint'.

No se si para una gran conversión o binding puede ser práctico usar H2PAS (https://www.freepascal.org/tools/h2pas.html) y ajustar luego a mano. O empezar a lo Tarzán a traducir...

De cualquier modo traducir GLFW no es moco de pavo. Enhorabuena !!

 

TinyPortal © 2005-2018