Pergunta

Enquanto é meu entendimento que não há nenhuma razão fundamental um programa escrito para hardware de 32 bits / OSs não rodar em hardware / OSS, na prática, eu encontrei muitos programas de 64 bits destinados para as versões de 32 bits do Windows que não funcionará em versões de 64 bits do Windows. Exemplos incluem uma série de utilitários de segurança popular (a maioria dos produtos de Norton e Check Zone Alarm de Point) e vários jogos (eu tenho tentado obter Grand Theft Auto 4 para rodar por algumas semanas agora, mas sem sucesso - é claro, que pode estar relacionado com qualquer número de outros problemas relacionados à GTA4, mas que não é nem aqui nem lá).

Ouvi dizer que a incompatibilidade de um programa pode resultar de algo tão simples como não querendo correr a partir da pasta "Arquivos de Programas (x86)", mas o que são algumas das outras razões? Por que um antivírus ou firewall escrito para um sistema de 32 bits é executado em um sistema de 64 bits? Por que um jogo é executado quando tudo é teoricamente compatível com versões anteriores?

Foi útil?

Solução

A melhor explicação que eu encontrei é oferecido aqui que basicamente diz que programas de 32 bits são executados em uma camada de emulação que não permite o acesso ao sistema que você deseja obter a partir de programas nativos executados em um ambiente de 64 bits:

http://blogs.msdn.com/oldnewthing /archive/2008/12/22/9244582.aspx

Eu diria que isso significa que problemas com programas como o GTA4 vêm da camada de emulação de não produzir os resultados esperados encontrado em um sistema nativo de 32 bits. É por isso que continuo vendo compatibilidade versão Microsoft atualiza o tempo todo.

Aqui está o que o MSDN tem a dizer sobre o assunto:

http://msdn.microsoft.com/ en-us / library / bb427430 (VS.85) .aspx

Outras dicas

Há muita desinformação sobre esta discussão.

Quando um aplicativo de 32 bits é executado no Windows de 64 bits:

  • A maioria dos problemas de compatibilidade vêm quando o aplicativo tenta instalar um driver de modo kernel. Um motorista de 32 bits não pode ser instalado no sistema operacional de 64 bits. Esta é amost certamente o problema com um firewall. Ele está tentando ligar para a pilha de driver TCP / IP.
  • NÃO HÁ EMULADOR! O código de objeto de 32 bits é executado pela CPU completamente nativamente em plena velocidade.
  • Não há suporte para código de 16 bits de idade. Isto quebrou um monte de instaladores.
  • Acessando as pastas corretas é geralmente não é um problema. Quando um programa de 32 bits abre um arquivo em, digamos% windir% \ system32 \, o OS automagicamente redireciona para% windir% \ syswow64. O mesmo para certas partes do registo. Existem algumas armadilhas potenciais aqui, mas eles são geralmente ao longo das linhas de assumindo que vários WINAPI Obter ... Directory () funções retornam as mesmas cordas que eles fizeram no Windows 95.
  • Se ele foi compilado há 10 anos ou apenas ontem, depois ponteiros C / C ++ ainda são 32-bits (4 bytes) e todo o código que só assumiu que - incluindo SendMessage ()! -- ainda funciona. A questão ponteiro de 8 bytes não entram em cena até que você iniciar a conversão para compiladores de 64 bits.

Drivers são uma história diferente que os programas: http://support.microsoft.com/kb/896456

Zone Alarm usa um driver de 32 bits especial criada pela Check Point para fazer o monitoramento. Este é provavelmente o que está criando o problema com esse aplicativo. Quanto Grand Theft Auto 4? Eu não tenho idéia.

Não pode haver qualquer número de razões.

Qualquer aplicação que está programado ad um nível baixo pode estar esperando de 32 bits registo. O motorista Zone Alarm postado por novatrust é um exemplo bom. GTA4 pode estar usando montagem para melhorar o desempenho em vários pontos que poderiam resultar em qualquer coisa ou mesmo simplesmente assumindo 32 bits em C ++. Por exemplo tomar o seguinte 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);

Eu sei que o exemplo é muito ingênuo, mas de qualquer maneira, em que o código que você está supondo que você está struct é de 8 bytes de comprimento (4 bytes do inteiro x e 4 bytes para o número inteiro y), mas em um sistema de 64 bits é realmente duas vezes tanto tempo assim que você vai acabar trocando o ponto errado ... coisas assim acontecem muito em linguagens de baixo nível, especialmente quando se tenta melhorar o desempenho ...

aplicações

segurança são um mau exemplo. Todos eles executar as coisas não suportadas contra as coisas sem documentos. Alterações entre uma versão do Windows de 32 bits para o próximo são o suficiente para quebrá-las, esquece de se mudar para 64 bits.

Dito isto, há alguns calços de compatibilidade que FIXUP seu código em 32-bit que não vai quando o aplicativo é 64-bit . Isso ocorre porque Microsoft assume que você já testou em 64-bit.

Uma pegadinha resultante é com .NET aplicações . Quando rodando em um sistema de 32 bits, o exe é JITted para 32-bits - onde há compatibilidade calços para corrigir seus erros. Se o seu cliente passa a ser executado em um sistema de 64 bits, o executável será JITted para 64-bits, onde esses calços de compatibilidade que você estava protegido de si mesmo são não presente.

Chris Jackson teve uma entrada de blog agradável sobre isto: calços Applications no Windows Vista 64-Bit

O problema é provavelmente motoristas. Com os jogos, provavelmente é algum tipo de esquema DRM viscoso. Tente obter o crack no-CD para o jogo para que você possa executá-lo sem DRM.

Se você estiver usando o sistema de arquivos ou o registro, certifique-se de acesso as pastas corretas . Como um programa x86 você provavelmente vai querer acesso "Arquivos de Programas (x86)", "SysWOW64", "WOW6232Node" e essas pastas em vez dos x64.

Os produtos com x86 aplicativos como Norton e verificar o alarme da zona do ponto de não conseguir executar seu motorista x86, como o motorista precisa x64 para ser capaz de ran pelo sistema operacional.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top