Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Error al llamar una funcion en una dll

Estas en el tema de Error al llamar una funcion en una dll en el foro de Visual Basic clásico en Foros del Web. Realice una dll de prueva con Dev c++. y cuando llamo a la funcion me da error 49 en tiempo he ejecución: La convencion de ...
  #1 (permalink)  
Antiguo 23/05/2006, 09:39
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Error al llamar una funcion en una dll

Realice una dll de prueva con Dev c++. y cuando llamo a la funcion me da error 49 en tiempo he ejecución:
La convencion de llamadas a DLL es incorrecta.

esta es la llamada a la dll

Private Declare Function mensaje Lib "Proyecto1.dll" (ByVal mensaje As String, ByVal titulo As String) As Long

Private Sub Form_Load()

mensaje "hOLA", Me.Caption

End Sub

--Codigo de c
***En dll.h***
#ifndef _DLL_H_
#define _DLL_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

****En dllmain.c********
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

DLLIMPORT void HelloWorld (char * mensaje,char * titulo)
{
MessageBox (0, mensaje, titulo, MB_ICONINFORMATION);
}


DLLIMPORT void msg()
{
MessageBox (0, "DEMO PLUGING FOR Yosvanis Cruz", "Yosvanis", MB_ICONINFORMATION);
}

BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;

case DLL_PROCESS_DETACH:
break;

case DLL_THREAD_ATTACH:
break;

case DLL_THREAD_DETACH:
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}

DLLIMPORT void HelloWorld (char * mensaje,char * titulo);

#endif /* _DLL_H_ */



--
Si alguien puede desirme cual es el problema se lo agradesco. una cosa cuando compilo el proyecto de vb ya no sale el error solo cuando lo pruevo en tiempo de diseño.
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #2 (permalink)  
Antiguo 23/05/2006, 15:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
Pues hombre, lo mejor es que lo hubieras posteado en C/C++ o Programación, no en VB6.

Y sí, VB6 tiene razón, la convención de llamadas está mal.

Tu dices en tu DLL que la función es

void HelloWorld (char * mensaje,char * titulo);

mientras que en VB6 dices que es

Function mensaje(ByVal mensaje As String, ByVal titulo As String) As Long

Entre ambas, no coinciden en nada:

1. Ni en nombre
2. Ni en parámetros
3. Ni en retorno

Ya me dirás como esperas que funcione...
  #3 (permalink)  
Antiguo 23/05/2006, 19:46
Avatar de [EX3]  
Fecha de Ingreso: marzo-2006
Ubicación: Fuenlabrada, Madrid
Mensajes: 203
Antigüedad: 18 años, 1 mes
Puntos: 1
Para que VB6 pueda usar las funciones de una DLL compilada con C/C++ estas deberan usar la convencion de llamadas _stdcall. Un ejemplo sacado de aqui:
Cita:
#include "Windows.h"

//Prototipo de la funcion:
short _stdcall Multiply(short Num1, short Num2);

//Codigo de la funcion:
short _stdcall Multiply(short Num1, short Num2)
{
return Num1*Num2;
}

Salu2...
__________________
Proyecto dx_lib32 (http://dxlib32.se32.com) Libreria DLL ActiveX para el desarollo de juegos y programas multimedia en Visual Basic 6.0 con la potencia de DirectX

Dice un dicho que "el que calla otorga". En internet tenemos otro que dice "nunca alimentes a un troll" que viene a decir "dejale hablar solo que se ya se cansara de incordiar". Solo los necios creen tener la razon con la ultima palabra.

  #4 (permalink)  
Antiguo 24/05/2006, 07:49
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
si tienes razon en el codigo de c es mensaje tambien pero me sigue el error y la web que me diste es de Visual c++ y mi codigo es c puro y el compilador que uso es Dev c++ 4.9.9.1
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #5 (permalink)  
Antiguo 24/05/2006, 16:14
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Verifica.

Asegurate de que el codigo de VB este correcto ya que el se C parece estar bien, podrias tambien aumentar

extern "C"
{
//aqui las funciones a exportar,
}

para mayor seguridad.

tambien asegurate de que se este usando dllexport y no dllinport.

asegurate de que la macro BUILDING_DLL esta definida.

o usa solo esto:

# define DLLEXPORT __declspec (dllexport)

# define DLLIMPORT __declspec (dllimport)

ya que si lo usaras des VB no usaras el dllinport.

Saludos.
  #6 (permalink)  
Antiguo 25/05/2006, 07:45
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años, 1 mes
Puntos: 17
A ver, ¿nadie ha leido mi post, o qué?

No hay ningún punto de comparación entre las funciones que ha declarado en la DLL con las que pretende usar en VB.

Es imposible que Windows encuentre el entry point.

Y cuando consigas que le encuentra, dará igual, porque los parámetros no son iguales. Un "char *" no es un String de VB.
  #7 (permalink)  
Antiguo 25/05/2006, 20:05
Avatar de Jad-Neo  
Fecha de Ingreso: octubre-2004
Mensajes: 344
Antigüedad: 19 años, 6 meses
Puntos: 0
En cuanto a lo del "char *" yo podría decir que lo sustituya por LPCTSTR que es lo mismo que un String en VB.

Por lo del valor de retorno, debe ser un Declare Sub y no un Declare Function, ya que los procedimientos "void" en C/C++ no devuelven un valor de retorno.
__________________
Nunca seas sabio en tu propia opinión.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:30.