FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Problemas con dll y estructuras
Hola. Os explico mi problema a ver si alguien me pueda dar alguna idea.
Tengo una aplicación que debe hacer uso de una dll escrita en C++. Yo uso delphi 5. El caso es que esta dll utiliza una serie de estructuras de las cuales tengo un archivo de cabecera de la dll escrito en C++. Mi idea era pasar este archivo cabecera a delphi para poder usar las funciones y estructuras que contiene. Todo me iba genial hasta que he llegado a una función que toma como parámetro de entrada una estructura en la que uno de sus campos es otra estructura; hasta aquí nada raro. El problema es que esta estructura se llama 'Set' (palabra reservada en delphi) y no me deja ponerle este nombre. He tratado de ponerle otro nombre pero al llamar a la función me da un error (un número que no me indica nada en concreto). ¿Qué puedo hacer? ¿Esto quiere decir que esta dll es imposible de usar en delphi? ¿Una solución podría ser el programar el objeto en C++ e importarlo cmo active x en delphi? (esto sería un auténtico coñazo, espero que sea la última solución) ¿Se puede usar directamente la dll sin tener que hacer un archivo cabecera? |
#2
|
|||
|
|||
stdcall o cdecl
estás seguro que el problema no está en que no especificaste stdcall o cdecl después de declarar la función. Usualmente los dll escritos en c son cdecl por defecto aunque el programador no lo haya especificado. Cuando se programa un dll en el lenguaje que sea se suele especificar stdcall. Tanto en stdcall como en cdecl el orden en que se pasan los parámetros es inverso que en Delphi. La diferencia entre sdtcall y cdecl está en que en el segundo el caller libera los recursos reservados mientras que en el segundo es la función. Lo más probable es que en un dll sean todas las funciones stdcall pero si lo hizo un programador aficionado como yo, quizá no se tomó la molestia de escribir stdcall antes de cada función. En cuanto a los miembros de las estructuras, no debería importar el nombre sino el tipo de dato. Cuando uses un miembro que es un pointer declaralo antes como PType = ^Type pero cuando sea el parámetro de una función como var VarName: Type. En cambió el nombre de las funciones sí deben coincidir con el nombre en el dll, excepto en el caso de que uses un alias pero debes especificar el nombre correcto al final.
ej: DoSomething(var b: Byte; Size: Integer); stdcall; external 'MyLib.dll'; No incluyo un ejemplo con alias porque no estoy en mi computadora sino en un cyber y no tengo la ayuda de delphi a mano, como nunca uso alias no me acuerdo si va ; antes del nombre verdadedo de la función ni me acuedo si el nombre verdadero va entre dos '. |
#3
|
|||
|
|||
Ogg Vorbis y delphi
Usualmente hago dll con Dev-cpp y los uso en Delphi y viceversa. Pero cuando compilé Libogg con Dev-cpp importando un projecto de MS Visual C++ que viene en la carpeta win32 del paquete de distribución de libogg y vorbis no conseguí más que violaciones de acceso con Delphi. Lo posteo aquí porque creo que esto está relacionado con el problema del compañero, ¿alguien que pueda constestar ambas preguntas con una misma respuesta? Apropósito, compañero, ¿trataste de usar GetProcAddress del SDK de Windows en lugar de declarar las funciones con external? A mi me funciona pero no con libogg. Post Data: $L no funciona si la librería es '.a' y no ganas nada con cambiarle la extensión a '.obj' porque el linker te sale con que el formato es incorrecto. Creo que esto último sí amerita una nueva discusión.
|
Herramientas | Buscar en Tema |
Desplegado | |
|
|
|