PDA

Ver la versión completa : Problemas de funcionamiento con Windows Vista 64 bits



ariznaf
10/05/2008, 11:40
En este hilo (http://www.ojodigital.com/foro/showthread.php?t=202002&page=2)había comentado que el programa de prueba puesto por ManuelLlorens no me funcionaba en Vista 64 bits.
Lo he sacado del hilo para no seguir mezclando teman en él.
Este es el mensaje original:



Manual:
No me funciona la versión del programa de prueba que pusiste esta mañana.
Descomprimí el fichero y copie la dll y el exe directamente en el escritorio.

Lancé el programa y utilicé el browse para abrir un dng.
Al dar al botón de revelado me aparece el siguiente error:
Cita:
Consulte el final de este mensaje para obtener más detalles sobre cómo invocar a la depuración
Just-In-Time (JIT) en lugar de a este cuadro de diálogo.
************** Texto de la excepción **************
System.BadImageFormatException: Se ha intentado cargar un programa con un formato incorrecto. (Excepción de HRESULT: 0x8007000B)
en DCRAwGUI.Form1.DCRAW_Init(String rawfile, Int32* Width, Int32* Height)
en DCRAwGUI.Form1.button1_Click(Object sender, EventArgs e)
en System.Windows.Forms.Control.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
en System.Windows.Forms.Control.WndProc(Message& m)
en System.Windows.Forms.ButtonBase.WndProc(Message& m)
en System.Windows.Forms.Button.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
en System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

.........
Parece que el formato de la DLL no es apropiado.
Ten en cuenta que yo estoy utilizando Vista 64.
De todas formas no entiendo muy bien el error, porque el programa se supone que es de 32 bits y la librería también, por tanto al cargar la librería dinámica debería de tratarla como una de 32 bits (que es lo que es).
Los programas de 32 bits funcionan perfectamente en Vista, no sé por qué este ha de dar un error.
_________________________________
Puedes mirar más información sobre la excepdión en MSDN: http://msdn.microsoft.com/es-es/libr...on(VS.80).aspx (http://msdn.microsoft.com/es-es/library/system.badimageformatexception(VS.80).aspx)

Parece que el error se produce al cargar con Load código no administrado.
Efectivamente la dll es código no administrado, pero para eso habías puesto las declaraciones y el import de la librería ¿no?
Si en win32 te funciona, no sé por qué ha de dar un problema en win64


Manuel me contestó en ese mismo hilo:


Desde luego el problema no está con el Vista, sino con el 64, por que _GUI_ tiene un Vista 32 y le funciona. Mira a ver si el los foros de DEV C++/MinGW encuentras algo sobre cómo hacer que corra en 64 mientras logro recompilar con cygwin. Por cierto, ¿te funciona el ejecutable genérico (desde casa lo deberías poder descargar desde este enlace (http://www.llorensvazquez.jazztel.es/dcraw.exe)) de nuestro dcraw?

Voy a seguir poniendo en orden el proyecto cambiando el FTP y subiendo el código a Google Code.

Un saludo:


Efectivamente, creo que el problema está en los 64 bits, aunque no sé muy bien por qué.
En cuanto pueda intentaré compilar el ejecutable como me dices.

En casa el enlace sí que me funciona y lo he podido descargar, pero el programa no funciona.
Como dije anteriormente tengo el error de BadFormatException cuando le doy al botón de Revelar (es decir cuando intenta cargar la librería de 32 bits dcRaw_DLL.dll.

Por cierto, ahora que lo pienso... ¡¡Es el mismo error que me daba a mi con la dll de prueba que creé yo para probar lo de capturar la salida stdout!!

mmmm... estoy un poco sin ideas. No es posible que Vista 64 no pueda cargar dll de 32 bits porque entonces no funcionarían el 99% de los programas existentes.

Algo se me escapa, per no sé que puede ser.
_________________________________
Bueno, ¡Feliz fin de semana!
Me voy de fin de semana.
Seguro que cuando vuelva a conectarme ya no tendrá nada que hacer porque ya habréis acabado el programa xD

ManuelLlorens
10/05/2008, 11:55
Bájate DEV C++ desde este enlace (http://prdownloads.sourceforge.net/dev-cpp/devcpp-4.9.9.2_setup.exe). Lo instalas, creas un proyecto de consola en C o en C++ con todo por defecto y ejecutas a ver si va. Si va entonces se arreglará recompilando en tu máquina la DLL, si no va habrá que bucear en los foros de DEV C++ o de MinGW a ver qué dice de usarlo en Vista 64.

Otras opciones incluyen pasarlo a cygwin, en ello estoy, pasarlo a VC++ o que te instales en tu máquina una virtual con un XP y pruebas ahí dentro, es cutre, pero funcionaría de momento.

Un saludo:

Eduardo Cañadas
11/05/2008, 15:05
En Windows Vista 64, parece que DEV C++ no funciona bien, al compilar siempre me da el siguienter error:

Compiler: Default compiler
Building Makefile: "C:\dcraw\Makefile.win"
Executing make...
make.exe -f "C:\dcraw\Makefile.win" all
gcc.exe -c dll.c -o dll.o -I"C:/Dev-Cpp/include" -DBUILDING_DLL=1 -lm -DNO_LCMS -DNO_JPEG -D_MINGW_ -w -fexpensive-optimizations -O1

gcc.exe: installation problem, cannot exec `cc1': No such file or directory

make.exe: *** [dll.o] Error 1

Execution terminated


Al final estoy compilando con Window XP en una maquina virtual.

ariznaf
11/05/2008, 20:14
Eduardo, ese error parece que se debe a que el gcc itenta lanzar otro proceso que no encuentra (cc1 seguramente sea el preprocesador del compilador de C). Comprueba que cc1.exe esté en el directorio donde se instala el compilador. Si está comprueba que el direcotior esté en el path (variable de entorno PATH).
_________________________________
Yo tengo el mismo problema, compilando desde el entorno DEV-C++
cc1.exe están dentro del subdirectorio de Dev-C++ en libexec\mingwin\gcc\3.4.2
Por algún motivo parece que el compilador de gcc no va a buscarlo en ese directorio, que es diferente de donde se encuentra el propio gcc (en el subdirectorio bin).
_________________________________
Creo que ya sé por qué no funciona en Vista 64 bits.
Según he estado leyendo, en Vista 64 (y creo que también en XP 64) una aplicación de 32 bits sólo puede cargar dll de 32 bits y una aplicación de 64 bits sólo puede cargar dll de 64 bits.

Ahora bien, dcraw_dll es de 32 bits (la hemos compilado para 32 bits), pero perfectRAW ¡¡ES DE 64 BITS!!
Bueno en realidad no es de 32 ni de 64, es un byte code de una máquina virtual que funciona por tanto en cualquier tipo de arquitectura que la soporte.
Pero la máquina virtual que corre la aplicación C# (perfectRaw en este caso) en Vista 64 es lógicamente de 64 bits (.NET framework tiene instalaciones separadas para 64 bits).
Por tanto dicha máquina virtual no puede cargar código de 32 bits.

La solución pasa por convertir dcraw a 64 bits (compilarlo como código de 64 bits).
Ese en VS C++ es fácil, basta con activar la opción de generar código de 64 bits.
El problema está en que no he conseguido compilar dcraw en VS. Me da un montón de errores (aunque he activado la opción de compilación de interpretar el código como C y no como C++). Me da errores de redefinición de macros, warnings de converiónd e double a float y un montón de cosas más.

¿Puede Dev-C++ generar código de 64 bits?

ManuelLlorens
12/05/2008, 00:50
El problema está en que no he conseguido compilar dcraw en VS. Me da un montón de errores (aunque he activado la opción de compilación de interpretar el código como C y no como C++). Me da errores de redefinición de macros, warnings de converiónd e double a float y un montón de cosas más.
Yo avancé hasta conseguir compilarlo, puse las instrucciones en este foro (http://www.ojodigital.com/foro/showthread.php?p=2116039#post2116039). Sin embargo, luego no funciona bien, pero creo debe ser una tontería. Si te animas tendrás buena parte del trabajo hecho.


¿Puede Dev-C++ generar código de 64 bits?
Casi seguro que no.

ariznaf
12/05/2008, 01:14
Yo avancé hasta conseguir compilarlo, puse las instrucciones en este foro (http://www.ojodigital.com/foro/showthread.php?p=2116039#post2116039). Sin embargo, luego no funciona bien, pero creo debe ser una tontería. Si te animas tendrás buena parte del trabajo hecho.


Pues lo intentaré a ver si lo consigo compilar y que funcione, porque sino no voy a poder correrlo en mi ordenador.

Para comprobar lo que he dicho sobre las DLL de 32 bits que no funcionan en .NET para 64 bits, voy a probar a crear una DLL simple y un proyecto .NET que la cargue. La compilaré para 32 y 64 bits y probaré.

Por cierto, he probado perfectRAW en Vista 32 (en el ordenador de mis hijas) y sí que ha funcionado.
_________________________________
Tal y como comenté el problema parece estar en la Máquina virtual CLR de Microsoft.
He encontrado en MSDN un artículo que habla sobre este problema (al final del artículo) y la creación de una DLL en 64 bits.

Parece ser que desde .NET Framework 2.0 la máquina virtual en Vista 64 es de 64 bits.
La máquina de 64 bits no puede cargar dll de 32 bits.
Pero existe una opción de compilación /platform en C# (en el los lenguajes .NET) que fuerza a que el ejecutable sea cargado en la máquina de 32 bits bajo WOW64.

Puedes leer más sobre el tema en este enlace http://msdn.microsoft.com/en-us/magazine/cc300794.aspx

Como recompilar las DLL en 64 bits puede ser más delicado, hasta que se haga el port de la DLL creo que lo mejor será probar con esta opción de recompilación.
Probaré a añadirla al proyecto de PerfectRaw.

Eduardo Cañadas
12/05/2008, 23:04
Ya he conseguido compilar DCRAW en Vista 64 con Dev-C++.

Se tiene que configurar Dev-C++ como indican en esta pagina

http://acatlangrafico.files.wordpress.com/2008/03/vista.pdf

Tambien en los proyectos, se tienen que indicar las rutas completas de todos los ficheros y directorios.

ariznaf
12/05/2008, 23:33
Gracias, Eduardo:
con eso que comentas ya he podido compilar el dcraw.

ManuelLlorens
12/05/2008, 23:55
¿Eso quiere decir que la DLL es de 64 bits o sólo que compila en Vista 64? Es decir, ¿correrá junto con C# de 64 bits?

ariznaf
13/05/2008, 00:17
NO, Manuel, siento desilusionarte, pero es sólo que compila en Vista 64 bits bajo Dev-Cpp.
La dll generada es de 32 bits. No creo que Dev-Cpp pueda generar dll de 64 bits (aunque no lo sé con seguridad) pues no he encontrado ninguna opción relacionada con 64 bits.

He generado la dll (con el código de google code) y la he utilizado con PerfectRaw con el cambio hecho en el proyecto para forzar que se ejecute en el CLR de 32 bits (/platform:x86).

Ahora sí que la carga, ya no da el error de BadFormatException y llega a hacer el DCRAW_Init
Pero se la pega más adelante.
He estado depurando y se la pega cuando llama a DCRAW_GetInfo. No sé en qué punto porque lógicamente no puedo entrar a depurarla (pues no tiene info de depuración).

ManuelLlorens
13/05/2008, 00:23
He estado depurando y se la pega cuando llama a DCRAW_GetInfo. No sé en qué punto porque lógicamente no puedo entrar a depurarla (pues no tiene info de depuración).
Según me dice vertex al final no subí el C# de ayer a Google Code, por eso se la pega. Voy a ver si lo consigo subir ahora.

ariznaf
13/05/2008, 01:17
Probaré con la nueva versión que pusiste en el ftp de OD y ya te contaré.
_________________________________
Manuel:
en lo que has puesto en el servidor ftp creo que hay un buen lio de directorios.

en dcraw hay un subdirectorio Perfectraw y una solución perfectraw. Dentro de src no están los fuentes sino un .o
En el directorio perfectRaw, está la solución y luego otro perfectRaw con otro directorio perfectraw y otro dcraw dentro.

No se si se debió a algún error en el manejo de svn, es como si hubieras cambiado el directorio de obtención de la aplicación cada vez que lo has usado.

Yo estoy usando el cliente de tortoise y resulta bastante sencillo de usar.
Sólo tienes que hacer un direcotorio llamémolse PerfectDeveloper por ejemplo y hacer un checkout de todo svn/trunk enlazando con él.
Haces los cambios en por ejemplo dcraw y luego seleccionas ese directorio con el botón de la derecha y haces el commit para ese directorio. Si quieres hacer el commit de todos los cambios en todos los proyectos, seleccionas PerfectDeveloper (o el directorio de tu PC en que lo hubieras descargado) y haces commit.
_________________________________
Bueno, a pesar de que hay un anidamiento extraño de carpetas, la solución perfectraw funciona y permite recompilar.
Lo he recompilado todo incluido el dcraw.
Tal y como estaba, al ejecutar la aplicación se producía el error de BadFormat en Vista 64.
Cambié la opción de plataforma de destino a x86 (dentro de las opciones de Generar del proyecto).
Nuevamente la dll se carga correctamente y se ejecuta bien DCRAW_Init y DCRAW_DefaultParameters, pero al llegar a DCRAW_GetInfo se produce una excepción y el programa se la pega sin ningún error.

Haciendo un seguimiento con el debugger, el error se produce al volver de DCRAW_GetInfo y siendo del tipo AccessViolation "Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada"
Por tanto parece algún problema de escritura fuera de buffer o similar. Es posible que en 32 bits pase desapercibido y en 64 no.

ManuelLlorens
13/05/2008, 10:43
Haciendo un seguimiento con el debugger, el error se produce al volver de DCRAW_GetInfo y siendo del tipo AccessViolation "Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada"
¿Has probado con más RAWs? A mí me pasa con algunos, pero siempre con los mismos, y con otros no. Tengo que depurar eso cuando tenga un rato, debe ser algo que no he trasladado bien desde el código de Coffin al de la DLL. Pero debería funcionarte con algún RAW.

Un saludo:

dgmaga
13/05/2008, 10:49
¿Has probado con más RAWs? A mí me pasa con algunos, pero siempre con los mismos, y con otros no. Tengo que depurar eso cuando tenga un rato, debe ser algo que no he trasladado bien desde el código de Coffin al de la DLL. Pero debería funcionarte con algún RAW.

Un saludo:

A mí ese mensaje me sale también con un solo RAW pero no con otros en XP normal. Pensaba que era algo de mi ordenador.

Daniel

ariznaf
21/05/2008, 02:40
Hoy Manuel y yo hemos estado haciendo pruebas con el revelador en Vista 64 para intentar localizar el error. El preparaba cambios en el código y yo iba probando a ver si se producía error o no.

En primer lugar hemos descartado que el problema sea en el código de coffin, preparando una versión sin nada del código de Manuel y viendo que se mostraba la imagen sin problema.

Luego hemos descartado que el problema fuera en el paso de las estructuras de datos entre C# y C, rellenando las estructuras en C y recogiéndolas en C# y viendo que los valores obtenidos eran los que se habían preparado.

Así que sólo quedaba algún problema en el código que Manuel modifícó en el dcraw.

Se corrieron distintas etapas del revelado que se ejecutaron perfectamente.
Hemos localizado que el error se produce en la última etapa (tras la etapa 4) y antes de llamar al DCRaw_End en Vista 64.
En Xp también se produce un error al llamar a DCRaw_end.
Seguramente el error será el mismo para ambos casos y se tratará de algún puntero perdido.

Manuel no ha conseguido todavía localizar el error, pero las pruebas realizadas lo han acotado mucho más el problema en una región del código más reducida, con lo que esperamos que la solución aparezca pronto.
Os mantendremos informados.

<Manuel>: el error de XP ya está solucionado, era una variable que no se reinicializaba correctamente (lo he soñado esta noche). Cuando hice el traslado de las variables globales de Coffin a mis funciones no caí en que yo mismo había añadido una variable global para saber si la tabla LUT para acelerar el cálculo de la gamma estaba ya inicializada o no. En DCRaw_End estaba liberando la memoria ocupada por la LUT, pero había olvidado marcar el flag que controla esa inicialización después, con lo que intentaba usar la LUT que no existía al revelar por segunda vez (hay un función a la que se llama desde DCRaw_Init que debe dejar la memoria y las variables como estaban la primera vez que se llamó a DCRaw, en caso contrario no funcionará bien, porque dcraw.exe se ejecuta linealmente y no está diseñado para procesar archivos de distintas cámaras sin volver a ejecutar el programa). Por tanto, en XP ya tenemos dcraw.dll sin errores ni limitaciones. Respecto a Vista 64 tengo una idea de porqué se produce el error en GetInfo(), lo demás funciona todo igual que en XP, así que si no lo logro arreglar hoy, desactivaré esa línea y podréis usarlo de momento. Hoy al mediodía enviaré una prueba a ariznaf por mail con una cosa de GetInfo() cambiada. Si funciona en Vista 64 ya está todo arreglado, en caso contrario habrá que seguir investigando, pero casi seguro que SÍ tiene que ver con el paso de estructuras entre C y C#. De un modo u otro hoy al mediodía los usuarios de Vista 64 tendréis un perfectRAW que funciona, aunque sea sin GetInfo().

Guillermo Luijk
21/05/2008, 22:31
Manuel, dónde está el link con la última versión? la de http://www.ojodigital.com/prawpblender/perfectRAW.zip me sigue dando error en Vista 32 al darle a Revelar:

Consulte el final de este mensaje para obtener más detalles sobre cómo invocar a la depuración
Just-In-Time (JIT) en lugar de a este cuadro de diálogo.

************** Texto de la excepción **************
System.AccessViolationException: Intento de leer o escribir en la memoria protegida. A menudo, esto indica que hay otra memoria dañada.
en perfectRAW.Dcraw.DCRAW_GetInfo(IMAGE_INFO& info)
en perfectRAW.MainForm.button1_Click(Object sender, EventArgs e)
en System.Windows.Forms.Control.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnClick(EventArgs e)
en System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
en System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
en System.Windows.Forms.Control.WndProc(Message& m)
en System.Windows.Forms.ButtonBase.WndProc(Message& m)
en System.Windows.Forms.Button.WndProc(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
en System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
en System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Ensamblados cargados **************
mscorlib
Versión del ensamblado: 2.0.0.0
Versión Win32: 2.0.50727.312 (rtmLHS.050727-3100)
Código base: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
perfectRAW
Versión del ensamblado: 1.0.0.0
Versión Win32: 1.0.0.0
Código base: file:///C:/perfectRAW/perfectRAW.exe
----------------------------------------
System.Windows.Forms
Versión del ensamblado: 2.0.0.0
Versión Win32: 2.0.50727.312 (rtmLHS.050727-3100)
Código base: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
Versión del ensamblado: 2.0.0.0
Versión Win32: 2.0.50727.312 (rtmLHS.050727-3100)
Código base: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
Versión del ensamblado: 2.0.0.0
Versión Win32: 2.0.50727.312 (rtmLHS.050727-3100)
Código base: file:///C:/Windows/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
mscorlib.resources
Versión del ensamblado: 2.0.0.0
Versión Win32: 2.0.50727.312 (rtmLHS.050727-3100)
Código base: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
System.Windows.Forms.resources
Versión del ensamblado: 2.0.0.0
Versión Win32: 2.0.50727.312 (rtmLHS.050727-3100)
Código base: file:///C:/Windows/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_es_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** Depuración JIT **************
Para habilitar la depuración Just In Time (JIT), el archivo de configuración de esta
aplicación o equipo (machine.config) debe tener el
valor jitDebugging establecido en la sección system.windows.forms.
La aplicación también se debe compilar con la depuración
habilitada

Por ejemplo:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

Cuando esté habilitada la depuración JIT, cualquier excepción no controlada
se enviará al depurador JIT registrado en el equipo
en lugar de controlarlo mediante el cuadro de diálogo.

ManuelLlorens
22/05/2008, 00:22
Manuel, dónde está el link con la última versión? la de http://www.ojodigital.com/prawpblender/perfectRAW.zip me sigue dando error en Vista 32 al darle a Revelar:
Estamos ariznaf y yo en el Messenger. Voy a subir ahora mismo una versión que funciona en todos los Windows, pero lleva desactivada la obtención de información de la imagen, que es lo que falla.

Está en http://www.ojodigital.com/foro/showthread.php?p=2155423#post2155423

Un saludo:

Guillermo Luijk
04/12/2008, 16:02
Estuve probando uno de estos días, y cuando con el ajuste de exposición se le daba de nuevo a 'Develop', volvía a incrementar la exposición. Es decir aplicaba la corrección sobre la imagen ya corregida con lo que el destino final tras unos cuantos 'Develop' era el quemazo total :D:D

Poniendo el ajuste de exposición a cero volvía a ser correcta la imagen.

ManuelLlorens
04/12/2008, 16:33
Estuve probando uno de estos días, y cuando con el ajuste de exposición se le daba de nuevo a 'Develop', volvía a incrementar la exposición. Es decir aplicaba la corrección sobre la imagen ya corregida con lo que el destino final tras unos cuantos 'Develop' era el quemazo total :D:D

Poniendo el ajuste de exposición a cero volvía a ser correcta la imagen.

Sí, es un error conocido y no pasa sólo en Vista ;). Es una tontería que consiste en que si das a revelar otra vez sin cambiar ningún parámetro se vuelve a aplicar la gamma antes de mostrar en pantalla. No lo he arreglado porque con el código de Egon no hará falta.

Un saludo: