Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Entry Point Not Found (https://www.clubdelphi.com/foros/showthread.php?t=94393)

compuin 18-01-2020 17:22:08

Entry Point Not Found
 
Hola amigos,

Me encuentro creando una .DLL que compile en Borland C++ 7.4 y cuando trato de llamar la funcion que esta DLL tiene desde Delphi, en la compilacion me arroja el siguiente mensaje



Este es el codigo que estoy usando desde Delphi

Código Delphi [-]
function MdyToJulian( mon, day, yea : integer ): Longint; stdcall; external 'sky001.dll' name 'MdyToJulian';

Y aca la funcion en la DLL

long MdyToJulian(int mon, int day, int yea)
{
long im, j;

im = 12*((long)yea+4800)+(long)mon-3;
j = (2*(im%12) + 7 + 365*im)/12;
j += (long)day + im/48 - 32083;
if (j > 2299171) /* Take care of dates in */
j += im/4800 - im/1200 + 38; /* Gregorian calendar. */
return j;
}

GRacias de antemano

Javierus 20-01-2020 22:20:39

Hace milenios que no uso C/C++, pero ¿Estás seguro de que la DLL está exportando esa función?
Y lo evidente: La DLL está en la misma carpeta que el exe

compuin 20-01-2020 22:23:43

Cita:

Empezado por Javierus (Mensaje 535291)
Hace milenios que no uso C/C++, pero ¿Estás seguro de que la DLL está exportando esa función?
Y lo evidente: La DLL está en la misma carpeta que el exe

Si, esta en la misma carpeta, lo que no estoy seguro es si esta exportando

Hay alguna forma de probar eso ?

delphi.com.ar 20-01-2020 22:23:59

¿El error es en tiempo de compilación o de ejecución?

Aparentemente tu DLL no estaría exportando por nombre la función "MdyToJulian". Igualmente si es solo ese fragmento de código el que tienes que utilizar, y suponiendo por el nombre que se trata de obtener la fecha en Juliano, te recomiendo usar la función DateTimeToJulianDate de la unit DateUtils, en conjunto con EncodeDateTime.

Código Delphi [-]
uses
  DateUtils;

function EncodeJulianDate(const AYear, AMonth, ADay: Word): Double;
begin
  result := DateTimeToJulianDate(EncodeDate(AYear, AMonth, ADay));
end;

Saludos!

Javierus 20-01-2020 22:27:17

Por aquí explican que en C++ a veces los nombres exportados no son los que se espera:

https://stackoverflow.com/questions/...t-could-not-be

delphi.com.ar 20-01-2020 22:30:52

Cita:

Empezado por compuin (Mensaje 535292)
...lo que no estoy seguro es si esta exportando...

Si subes la definición del header, te puedo decir si se está exportando o no.

Otra forma, "navegar" la librería, dado que si exporta la función por nombre, puedes verla con alguna herramienta tipo: ExportViewer ó Dependency Walker.

Saludos!

compuin 20-01-2020 22:37:35

Cita:

Empezado por delphi.com.ar (Mensaje 535295)
Si subes la definición del header, te puedo decir si se está exportando o no.

Otra forma, "navegar" la librería, dado que si exporta la función por nombre, puedes verla con alguna herramienta tipo: ExportViewer ó Dependency Walker.

Saludos!

Te refieres al header de C++ ?

delphi.com.ar 20-01-2020 22:39:04

Cita:

Empezado por compuin (Mensaje 535296)
Te refieres al header de C++ ?

Si... si la función tiene únicamente lo que pegaste como código, sin header, ya te confirmo que no la estás exportando.

compuin 20-01-2020 22:41:58

Cita:

Empezado por delphi.com.ar (Mensaje 535297)
Si... si la función tiene únicamente lo que pegaste como código, sin header, ya te confirmo que no la estás exportando.


Aca parte del header

/* From formulas.c */

#define EclToEqu(Z, L) CoorXform(Z, L, DTOR(TROPIC))
#define EquToEcl(Z, L) CoorXform(Z, L, DTOR(-TROPIC))
#define EquToLocal(Z, L, T) CoorXform(Z, L, T)
#define ReadPlanetData() (*datapointer++)
#define Biorhythm(D, R) (sin(((D)/(R))*PI*2.0)*100.0)
#define JulianDayFromTime(T) ((T)*36525.0+2415020.0)

extern long MdyToJulian();
extern void JulianToMdy();
extern real ProcessInput();
extern void CoorXform();
extern int HousePlaceIn();
extern void HousePlace();
extern void ComputeStars();
extern real CastChart();

escafandra 20-01-2020 23:15:31

En C/C++ extern no exporta, simplemente le dice al compilador que esa función está implementada en otro sitio.


Para exportar funciones en una dll se usa __declspec(dllexport) Mira el ejemplo que dejé aquí.


Saludos.

compuin 20-01-2020 23:18:11

Cita:

Empezado por escafandra (Mensaje 535300)
En C/C++ extern no exporta, simplemente le dice al compilador que esa función está implementada en otro sitio.


Para exportar funciones en una dll se usa __declspec(dllexport) Mira el ejemplo que dejé aquí.


Saludos.

El ejemplo dice Codigo PHP, sirve tambien para C++ ?

Esto deberia ir donde ? En el archivo de cabecera o en el .cpp con la funcion ?

escafandra 20-01-2020 23:22:31

Cita:

Empezado por compuin (Mensaje 535301)
El ejemplo dice Codigo PHP, sirve tambien para C++ ?

Esto deberia ir donde ? En el archivo de cabecera o en el .cpp con la funcion ?


La etiqueta del código pone PHP pero el código es C. Simplemente uso esa etiqueta porque CD no tiene etiquetas para C/C++ y la de PHP es la que deja el formato de código más parecido a C/C++ al publicar.




Saludos.

delphi.com.ar 20-01-2020 23:42:50

Acá te dejo un ejemplo hecho a medida:

Archivo funcs.cpp (todo junto, deberías pasar la definición al header)
Código:

#define EXTERN_DLL_EXPORT extern "C" __declspec(dllexport)

EXTERN_DLL_EXPORT long __stdcall MdyToJulian(int mon, int day, int yea)
{
        long im, j;

        im = 12*((long)yea+4800)+(long)mon-3;
        j = (2*(im%12) + 7 + 365*im)/12;
        j += (long)day + im/48 - 32083;
        if (j > 2299171) /* Take care of dates in */
        j += im/4800 - im/1200 + 38; /* Gregorian calendar. */
        return j;
}

En ese código podes observar que se exporta como una función C, con la convención stdcall.

Para compilarlo bajé el compilador gratuito Embarcadero Free C++ compiler, y lo compilé utilizando:
Código:

bcc32c funcs.cpp -tD
Y el código Delphi:
Código Delphi [-]
function MdyToJulian(mon, day, yea : integer ): Longint; stdcall; external 'funcs.dll' name 'MdyToJulian';

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  Caption := FloatToStr(MdyToJulian(1, 16, 2020));
end;

Saludos!

Al González 31-01-2020 17:18:29

Cita:

Empezado por Javierus (Mensaje 535294)
Por aquí explican que en C++ a veces los nombres exportados no son los que se espera:
https://stackoverflow.com/questions/...t-could-not-be

Y es que algunos compiladores de C++ integran "decoración de nombres" (no estoy seguro del término). Y, en todo caso, conviene apoyarse con alguna herramienta como DLL Export Viewer para saber el nombre final de la función exportada.

Federico: ¡Tú también has regresado! :)
Javier. Hay algo pendiente en tu WhatsApp. :-)


La franja horaria es GMT +2. Ahora son las 02:15:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi