Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   dll para otros lenguajes (https://www.clubdelphi.com/foros/showthread.php?t=17107)

fryguy 23-12-2004 15:49:00

dll para otros lenguajes
 
Hola gente, todavía no estoy del todo seguro de si esta consulta va en este foro, ustedes sabrán decirme.
Tengo que hacer una dll para que otros la usen con vb6. El problema que tengo es que mi librería anda perfecto desde delphi6 pero cuando se la entrego a mi cliente no tienen forma de hacerla andar con vb6. Según me cuentan la aplicación muestra un error de "la memoria no se puede 'written'" y termina.

Mi pregunta puntual es, debería hacer algo especial dentro de la librería para permitir su uso desde otros lenguajes? Hasta donde mis conocimiento llegan una dll para win32 debería poder ser utilizada sin problemas pero evidentemente hay algo mal que no anda bien.

Salute!!!
FryGuy

Héctor Randolph 24-12-2004 20:10:40

dll para otros lenguajes
 
Hola FryGuy!

¿Has probado cambiar la forma de manejar los parámetros en la librería?

Si ya lo has intentado, entonces ignora todo lo que voy a escribir, si no tal vez esto te pueda servir.

Posiblemente el problema radica en la forma de manejar los parámetros, algunos lenguajes tiene la convención de acumular los parámetros en la pila de izquierda a derecha y otros de derecha a izquierda.

Cuando creas una función o procedimiento puedes especificar que convención deseas emplear de la siguiente manera:

Código Delphi [-]
function MyFunction(X, Y: Real): Real; stdcall;export;
 ...

En Delphi la convención por default es register que es izquierda-derecha al igual que la convención pascal.

Para otros lenguajes como 'C' se deben utilizan las convenciones cdecl, stdcall y safecall que son derecha-izquierda.

La API de Windows utiliza las convenciones stdcall y safecall.

Podrías intentar con otras convenciones solo para descartar posibilidades y encontrar el error.

Espero que te sea útil

fryguy 27-12-2004 12:44:52

Buenas y gracias por la respuesta.
Probé las diferentes convenciones de pasado de parámetros solo por probar. En este caso no era necesario ya que solo estaba usando un parámetro y creo que no es necesario.

Gracias igualmente, valoro tanto una respuesta que me solucione el problema como una que no. Siempre es bueno saber que hay gente que intenta ayudar a los demás.

Salute!
Y felicez fiestas!

Edgar++ 27-12-2004 22:53:56

Holas! ayudaria mucho si mostraras el prototipo de la funcion de la que se habla, asi podriamos ayudarte mejor ;)

fryguy 28-12-2004 12:31:21

Limpié las últimas pruebas hechas y el encabezado es el siguiente.

Código:


function GenerateMD5(Cadena: string): string;
....
exports
GenerateMD5;
 
begin
end;

Como se puede imaginar por la declaración de la funcion es para poder generar una hash MD5 a partir de una cadena. Ya tengo implementada esta dll con aplicaciónes hechas en Delphi 6 y también la adapté para usar como store procedure extendida en SQL 2K.

Edgar++ 28-12-2004 22:00:28

Holas! me imaginé que el parametro era de tipo string, tu problema podria ser que VB y Delphi manejan de foma distinta los tipos string o como se produce su pasaje en la funcion, es decir si es por valor o por referencia, igualmente no podria decirte con exactitud.
Pero te recomendaria que pruebes declarar tu funcion de la siguinete forma:

Código Delphi [-]
function GenerateMD5(Cadena: PAnsiChar): PAnsiChar;
si el problema fuera el que te comenté, esto deberia funcionar... cualquier cosa avisanos!

Mick 28-12-2004 22:50:04

Solo puntualizar que aunque solo se indique un parametro es necesario especificar sdcall o la convencion que sea necesaria. Ya que la diferencia no solo esta en el orden de los parametros, sino en quien se encarga de eliminar de la pila los parametros, asi que si no se indica la convencion adecuada, el programa dara errores bestias.

Saludos

fryguy 31-12-2004 16:41:04

Seguí los consejos de ustedes y por lo menos la cosa empieza a andar.
Ahora el único problema que tengo es que al usar la dll en VB la aplicación da un error al cerrarla, pero ninguno mientras se usa. Calculo que debe ser un problema de administración de memoria o de la forma en que se llama.
Desde VB la llamada la hago así:
Código:

Declare Function GenerateMD5 Lib "MD5.dll" (Cadena As String) As Long
pero cambie la forma de trabajar con la función; la cadena se pasa por referencia y trae el valor de la cadena, el resultado de la función es la longitud de la hash.


La franja horaria es GMT +2. Ahora son las 00:04:25.

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