Parámetros por referencia de C# a C

21/12/2006 - 10:29 por moga | Informe spam
Hola,
Tengo una libreria en C que va a ser usada desde una plicación C#.

Esta librería en C tiene un método con parámetros pasados por
referéncia. Es decir, que la función actualizará los valores de esos
parámetros y esos cambios seran recogidos desde la aplicació en C#.

La librería C, (libreria.dll):
DllExport void pruebaChar(char **p_datos) {
strcpy(*p_datos, "hola");
}


Desde C# este método se usa así:

[DllImport(baseDir + "libreria.dll")]
unsafe private static extern void pruebaChar(char **p_datos);

public static string pruebaReferChar() {
unsafe {
char* pal = stackalloc char[10];

pruebaChar(&pal);
return new string(pal, 0, 10);
}
}

El caso es que, al llamar a pruebaChar(&pal) ocurre una excepción de
corrupción de memória, o bien devuelve datos inesperados.

Por favor, alguien podria orientarme sobre que hago mal?

Saludos,
Jose Luis

Preguntas similare

Leer las respuestas

#6 moga
21/12/2006 - 16:24 | Informe spam
me respondo a mi mismo:

En C:
DllExport void triaParaula2(LPSTR buffer, DWORD size) {
memset(buffer, '\0', size);
memcpy(buffer, "hola!", 5);
}


En C#:
[DllImport(baseDir + "diccio_pred.dll")]
private static extern void triaParaula2(StringBuilder buffer,
int size);
public static string triaReferParaula2() {
StringBuilder str = new StringBuilder(10);
triaParaula2(str, 10);

return str.ToString();
}


Y funciona!!! Hasta que deje de hacerlo!!

Gracias sharpman por la ayuda.

Saludos,
Jose Luis
Respuesta Responder a este mensaje
#7 Antonio Ortiz
21/12/2006 - 17:02 | Informe spam
A simple vista parece que el problema es que estas cambiando el valor del
apuntador y no el dato, pues utiizas un apuntador doble (apuntador a un
apuntador), intenta utilizando 1 asterisco.

DllExport void pruebaChar(char *p_datos) {
strcpy(*p_datos, "hola");
}

[DllImport(baseDir + "libreria.dll")]
unsafe private static extern void pruebaChar(char **p_datos);

public static string pruebaReferChar() {
unsafe {
char* pal = stackalloc char[10];

pruebaChar(pal);
return new string(pal, 0, 10);
}
}


suerte,

Antonio Ortiz
asesor en sistemas
ant(a)aortiz.net
www.aortiz.net
www.progvisual.com


"moga" escribió en el mensaje
news:
Hola,
Tengo una libreria en C que va a ser usada desde una plicación C#.

Esta librería en C tiene un método con parámetros pasados por
referéncia. Es decir, que la función actualizará los valores de esos
parámetros y esos cambios seran recogidos desde la aplicació en C#.

La librería C, (libreria.dll):
DllExport void pruebaChar(char **p_datos) {
strcpy(*p_datos, "hola");
}


Desde C# este método se usa así:

[DllImport(baseDir + "libreria.dll")]
unsafe private static extern void pruebaChar(char **p_datos);

public static string pruebaReferChar() {
unsafe {
char* pal = stackalloc char[10];

pruebaChar(&pal);
return new string(pal, 0, 10);
}
}

El caso es que, al llamar a pruebaChar(&pal) ocurre una excepción de
corrupción de memória, o bien devuelve datos inesperados.

Por favor, alguien podria orientarme sobre que hago mal?

Saludos,
Jose Luis
Respuesta Responder a este mensaje
#8 moga
22/12/2006 - 08:07 | Informe spam
Mejor aún:

En la librería C:
DllExport void triaParaula(char **p_datos) {
char *cadena;
cadena = (char *)malloc(10*sizeof(char));
strcpy(cadena, "Hola");

memset(p_datos, '\0', 10);
memcpy(p_datos, cadena, 4);
}

De esta forma no hay que cambiar los tipos de los parámetros de la
función.

Saludos,
Jose Luis
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida