Eu tenho um aplicativo cliente / servidor que desenvolvi em um único PC. Agora, ele precisa de duas portas seriais, então peguei emprestado um PC de um amigo.
Quando crio meu aplicativo e tento executá-lo ou depurá-lo (seja no Delphi IDE ou no gerenciador de arquivos do Windows), ele erro "O aplicativo não pôde ser iniciado corretamente (0xc000007b)".
Pesquisando no Google não traz muita coisa, mas parece indicar que isso não é nada específico do Delphi e acontece com outros aplicativos. Parece ser causado pela chamada para uma DLL de 32 bits de um aplicativo de 64 bits ou vice-versa.
- ambos os PCs são Windows 7, 64 bits
- ambos têm a edição iniciada em Delphi Xe2, que suporta apenas 32 bits
- O aplicativo funciona bem no meu PC, mas não no do meu amigo
- Outros aplicativos Delphi funcionam bem nos dois PCs
Alguém pode me dar uma dica de como rastrear isso?
STATUS_INVALID_IMAGE_FORMAT
. Você não consegue isso quando o sistema não consegue encontrar uma DLL com esse nome. Você obtémSTATUS_INVALID_IMAGE_FORMAT
quando uma DLL pode ser encontrada, mas está corrompida ou tem a testemunha errada.Respostas:
Para começar, sugiro testar se há um problema entre seu aplicativo e suas dependências usando o dependency walker
fonte
Uma dependência de tempo de carregamento não pôde ser resolvida. A maneira mais fácil de depurar isso é usar o Dependency Walker . Use a opção Perfil para obter uma saída de diagnóstico do processo de carregamento. Isso identificará o ponto de falha e deverá guiá-lo para uma solução.
A causa mais comum desse erro é tentar carregar uma DLL de 64 bits em um processo de 32 bits ou vice-versa.
fonte
É uma dll ausente. Possivelmente, sua dll que funciona com portas com uma dependência de dll não resolvida. Você pode usar o walker de dependência e o depurador do Windows. Verifique toda a biblioteca mfc, por exemplo. Além disso, você pode usar o nrCommlib - são ótimos componentes para trabalhar com portas de comunicação.
fonte
Eu tentei todas as coisas especificadas aqui e encontrei mais uma resposta. Eu tive que compilar meu aplicativo com DLLs de 32 bits. Eu construí as bibliotecas em 32 e 64 bits, mas tenho meu
PATH
conjunto para bibliotecas de 64 bits. Depois que recompilei meu aplicativo (com várias alterações no meu código), recebi esse erro temido e lutei por dois dias. Finalmente, depois de tentar várias outras coisas, mudei meuPATH
para ter as DLLs de 32 bits antes das DLLs de 64 bits (elas têm os mesmos nomes). E funcionou. Estou apenas adicionando aqui para completar.fonte
Já foi mencionado em respostas anteriores que, no meu caso (usar o walker de dependência), o walker de dependência mostrou algumas dll que NÃO são relevantes!
Finalmente descobri que eu posso executar a criação de perfil, indo ao menu "perfil" e ele executará o aplicativo e parará na DLL exata que está causando o problema! Eu descobri que uma DLL de 32 bits foi escolhida por causa do caminho e a corrigi.
fonte
Recentemente, tive um problema em que estava desenvolvendo um aplicativo (que usava uma porta serial) e funcionava em todas as máquinas em que o testava, mas algumas pessoas estavam recebendo esse erro.
Acontece que todas as máquinas nas quais o erro ocorreu estavam executando o Win7 x64 e NUNCA UMA VEZ foram atualizadas.
A execução de uma atualização do Windows corrigiu todas as máquinas no meu caso específico.
fonte
Tive o mesmo problema ao desenvolver um aplicativo cliente-servidor usando o Microsoft Visual Studio 2012.
Se você usou o Visual Studio para desenvolver o aplicativo, verifique se o novo (ou seja, o computador em que o software não foi desenvolvido) possui o Pacote Redistribuível Microsoft Visual C ++ apropriado. Conforme apropriado, você precisa da versão correta do ano e do bit (por exemplo, x86 para 32 bits e x64 para 64 bits) do Pacote Redistribuível do Visual C ++.
Aqui está um link para o Visual C ++ Redistributable for Visual Studio 2015 .
Você pode verificar quais versões estão instaladas no Painel de Controle -> Programas -> Programas e Recursos.
Veja como obtive esse erro e o corrigi:
1) Desenvolvi um aplicativo de 32 bits usando o Visual Studio 2012 no meu computador. Vamos ligar para o meu computador ComputerA.
2) Instalei o .exe e os arquivos relacionados em um computador diferente que chamaremos de ComputerB.
3) No ComputerB, executei o .exe e recebi a mensagem de erro.
4) No ComputerB, observei os Programas e Recursos e não vi o Visual C ++ 2012 Redistributable (x64).
5) No ComputerB, pesquisei no Visual C ++ 2012 Redistributable e selecionei e instalei a versão x64.
6) No ComputerB, executei o .exe no ComputerB e não recebi a mensagem de erro.
fonte
Na verdade, esse erro indica um formato de imagem inválido. No entanto, por que isso está acontecendo e o que o código de erro geralmente significa? Na verdade, isso pode aparecer quando você está tentando executar um programa criado ou destinado a funcionar com um sistema operacional Windows de 64 bits, mas o computador está executando o sistema operacional 32 bits.
Razões possíveis:
Fonte: http://www.solveinweb.com/solved-the-application-was-unable-to-start-correctly-0xc000007b-click-ok-to-close-the-application/
fonte
Este pode ser um caso em que a depuração do depurador pode ser útil. Essencialmente, se você seguir as instruções aqui, poderá executar dois ide's e um irá depurar no outro. Se você unir seu aplicativo em um, às vezes poderá detectar erros que, de outra forma, perderiam. Vale a tentativa.
fonte
Eu vi o erro ao tentar executar o executável de depuração do VC ++ em uma máquina que não tinha o Visual C ++ instalado. Construindo uma versão de lançamento e usando isso a corrigiu.
fonte
No meu caso, o erro ocorreu quando eu renomeei uma DLL após compilá-la (usando o Visual Studio 2015), para que ela se encaixe no nome esperado por um executável, que dependia da DLL. Após a renomeação, a lista de símbolos exportados exibida pelo Dependency Walker estava vazia e a mensagem de erro "O aplicativo não pôde iniciar corretamente" foi exibida.
Portanto, ele pode ser corrigido alterando o nome do arquivo de saída nas opções do vinculador do Visual Studio.
fonte
Você pode ter isso se estiver tentando manifestar seu aplicativo que ele depende do assembly Microsoft.Windows.Common-Controls . Você faz isso quando deseja carregar a versão 6 da biblioteca de controles comuns - para que os estilos visuais sejam aplicados aos controles comuns.
Você provavelmente seguiu a documentação original da Microsoft desde os dias do Windows XP e adicionou o seguinte ao manifesto do seu aplicativo:
O Windows XP não é mais o sistema operacional e você não é mais um aplicativo de 32 bits. Nos 17 anos seguintes, a Microsoft atualizou sua documentação ; agora é hora de atualizar seu manifesto:
Raymond Chen tem uma história adorável dos controles comuns:
fonte
Acabei de resolver esse problema para o meu projeto pessoal (obrigado ao Dries por isso). Para mim, foi porque o caminho do projeto era muito longo. Depois de salvar o .sln em um caminho mais curto (C: / MyProjects) e compilar a partir daí, ele foi executado sem o erro.
fonte
Baixe e descompacte "Dependencies" na mesma pasta em que você coloca o wget.exe.
http://gnuwin32.sourceforge.net/packages/wget.htm
Você terá alguns arquivos lib * .dll, bem como o wget.exe na mesma pasta, e deve funcionar bem.
(Também respondi aqui https://superuser.com/a/873531/146668 que encontrei originalmente.)
fonte
Acabei de encontrar este problema. Procurei "C ++" em "Aplicativos e recursos" no painel de controle do Windows 10 e notei que algum tipo de atualização havia acabado de executar alguns dias antes e instalei o VC ++ Redistributable 2012-2017. O aplicativo que estava sendo executado na mensagem de erro exigia apenas o VC ++ 2010. Desinstalei todos eles e reinstalei apenas o 2010 x86 / x64, e o erro desapareceu e o aplicativo funcionou conforme o esperado.
fonte
Isso pode acontecer se, por algum motivo, um recurso x86 for carregado de uma máquina x64. Para evitar isso explicitamente, adicione essa diretiva de pré-processador ao stdafx.h (é claro, no meu exemplo, o recurso problemático é a DLL de controles comuns do Windows.
fonte
processorArchitecture='*'
, e isso é tudo o que existe.É possível que você tenha várias versões das DLLs no seu sistema. Você pode pesquisar no seu sistema para descobrir. O problema pode ser resolvido simplesmente alterando a ordem dos diretórios no seu caminho. Este foi o meu problema. ( Não é possível executar a GUI do Qt Creator fora do Qt. "O aplicativo não pôde iniciar corretamente (0xc000007b)" erro )
fonte