sistema - Garantizar que un programa escrito para Windows de 32 bits es compatible con Windows de 64 bits
kb917607 windows 7 (8)
Si bien entiendo que no existe una razón fundamental para que un programa escrito para hardware / SO de 32 bits no se ejecute en hardware / SO de 64 bits, en la práctica, he encontrado muchos programas destinados a versiones de 32 bits de Windows que no funcionarán trabajar en versiones de 64 bits de Windows. Los ejemplos incluyen varias utilidades de seguridad populares (la mayoría de los productos de Norton y Zone Alarm de Check Point) y varios juegos (he intentado que Grand Theft Auto 4 se ejecute durante algunas semanas, pero fue en vano, por supuesto, eso podría estar relacionado con cualquier cantidad de otros problemas relacionados con GTA4, pero eso no es ni aquí ni allí).
He oído que la incompatibilidad de un programa puede deberse a algo tan simple como no querer ejecutar desde la carpeta "Archivos de programa (x86)", pero ¿cuáles son algunas de las otras razones? ¿Por qué un escáner de virus o firewall escrito para un sistema de 32 bits no se ejecuta en un sistema de 64 bits? ¿Por qué un juego no se ejecutará cuando todo sea teóricamente compatible con versiones anteriores?
Hay mucha desinformación en este hilo.
Cuando se ejecuta una aplicación de 32 bits en Windows de 64 bits:
- La mayoría de los problemas de compatibilidad se producen cuando la aplicación intenta instalar un controlador en modo kernel. No se puede instalar un controlador de 32 bits en el sistema operativo de 64 bits. Este es ciertamente el problema con un firewall. Está intentando conectarse a la pila del controlador TCP / IP.
- ¡NO HAY EMULADOR! El código de objeto de 32 bits es ejecutado por la CPU completamente de forma nativa a toda velocidad.
- No hay soporte para el código antiguo de 16 bits. Esto rompió muchos instaladores.
- Acceder a las carpetas correctas generalmente no es un problema. Cuando un programa de 32 bits abre un archivo, digamos% windir% / system32 /, el sistema operativo lo redirige automáticamente a% windir% / syswow64. Lo mismo para ciertas partes del registro. Hay algunas posibles trampas aquí, pero en general están en la línea de suponer que varias funciones WINAPI Get ... Directory () devuelven las mismas cadenas que lo hicieron en Windows 95.
- Ya sea que se compiló hace 10 años o ayer, los punteros C / C ++ siguen siendo 32 bits (4 bytes) y todo el código que se supone, incluido SendMessage (). -- todavía funciona. El problema del puntero de 8 bytes no aparece en la imagen hasta que comienza la conversión a compiladores de 64 bits.
Los controladores son una historia diferente de los programas: http://support.microsoft.com/kb/896456
Zone Alarm utiliza un controlador especial de 32 bits creado por Check Point para realizar la supervisión. Esto es probablemente lo que está creando el problema con esa aplicación. En cuanto a Grand Theft Auto 4? No tengo idea.
Puede haber una cantidad de razones.
Cualquier aplicación que esté programada en un nivel bajo podría esperar un registro de 32 bits. El controlador de alarma de zona publicado por novatrust es un buen ejemplo. GTA4 podría estar usando ensamblado para mejorar el rendimiento en varios puntos, lo que podría resultar en algo o incluso simplemente asumir 32 bits en C ++. Por ejemplo, tome el siguiente código:
struct GPoint
{
int x;
int y;
}
// Array of twenty GPoints
GPoint[] myArr = malloc(20 * sizeof(GPoint);
GPoint* myPointer = myArr;
int index = GetIndexAffectedPoint();
// Invert X and Y for the point
myPointer += 8*index;
swap(myPointer);
Sé que el ejemplo es bastante ingenuo, pero de todos modos, en ese código supones que tu estructura tiene 8 bytes de longitud (4 bytes del entero xy 4 bytes para el entero y) pero en un sistema de 64 bits es el doble de largo por lo que terminarás intercambiando el punto equivocado ... cosas así suceden mucho en idiomas de bajo nivel, especialmente cuando se trata de mejorar el rendimiento ...
La mejor explicación que he encontrado se ofrece aquí, que básicamente dice que los programas de 32 bits se ejecutan en una capa de emulación que no permite el acceso al sistema que obtendría de los programas nativos ejecutados en un entorno de 64 bits:
http://blogs.msdn.com/oldnewthing/archive/2008/12/22/9244582.aspx
Supongo que esto significa que los problemas con programas como GTA4 provienen de la capa de emulación que no produce los resultados esperados que se encuentran en un sistema nativo de 32 bits. Esta es la razón por la que sigue viendo actualizaciones de compatibilidad de versiones de Microsoft todo el tiempo.
Esto es lo que MSDN tiene que decir sobre el asunto:
http://msdn.microsoft.com/en-us/library/bb427430(VS.85).aspx
El problema es probablemente controladores. Con los juegos, es probable que sea algún tipo de esquema DRM viscoso. Trate de obtener el crack sin CD para el juego para que pueda ejecutarlo sin DRM.
Las aplicaciones de seguridad son un mal ejemplo. Todos realizan cosas no compatibles contra cosas indocumentadas. Los cambios entre una versión de 32 bits de Windows a la siguiente son suficientes para romperlos, sin importar que pasen a 64 bits.
Dicho esto, existen algunas cuñas de compatibilidad que corrigen el código en 32 bits y no lo harán cuando la aplicación sea de 64 bits . Esto se debe a que Microsoft supone que lo ha probado en 64 bits.
Uno de los resultados obtenidos es con las aplicaciones .NET . Cuando se ejecuta en un sistema de 32 bits, el ejecutable se ajusta a 32 bits, donde hay calces de compatibilidad para reparar los errores. Si su cliente se ejecuta en un sistema de 64 bits, el ejecutable se integrará en 64 bits, donde las cuñas de compatibilidad que le protegieron a usted mismo ya no están presentes.
Chris Jackson tuvo una buena entrada de blog sobre esto: Aplicaciones Shimming en Windows Vista 64-Bit
Si está utilizando el sistema de archivos o el registro, asegúrese de acceder a las carpetas correctas . Como programa x86, probablemente desee acceder a "Archivos de programa (x86)", "SysWOW64", "WOW6232Node" y carpetas similares a las x64.
Los productos con aplicaciones x86 como Norton y Zone Alarm de Check Point no pueden ejecutar su controlador x86, ya que el controlador necesita x64 para poder ejecutar el sistema operativo.