Manuel: he intentado hacer la prueba que dices del StringBuilder. Te cuento.
Efectivamente el problema creo que viene de ahí: al declararlo como string, antes no lo inicializábamos y por tanto no había memoria pedida para ello.
Los objetos string son inmutables y no se puede escribir en ellos.
En una versión antigua de PerfectRaw (que llamaba a GetInfo para obtener el modelo de cámara) he intentado hacer lo siguiente:
Declarando los campos de IMAGE_INFO como StringBuilder, en dcraw.cs modifiqué GetInfo de la siguiente forma:
Código:
publicvoid GetInfo()
{
info.timestamp = newStringBuilder(200);
info.camera_make = newStringBuilder(200);
info.camera_model = newStringBuilder(200);
info.artist = newStringBuilder(200);
info.filter_pattern = newStringBuilder(200);
DCRAW_GetInfo(ref info);
}
Al utilizar el depurador, después de llamar a DCRAW_GetInfo, se produce el siguiente error:
Código:
No se controló TypeLoadException:
No se puede calcular la referencia del campo 'timestamp' del tipo 'IMAGE_INFO': El campo de clase o el campo de estructura no puede ser del tipo StringBuilder. Normalmente se puede conseguir el mismo efecto utilizando un campo String y realizando una inicialización previa de éste en una cadena con una longitud que coincida con la longitud del búfer apropiado.
Esto parece que lo producen las funciones de reflexión de C# al ver que el tipo es StringBuilder en vez de string.
Intenté seguir el consejo que dan, declarando todo como string e inicializando en GetInfo las cadenas como sigue:
Código:
publicvoid GetInfo()
{
info.timestamp = newstring(' ',200);
info.camera_make = newstring(' ', 200);
info.camera_model = newstring(' ', 200);
info.artist = newstring(' ', 200);
info.filter_pattern = newstring(' ', 200);
DCRAW_GetInfo(ref info);
}
Pero entonces se produce una excepción de acceso a memoria protegida al volver de DCRAW_GetInfo
Código:
No se controló una excepción del tipo AccessViolationException:
Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada.
Parece que el problema radica en lo que tú dices, pero el stringbuilder no es un tipo que C# parezca saber pasar a las funciones de C.
Habrá que mirar un poco más el tema.
De todas formas hay algo que no entiendo: Si en C se pide internamente memoria para las variables con malloc, esa memoria ¿quién la libera?
Al pasar la estructura de vuelta, la máquina virtual debería de copiar las cadenas en un nuevo buffer de caracteres Unicode pidiendo memoria y luego liberar la anterior.
Pero pobablemente eso no lo haga, pues no sabe si hemos pedido memoria con mallo o es memora estática.
De ahí seguramente viene todo el lío.
Quizás habría que redefinir la estructura en C con char definidos como campos de ancho fijo:
char camera[200] en vez de como char*
¿no crees?
Luego en C# habría que definirlo como una cadena de ancho fijo.
Eso podría solucionar el problema ¿no crees?
No digo que estés tardando mucho, no me malinterpretes, fue culpa mía que en su momento, debí haber fusionado lo que teníamos y haber subido el resultado en paralelo a que tú lo siguieras mejorando.
Sí, sí que estoy tardando mucho, ya os he dicho que en la última semana casi no he tocado nada de PerfectRaw y os he seguido un poco de lejos.
A ver si la semana que viene (después de venir de Madrid) me vuelvo a meter con esto, pero he andado liado.
Además como dije, me he enzafarrado con el tema de los zooms y varios cambios que se habían propuesto y ahora estoy en un punto que "ni pa trás ni palante": ni puedo recuperar las cosas tal cuál estaban cuando más o menos funcionaban y para seguir adelante tengo que implementar lo del zoom completo, integrándolo con lo de las transformaciones de dibujo de C# para poder dibujar las elipses de selección.
Bueno es cuestión de dedicarle un par de días a fondo y lo tendré todo funcionando, pero mientras tanto...
Esto me pasa por no ser previsor y guardar una versión funcional antes de meterme a seguir integrando cosas nuevas 

Pero bueno, veo que tú sigues para adelante y el programa tiene una buena funcionalidad, aunque el interface no sea el deseado.
Tampoco es que haya puesto nueva funcionalidad al programa, es que al hacer cambios en lo de los zooms surgió de forma natural.
El que sí que ha avanzado mucho en nuevas funciones eres tú, que he visto que tienes nuevos algoritmos para eliminación de laberintos y muchas otras cosas
¡¡Enhorabuena!!
Marcadores