Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   DLL: No se encuentra punto de entrada del procedimiento... (https://www.clubdelphi.com/foros/showthread.php?t=29571)

Chente(rMan) 25-01-2006 18:43:29

DLL: No se encuentra punto de entrada del procedimiento...
 
Que tal foreros.

Un proveedor me esta entregando una dll hecha en Visual Basic 6, y me indica las funciones...

Código:

Public Function Marca(telefono As String, prefijo As String) As Integer
Esta DLL lo que hara, será marcar a un número telefónico entre otras cosas, por eso el prefijo.

asi que yo en Delphi pongo lo siguiente.

Código Delphi [-]
implementation
{$R *.dfm}
function Marca(telefono, prefijo : string) : integer ; External 'C:\Archivos de programa\BAPCXSETDLL\BAPCXSETDLL.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Marca(Edit1.Text, 'm')));
end;

Pero me marca el siguiente error.

No se encuentra el punto de entrada del procedimiento Marca en la biblioteca de vínculos dinámicos 'C:\Archivos de programa\BAPCXSETDLL\BAPCXSETDLL.dll':eek:

Segun yo todo esta bien, no se si tenga que definirse algo al compilar la dll en VB6 para que cualquier lenguaje pueda usarlo.

Cuando es al reves, o sea que una dll se genere en Delphi creo que hay que ponerle stdCall para que pueda ser interpretado por todos los lenguajes.

Aunque lo mas seguro es que yo este mal en algo, espero me puedan ayudar, gracias.


Vicente López.

dec 25-01-2006 18:57:03

Hola,

Creo que te falta el atributo (por decirlo de algún modo) "name" a continuación de "external", de tal modo que con él indiques el procedimiento a que quieres acceder en la DLL que tratas de enlazar. Fíjate en la siguiente declaración:

Código Delphi [-]
function IsThemeActive : BOOL; external 'uxtheme.dll' name 'IsThemeActive';

¿Lo coges? Pues prueba a ver y nos cuentas qué pasó. ;)

Chente(rMan) 25-01-2006 19:22:48

Gracias DEC, en este mismo instante lo pruebo.

roman 25-01-2006 19:26:58

Posiblemente te estén dando gato por liebre :D

Si en la declaración external no se especifica name, entonces se asume que el nombre dado en la declaración coincide con el de la dll, y si el proveedor te dice que ese es el nombre y marca ese error, pues eso, te da gato por liebre.

Sin embargo, creo recordar de mi oscuro pasado, que las dll en VB no son estándar, así que, si tal es el caso, posiblemente sólo puedas usarla en VB.

// Saludos

roman 25-01-2006 19:30:02

Bueno, y nada más para aclarar lo que comenta David; la directiva name es necesaria sólo cuando deseamos usar un nombre distinto al que tiene la dll, por ejemplo:

Código Delphi [-]
function ElTemaEstaActivo : BOOL; external 'uxtheme.dll' name 'IsThemeActive';

Aquí, estamos importando una función que originalmente se llama IsThemeActive pero que en nuestro código identificaremos como ElTemaEstaActivo.

// Saludos

dec 25-01-2006 19:30:47

Hola,

Cita:

Empezado por Román
Si en la declaración external no se especifica name, entonces se asume que el nombre dado en la declaración coincide con el de la dll (...)

Sí; llevas razón Román, el caso es que lo sabía, en serio, pero no lo recordaba, que tal vez sea como si no lo supiera de veras y acabara de aprenderlo. Gracias. ;)

Chente(rMan) 25-01-2006 19:34:52

nop
 
Nop, no funciono, me marca el siguiente error:

Código:

Project D:\project1.exe faulted with message: 'access violation at 0x77f879a1: write of address 0x00030f00'. Proces stoped. Use step o Run to continue'

Uso Delphi 6.




Saludos.

roman 25-01-2006 19:51:54

Cita:

Empezado por Chente(rMan)
Cuando es al reves, o sea que una dll se genere en Delphi creo que hay que ponerle stdCall para que pueda ser interpretado por todos los lenguajes.

No me había fijado en esto. En la declaración para importar la función, normalmente tendrás que especificar stdcall. Esa directiva indica el orden en que se introducen los parámetros al stack (de izqueirda a derecha o viceversa). Pascal, desde sus inicios, usa el orden inverso y como normalmente las dll están escritas en C, hay que especificar stdcall para que el compildor sepa en qué orden saca los parámetros del stack. Tendrás que preguntarle al proveedor cual es la convención de llamada de la función.

// Saludos

Chente(rMan) 25-01-2006 20:00:01

Gracias Roman, ya le comente que averigue mas a fondo sobre stdCall, al parecer no lo esta usando en la DLL.



Saludos.


Vicente López

roman 25-01-2006 20:13:56

Yo de entrada le preguntaría si la dll es estándar y puedes usarla en otros lenguajes, porque si no, pues ...

// Saludos

Chente(rMan) 25-01-2006 20:16:46

Cita:

Empezado por roman
...le preguntaría si la dll es estándar y puedes usarla en otros lenguajes

Fué lo primero que le pregunte, pero no tiene idea, lo que pasa es que siempre las ha utilizado para acceder desde otra aplicación hecha en VB.


Gracias.

roman 25-01-2006 20:22:42

Cita:

Empezado por Chente(rMan)
Fué lo primero que le pregunte, pero no tiene idea

Pues ¿no fue él quien la programó? :confused: La verdad pienso que es su responsabilidad saber la respuesta, y sobre todo, habértela dicho antes de vendértela.

// Saludos

Chente(rMan) 25-01-2006 20:28:42

Efectivamente el la programo, pero no se habia presentado antes un trabajo de esta manera, accesar a sus DLL's desde otro lenguaje de programación, la solución que me esta dando es usar un OCX en lugar de la DLL, ¿que opinan?

nlsgarcia 18-02-2007 09:30:12

Respuesta a DLL: No se encuentra punto de entrada del procedimiento
 
:) Hola:

El error se genera debido a que VB no puede crear DLLs estandar, VB crea ActiveX DLLs, es por eso que no es posible encontrar un punto de entrada, sin importar si es StdCall o no el paso de parámetros.

Existe un lenguaje llamado Powerbasic (www.powerbasic.com), que permite hacer DLLs con sintaxis de Basic, entre otras cosas (Es un lenguaje creado por las persona que creo Turbo Basic en Borland) y yo lo he utilizado para convertir ActiveX DLLs a DLLs estandar. Tiene algunas características de Delphi, lo cual lo hacen un excelente complemento de VB, esto si es necesario que el DLL sea estandar.

VB si puede llamar de manera natural un ActiveX DLL, es por eso que el DLL funciono anteriomente sin problemas a nivel de VB.

La opción más simple es incorporarlo a tu proyecto como ActiveX y no como DLL.

Suerte :)


La franja horaria es GMT +2. Ahora son las 07:15:49.

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