Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2004
Avatar de fryguy
fryguy fryguy is offline
Miembro
 
Registrado: mar 2004
Posts: 18
Poder: 0
fryguy Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 24-12-2004
Avatar de Héctor Randolph
[Héctor Randolph] Héctor Randolph is offline
Miembro Premium
 
Registrado: dic 2004
Posts: 882
Poder: 20
Héctor Randolph Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 27-12-2004
Avatar de fryguy
fryguy fryguy is offline
Miembro
 
Registrado: mar 2004
Posts: 18
Poder: 0
fryguy Va por buen camino
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!
Responder Con Cita
  #4  
Antiguo 27-12-2004
Avatar de Edgar++
Edgar++ Edgar++ is offline
Miembro
 
Registrado: dic 2004
Ubicación: Buenos Aires
Posts: 15
Poder: 0
Edgar++ Va por buen camino
Holas! ayudaria mucho si mostraras el prototipo de la funcion de la que se habla, asi podriamos ayudarte mejor
Responder Con Cita
  #5  
Antiguo 28-12-2004
Avatar de fryguy
fryguy fryguy is offline
Miembro
 
Registrado: mar 2004
Posts: 18
Poder: 0
fryguy Va por buen camino
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.

Última edición por fryguy fecha: 28-12-2004 a las 13:09:53.
Responder Con Cita
  #6  
Antiguo 28-12-2004
Avatar de Edgar++
Edgar++ Edgar++ is offline
Miembro
 
Registrado: dic 2004
Ubicación: Buenos Aires
Posts: 15
Poder: 0
Edgar++ Va por buen camino
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!
Responder Con Cita
  #7  
Antiguo 28-12-2004
Mick Mick is offline
Miembro
 
Registrado: may 2003
Posts: 405
Poder: 21
Mick Va por buen camino
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
Responder Con Cita
  #8  
Antiguo 31-12-2004
Avatar de fryguy
fryguy fryguy is offline
Miembro
 
Registrado: mar 2004
Posts: 18
Poder: 0
fryguy Va por buen camino
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.
__________________
"Fools are the only folks on earth who can absolutely count on getting what they deserve" S.K.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 17:21:20.


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
Copyright 1996-2007 Club Delphi