Domingo 22 de Diciembre de 2024, 08:09
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
CLR: .Net / Mono / Boo / Otros CLR
»
C#
(Moderador:
ProfesorX
) »
Cansado De Dllimport
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Cansado De Dllimport (Leído 4001 veces)
Neopro
Miembro MUY activo
Mensajes: 316
Cansado De Dllimport
«
en:
Jueves 12 de Abril de 2007, 17:41 »
0
Necesito su ayuda, he intendado 1000 formas de poder usar esto, y no hay caso, no comprendo bien aun esa funcion y esta el la funcion que debo llamar de una dll, por favor si alguien me puede decir como hacerlo:
Código: Text
FUNCION_TYPE int Convertir(
Mode_pr *mode,
void *eje,
void *cantidad,
void *inicio,
unsigned char *info,
ZoneFormat_pr formato,
unsigned char *partes,
unsigned char **retorno,
int *largo,
DataError_pr *error
);
Este codigo pertenece al header (*.h) de la DLL y es lo unico que deseo ejecutar.
Prefiero hacer todo el codigo nuevamente, lo que son los struct y enum los tengo bien declarados, pero mis dudas son los punteros * los void y parametros de regreso los que son los unsigned char.
Me pueden de decir como declarar las variables en C#, como usar el dllimport para ese codigo y como llamar la funcion?.
Por favor, disculpen lo cara dura, pero no encuentro la solucion.
Muchisimas gracias.
Tweet
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #1 en:
Lunes 16 de Abril de 2007, 21:29 »
0
Nadie me puede responder?, se que he molestado mucho con este tema, pero no he podido solucionarlo.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #2 en:
Lunes 16 de Abril de 2007, 21:41 »
0
no he tenido tiempo para revisarlo, tratare de hacerlo una de estas noches.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #3 en:
Lunes 16 de Abril de 2007, 21:46 »
0
Muchisimas gracias JuanK, sabes, se me olvido un detalle en el codigo, y es que los 7 primeros parámetros son de entrada (in) y los 3 ultimos de salida (out).
Y muchas gracias nuevamente
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #4 en:
Martes 17 de Abril de 2007, 03:45 »
0
bueno comencemos con que me envias la dll a mi correo please.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #5 en:
Martes 17 de Abril de 2007, 16:04 »
0
Ya te envie la DLL, ahora espero que te llegue de manera correcta, ya que no la envie como ZIP ni como RAR, avisame, gracias
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #6 en:
Jueves 19 de Abril de 2007, 14:45 »
0
me puedes enviar por favor el .h.
hablamos.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #7 en:
Jueves 19 de Abril de 2007, 15:44 »
0
Ok... esto me tiene afligido.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #8 en:
Viernes 20 de Abril de 2007, 04:07 »
0
Tentativamente esta es la manera aproximada, ya tu le colocas el maquillaje de lo de struct layout y esas cosas, para que compile debes habilitar en las propiedades del proyecto el check box de permitir código inseguro.
Código: Text
using System;
using System.Runtime.InteropServices;
namespace DllImportApp
{
unsafe class Program
{
public struct Bim_DataError
{
public Bim_DataErrorType bim_data_error_type;
public char* bim_data_error_explain;
}
public enum Bim_DataErrorType
{
BimDataError_NOTHING = 0,
BimDataError_AXIS_QUALITY = (-1),
BimDataError_AXIS_RANGE = (-2),
BimDataError_NUM_OF_MINUTIA = (-3),
BimDataError_ZONE_LENGTH = (-4),
BimDataError_MINUTIA_QUALITY= (-5),
BimDataError_MINUTIA_RANGE = (-6),
BimDataError_MINUTIA_RIDGE = (-7),
BimDataError_MINUTIA_NUMBER = (-8),
BimDataError_STOPPER = (-9),
BimDataError_OTHER = (-10),
BimDataError_ZONE_ADJUST = (-11)
}
public enum Bim_Check
{
eBimCheckNo,
eBimCheckYes,
eBimCheckMax
}
public enum Bim_Clear
{
eBimClearBCD_AxisNo,
eBimClearBCD_AxisYes,
eBimClearBCD_AxisMax
}
public enum Bim_Limit
{
eBimLimitNo,
eBimLimitYes,
eBimLimitMax
}
public enum AcmDbType:long{}
public struct Bim_Mode
{
public AcmDbType acm_db_tpye;
public Bim_Limit bim_limit;
public int num_limit;
public char* key_list;
public int key_list_len;
public Bim_Clear bim_clear;
public Bim_Check bim_check;
}
public enum Bim_ZoneFormat
{
eBimZoneFormat_32x32_1bit = 1,
eBimZoneFormat_32x32_2bit = 2,
eBimZoneFormat_32x32_8bit = 3,
eBimZoneFormat_40x32_1bit = 4,
eBimZoneFormat_40x32_2bit = 5,
eBimZoneFormat_40x32_8bit = 6,
eBimZoneFormat_Max = 7
}
[DllImport("Bimcot.dll", EntryPoint = "Bim_FIStoFMP5", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern bool Bim_FIStoFMP5(
Bim_Mode bim_mode,
void* i_a_axis,
void* i_qu,
void* i_mno,
char* i_zdata,
Bim_ZoneFormat i_format,
char* i_mpart,
char** o_fmp5,
int* o_fmp5_len,
Bim_DataError bim_data_error
);
static void Main(string[] args)
{
Console.WriteLine("usar el metodo");
}
}
}
Ya tu sabras para que y como necesitas llamar el metodo, pues dale y cualquier cosa me cuentas y lo seguimos trabajando.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #9 en:
Viernes 20 de Abril de 2007, 04:59 »
0
Muchisimas gracias, ahora vengo recien llegando, asi que mañana te cuento, mucho trabajo.
Te pasaste, insisto, muchisimas gracias.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #10 en:
Viernes 20 de Abril de 2007, 16:41 »
0
Hola JuanK, ya le agregue las cosas que me decias, pero la llamada a la funcion me indica "La firma no es compatible con interoperabilidad en el parametro 8" y no evalua nada mas.
La funcion que estoy utilizando es la siguiente:
Código: Text
Bim_FIStoFMP5(bim_mode2, &i_a_axis2, &i_qu2, &i_mno2, i_zdata2, i_format, i_impart2, o_fmp52, o_fmp5_len2, bim_data_error2);
Y las declaraciones de variables son, ya que esas son las declaraciones y valores que deben llevar por defecto para que se incialize:
Código: Text
unsafe
{
char texto = '\0';
Bim_Mode bim_mode2;
bim_mode2.acm_db_tpye = AcmDbType.ACM_DB_TYPE_RDB_L;
bim_mode2.bim_limit = Bim_Limit.eBimLimitYes;
bim_mode2.num_limit = 63;
bim_mode2.key_list = &texto;
bim_mode2.key_list_len = 0;
bim_mode2.bim_clear = Bim_Clear.eBimClearBCD_AxisYes;
bim_mode2.bim_check = Bim_Check.eBimCheckNo;
try{
void* i_a_axis2, i_qu2, i_mno2;
byte*[] i_impart2;
Bim_ZoneFormat i_format = new Bim_ZoneFormat();
i_format = Bim_ZoneFormat.eBimZoneFormat_32x32_2bit;
char**[] o_fmp52;
int*[] o_fmp5_len2;
i_impart2 = new byte*[1600];
o_fmp5_len2 = new int*[10];
o_fmp52 = new char**[1600];
Bim_DataError bim_data_error2 = new Bim_DataError();
fixed (byte* i_zdata2 = &imagen[0])
{
Bim_FIStoFMP5(bim_mode2, &i_a_axis2, &i_qu2, &i_mno2, i_zdata2, i_format, i_impart2, o_fmp52, o_fmp5_len2, bim_data_error2);
}
}
catch (Exception e)
{
MessageBox.Show("Error = " + e, "Error de parametro");
}
}
Debi cambiar variables char por byte, ya que asi me es posible trabajar con los unsigned char y la llamada a DllImport me quedó de la siguiente manera, tambien le cambie el tipo bool por int, ya que me retorna un valor entero o -1.
Código: Text
[DllImport("Bimcot.dll", EntryPoint = "Bim_FIStoFMP5", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int Bim_FIStoFMP5(
Bim_Mode bim_mode,
void* i_a_axis,
void* i_qu,
void* i_mno,
byte* i_zdata,
Bim_ZoneFormat i_format,
byte*[] i_mpart,
char**[] o_fmp5,
int*[] o_fmp5_len,
Bim_DataError bim_data_error
);
También debi agregar un enum, o sea ingresar esos datos:
Código: Text
public enum AcmDbType : long
{
ACM_DB_TYPE_RDB_T = 0x01,
ACM_DB_TYPE_RDB_L = 0x02,
ACM_DB_TYPE_LDB = 0x04,
ACM_DB_TYPE_EXTRA = 0x08,
ACM_DB_TYPE_SDBL = 0x10,
ACM_DB_TYPE_MAX = 5,
}
Muchas gracias por las molestias.
Atte.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #11 en:
Viernes 20 de Abril de 2007, 18:55 »
0
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>
XCODE
</td></tr><tr><td id='XCODE'><!--exc1--> [DllImport("Bimcot.dll", EntryPoint = "Bim_FIStoFMP5", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int Bim_FIStoFMP5(
Bim_Mode bim_mode,
void* i_a_axis,
void* i_qu,
void* i_mno,
byte* i_zdata,
Bim_ZoneFormat i_format,
byte*[] i_mpart,
char**[] o_fmp5,
int*[] o_fmp5_len,
Bim_DataError bim_data_error
);<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
revisa esas, no me convencen.
char en C# ya es por defecto unsigned puesto que no hay unsigned char, y byte para ser unsigned debe ser ubyte. Respecto a los punteros para el caso de
char**[]
eso es el equivalente a
char***
asi que pilas...
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #12 en:
Viernes 20 de Abril de 2007, 18:57 »
0
Y si eso es equivalente:
Código: Text
char*** a char**[]
Como hago para poder hacer una referencia a una cadena byte[]
Y
Que piensas del resto del codigo y como ves la llamada a la función?.
Y en el fixed debe ser byte, porq lo que ingresa es un arreglo de bytes. Si no no me permite asignar el byte[0].
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #13 en:
Viernes 20 de Abril de 2007, 19:32 »
0
Cita de: "Neopro"
Como hago para poder hacer una referencia a una cadena byte[]
byte*
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #14 en:
Viernes 20 de Abril de 2007, 21:07 »
0
Me dice que debe tener un valor dentro de los corchetes.
De las siguiente forma no me reclama
Código: Text
byte*[2000]
Viste mi llamada a funcion?, como crees que estaba, me compila bien, pero quiza pueda haber un error de ejecución.
Muchas gracias.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #15 en:
Sábado 21 de Abril de 2007, 23:42 »
0
ASI 'COMPILA'.
No e he hecho pruebas extensas no se que quieres guardar en imagen.
Código: Text
unsafe class Program
{
public struct Bim_DataError
{
public Bim_DataErrorType bim_data_error_type;
public char* bim_data_error_explain;
}
public enum Bim_DataErrorType
{
BimDataError_NOTHING = 0,
BimDataError_AXIS_QUALITY = (-1),
BimDataError_AXIS_RANGE = (-2),
BimDataError_NUM_OF_MINUTIA = (-3),
BimDataError_ZONE_LENGTH = (-4),
BimDataError_MINUTIA_QUALITY= (-5),
BimDataError_MINUTIA_RANGE = (-6),
BimDataError_MINUTIA_RIDGE = (-7),
BimDataError_MINUTIA_NUMBER = (-8),
BimDataError_STOPPER = (-9),
BimDataError_OTHER = (-10),
BimDataError_ZONE_ADJUST = (-11)
}
public enum Bim_Check
{
eBimCheckNo,
eBimCheckYes,
eBimCheckMax
}
public enum Bim_Clear
{
eBimClearBCD_AxisNo,
eBimClearBCD_AxisYes,
eBimClearBCD_AxisMax
}
public enum Bim_Limit
{
eBimLimitNo,
eBimLimitYes,
eBimLimitMax
}
public enum AcmDbType : long
{
ACM_DB_TYPE_RDB_T = 0x01,
ACM_DB_TYPE_RDB_L = 0x02,
ACM_DB_TYPE_LDB = 0x04,
ACM_DB_TYPE_EXTRA = 0x08,
ACM_DB_TYPE_SDBL = 0x10,
ACM_DB_TYPE_MAX = 5,
}
public struct Bim_Mode
{
public AcmDbType acm_db_tpye;
public Bim_Limit bim_limit;
public int num_limit;
public char* key_list;
public int key_list_len;
public Bim_Clear bim_clear;
public Bim_Check bim_check;
}
public enum Bim_ZoneFormat
{
eBimZoneFormat_32x32_1bit = 1,
eBimZoneFormat_32x32_2bit = 2,
eBimZoneFormat_32x32_8bit = 3,
eBimZoneFormat_40x32_1bit = 4,
eBimZoneFormat_40x32_2bit = 5,
eBimZoneFormat_40x32_8bit = 6,
eBimZoneFormat_Max = 7
}
[DllImport("Bimcot.dll", EntryPoint = "Bim_FIStoFMP5", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern bool Bim_FIStoFMP5(
Bim_Mode bim_mode,
void* i_a_axis,
void* i_qu,
void* i_mno,
char* i_zdata,
Bim_ZoneFormat i_format,
char[] i_mpart,
char[][] o_fmp5,
int[] o_fmp5_len,
Bim_DataError bim_data_error
);
static void Main(string[] args)
{
unsafe
{
char texto = '\0';
Bim_Mode bim_mode2;
bim_mode2.acm_db_tpye = AcmDbType.ACM_DB_TYPE_RDB_L;
bim_mode2.bim_limit = Bim_Limit.eBimLimitYes;
bim_mode2.num_limit = 63;
bim_mode2.key_list = &texto;
bim_mode2.key_list_len = 0;
bim_mode2.bim_clear = Bim_Clear.eBimClearBCD_AxisYes;
bim_mode2.bim_check = Bim_Check.eBimCheckNo;
try
{
void* i_a_axis2, i_qu2, i_mno2;
char[] i_impart2;
Bim_ZoneFormat i_format = new Bim_ZoneFormat();
i_format = Bim_ZoneFormat.eBimZoneFormat_32x32_2bit;
char[][] o_fmp52;
int[] o_fmp5_len2;
i_impart2 = new char[1600];
o_fmp5_len2 = new int[10];
o_fmp52 = new char[1600][];
Bim_DataError bim_data_error2 = new Bim_DataError();
char* i_zdata2 = null;
/*fixed (char* i_zdata2 = &imagen[0])*/
{
Bim_FIStoFMP5(bim_mode2, &i_a_axis2, &i_qu2, &i_mno2, i_zdata2, i_format, i_impart2, o_fmp52, o_fmp5_len2, bim_data_error2);
}
}
catch (Exception e)
{
Console.WriteLine("Error = " + e, "Error de parametro");
}
}
}
}
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #16 en:
Lunes 23 de Abril de 2007, 16:10 »
0
Imagen es una imágen obtenida de un dispositivo.
Claro que ese "Imagen" es una imagen en RAW, por lo que en C# se trabaja como un byte[78000].
Voy a hacerle un cast o alguna transformación para poder obtenerlo en Char. y asi probare tu codigo.
El mio compilaba, pero al ejecutar en enviaba valores errados o me indicaba:
"La firma no es compatible con interoperabilidad en el parametro 8"
//////////////////////////////////////////////////
Nuevo Error:
"No se puede calcular la referencia de 'parameter #8': No se admite el calculo para matrices anidadas.
//////////////////////////////////////////////////
Y si cambio el char[][] por char[] me envia el siguiente error:
"Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada."
Ya tengo convertido el byte[] a char[]
///////////////////////////////////////////////////
No se con cual mensaje estoy mas cerca de la solucion.
Y curiosamente, hay una funcion que muestra la version, que debiera mostrar un char, pero al colocarla como string funciona a la perfección.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #17 en:
Martes 24 de Abril de 2007, 21:19 »
0
Al final logré que funcionara, pero si no hubiera sido por Ti, creo que no lo habría logrado.
Muchas gracias JuanK por toda tu ayuda.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
JuanK
Miembro de ORO
Mensajes: 5393
Nacionalidad:
Re: Cansado De Dllimport
«
Respuesta #18 en:
Martes 24 de Abril de 2007, 21:24 »
0
Y COMO QUEDO?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io
Neopro
Miembro MUY activo
Mensajes: 316
Re: Cansado De Dllimport
«
Respuesta #19 en:
Martes 24 de Abril de 2007, 21:38 »
0
La llamada a la DLL
Código: Text
[DllImport("Bimcot.dll", EntryPoint = "Bim_FIStoFMP5", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern int Bim_FIStoFMP5(
Bim_Mode* bim_mode,
out FisCore i_a_axis,
out FisQuality i_qu,
FisMinutiaNo* i_mno,
char[] i_zdata,
Bim_ZoneFormat i_format,
char[] i_mpart,
char* o_fmp5,
int* o_fmp5_len,
Bim_DataError* bim_data_error
);
La declaracion de las variables
Código: Text
char texto = '\0';
Bim_Mode bim_mode2;
bim_mode2.acm_db_tpye = AcmDbType.ACM_DB_TYPE_RDB_L;
bim_mode2.bim_limit = Bim_Limit.eBimLimitYes;
bim_mode2.num_limit = 63;
bim_mode2.key_list = &texto;
bim_mode2.key_list_len = 0;
bim_mode2.bim_clear = Bim_Clear.eBimClearBCD_AxisYes;
bim_mode2.bim_check = Bim_Check.eBimCheckNo;
FisCore o_core;
FisQuality o_qu;
FisMinutiaNo o_mno;
char[] o_zdata = new char[256]; /* fix size */
char[] o_mpart = new char[16*256]; /* fix size */
Bim_ZoneFormat i_format = new Bim_ZoneFormat();
i_format = Bim_ZoneFormat.eBimZoneFormat_32x32_2bit;
char o_fmp52;
int o_fmp5_len2;
Bim_DataError bim_data_error2 = new Bim_DataError();
La llamada a la funcion:
Código: Text
int h = Bim_FIStoFMP5(&bim_mode2, out o_core, out o_qu, &o_mno, o_zdata, i_format, o_mpart, &o_fmp52, &o_fmp5_len2, &bim_data_error2);
El resto son los tipos o sea STRUCT y ENUM que estan igual como los colocaste Tu en el codigo que pusiste. Aunque habian cosas que faltaban de las que no me habia percatado.
[size=109]
"Has lo que digo y no hagas lo que hago"
[/size]
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
CLR: .Net / Mono / Boo / Otros CLR
»
C#
(Moderador:
ProfesorX
) »
Cansado De Dllimport