C/Visual C - Ayuda con Dll

 
Vista:
sin imagen de perfil

Ayuda con Dll

Publicado por Iguane (2 intervenciones) el 21/07/2005 10:05:19
Hola me gustaria si pudiera ser a ver si me ayudais en la invocacion de una libreria hecha en c++ y no se que debo ponerle en visual basic ya que he probado varias opciones y al final me sale un error en windos que me cierra el programa el error vendria siendo el siguiente Unhandled exception [una direccion de memoria "0xc50000000"] y luego la referencia a la dll.
Bueno la funcion en c++ seria:
LONG WINAPI HY_Mifare_Select(BYTE *serial,int *type);
y la forma de invocarla en visual la hice asi:
Private Declare Function HY_Mifare_Select Lib "c:\prueba\ssse32.dll" (ByRef serial As_ Bytserie, ByVal tipe As Long) As Long
y he declarado Bytedir como:
Public Type Bytserie
byBytes(3) As Byte
End Type
la declare asi puesto que supuestamente devuelve 4 bytes pero poniendola asi me falla, asi que si alguno supiera como se pondria le agradeceria su ayuda.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Ayuda con Dll

Publicado por fernando.gomez (1603 intervenciones) el 22/07/2005 22:23:38
El error que te sale es por un mal manejo de memoria o punteros. Hasta donde tengo entendido, esto:

Public Type Bytserie
byBytes(3) As Byte
End Type

es equivalente en C/C++ a esto:

struct Byteserie
{
unsigned char byBytes[3];
};

donde en tu caso:

typedef BYTE unsigned char;

Así, la función te está pidiendo un unsigned char*, y tu le estás pasando como parámetro un struct Byteserie*. Ahí pudiese estar el problemo.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con Dll

Publicado por fernando.gomez (1603 intervenciones) el 22/07/2005 22:28:08
Ahora, tengo mis dudas de cómo le pasarías el parámetro desde VB. En principio, tendría que ser algo como:

Private Declare Function HY_Mifare_Select Lib "c:\prueba\ssse32.dll" (ByRef _
serial As Byte(), ByVal tipe As Long) As Long

Es decir pasarle el array de bytes a la función. Sin embargo, no es tan sencillo ya que los arrays de VB son componentes COM, así que si lo pasas tal cuál te tronaría.

Sinceramente nunca he trabajado con VB a ese nivel, siempre ha sido creando componentes COM en C++ y mandándolos llamar desde VB.

Me parece que podrías probar a lo mejor con:

Private Declare Function HY_Mifare_Select Lib "c:\prueba\ssse32.dll" (ByRef _
serial As Any, ByVal tipe As Long) As Long

Done serial sería de tipo Any, lo cuál te permite pasar búfers de memoria, que después podrías convertir al tipo VB apropiado --Byte--. Prueba a ver qué pasa, mientras yo investigo en CodeProject a ver qué encuentro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Ayuda con Dll

Publicado por iguane (2 intervenciones) el 23/07/2005 20:21:11
Mucha gracias por tu ayuda lo probare y te reenvio mis resultados, yo tambien sigo investigando por ahi.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Ayuda con Dll

Publicado por Mr. Sade (40 intervenciones) el 29/07/2005 12:21:41
lo mejor seria depurar la dll y ver que esta recibiendo.
pero segun veo tu codigo declaras type como un puntero en C y en VB lo declaras como un entero y lo pasas como valor.
cuando la Dll trata de acceder a este valor obviamente te dara error, trata declarando int type, pero como te repite la mejor forma es usando un depurardor como OllyDbg.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar