• Jueves 18 de Abril de 2024, 21:53

Autor Tema:  Heap problem (Dll en C y programa en C#)  (Leído 2637 veces)

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Heap problem (Dll en C y programa en C#)
« en: Viernes 31 de Octubre de 2008, 11:34 »
0
Estoy teniendo un problema algo raro con C#, creo que nunca me había pasado. El tema es el siguiente:

En C programé una Dll para poder trabajar cómodamente con la API's y hacer trabajos de más bajo nivel. Esta Dll relocalta información y la guarda en una string. Esta string, al terminar el proceso es transferida a mi programa en C# para interpretarla en un Form.

El problema esta que al cerrar el Formulario para cerrar así el programa, me muestra un error sobre _CrtIsValidHeapPointer. La Dll estaba en modo Debug, así que pensé en generarla a modo Release, pero al llamar a la función en C# ya me da error, ni siquiera puedo llamar a la función (en modo Debug todo iba bien hasta que cerraba el programa o volvía a llamar a la función).

La string en la Dll es un puntero a carácter, que lo voy redimendionando con realloc según la información que se tenga que guardar.

Pensé en crear otra función en la Dll para limpiar la memoria, pero me da error al llamarla  :blink:

Espero que alguien me pueda ayudar.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Heap problem (Dll en C y programa en C#)
« Respuesta #1 en: Viernes 31 de Octubre de 2008, 11:37 »
0
¿Estas reservando la memoria en la DLL y liberandola en otro lado? Eso nunca funcionara por usar HEAPs diferentes, la RTL crea un HEAP privado cuando se incializa. Veo dos opciones sin pensar mucho:

A. Reservas y liberas en la DLL.
B. Reservas y liberas usando el mismo HEAP.

El HEAP es el primer parametro que se le pasa a las funciones de la familia Heap (HeapCreate, HeapAlloc, HeapFree, HeapDestroy, HeapReAlloc, etc).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Heap problem (Dll en C y programa en C#)
« Respuesta #2 en: Viernes 31 de Octubre de 2008, 12:03 »
0
Cita de: "Eternal Idol"
¿Estas reservando la memoria en la DLL y liberandola en otro lado?


No, cree una función dentro de la misma Dll para poder liberar la memoria, y la utilizaba asi en C#:

Código: Text
  1.  
  2. string resultado;
  3.  
  4. resultado = Funcion1(parametro);
  5. if(resultado)
  6. {
  7.         LiberarMemoria();
  8. }
  9.  
  10.  

Pero al llamar a liberarmemoria me daba error (no en la Dll, sino dentro del C#).

Ya te digo, nunca me habia pasado esto, alomejor es por usar una función que retorna una string en la Dll (la declaro como char * Funcion1).

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Heap problem (Dll en C y programa en C#)
« Respuesta #3 en: Viernes 31 de Octubre de 2008, 12:06 »
0
Al llamar a la función de liberar memoria no da error, pero no creo que limpie nada. Lo que me ocurre ahora es que me da error al volver a consultar la primera función.

Para liberar memoria uso free().

Tendre que pensar en otro metodo para transferir datos, alomejor con pipes...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Heap problem (Dll en C y programa en C#)
« Respuesta #4 en: Viernes 31 de Octubre de 2008, 12:33 »
0
Los dos ultimos mensajes son contradictorios  :beer: No se donde da el error al final de cuentas pero trata de depurarlo y fijarte cuando se reserva, cuando se destruye la memoria, y que hace el codigo de C# con ella, espero que no este tratando de liberar esa direccion con un HEAP propio.

Seria interesante saber que hace esto y si despues de llamar a LiberarMemoria seguis usando a resultado:
Código: Text
  1. resultado = Funcion1(parametro);
  2.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Zirrosis

  • Miembro activo
  • **
  • Mensajes: 97
    • Ver Perfil
Re: Heap problem (Dll en C y programa en C#)
« Respuesta #5 en: Viernes 31 de Octubre de 2008, 12:45 »
0
Aquí te dejo el código que uso:

Código: Text
  1.  
  2.  
  3. //Variable global
  4. char* Returner;
  5.  
  6. //(...) Resto del codigo
  7.  
  8. extern "C" __declspec(dllexport) char* Global(int pid)
  9. {
  10.     NowPid = pid;
  11.     Returner = (char*)calloc(2,sizeof(char));
  12.     strcpy(Returner,"|");
  13.     ReadIAT(pid);
  14.  
  15.     return Returner;
  16. }
  17.  
  18. extern "C" __declspec(dllexport) void LiberaMem()
  19. {
  20.     free(Returner);
  21. }
  22.  
  23.  

La primera función es la que recibe el pid del proceso, redimensiona el Returner, le da formato para el filtro en C# y llama a otra función, esta lo que hace es redimensionar y añadir datos dentro de un while. Al terminar, retorna el Returner con todos los datos.

Como ves, la otra llamara es para liberar ese espacio que se guardo con calloc y realloc.

El codigo en C# que hay dentor de cada evento de click del boton de la aplicación es:

Código: Text
  1.  
  2. string resultado = HookDetect(pid);
  3. LiberaMem();
  4. string[] b = resultado.Split('|');
  5.  

Al transferir una cadena corta no da errores, pero al transferir una cadena de unos 38 caracteres ya da error.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Heap problem (Dll en C y programa en C#)
« Respuesta #6 en: Viernes 31 de Octubre de 2008, 13:48 »
0
Asi a simple vista no se, pone los prototipos y como estas importando las funciones de la DLL. Y si podes poner la minima expresion de codigo compilable - aunque no tenga nada que ver con el programa - de C y C# que genere el problema mejor.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.