Pergunta

Eu tenho uma criação de aplicativos com o VS2008 SP1A (9.0.30729.4148) no Windows 7 x64 que não deseja iniciar no XP.

A mensagem é The application failed to initialize properly (0x80000003). Click on OK to terminate the application.. Eu verifiquei com depends.exe e encontrou isso msvcr90.dll tenta carregar FlsAlloc de Kernel32.dll - e o FLSALLOC está disponível apenas começando com o Vista. Tenho certeza de que não é usado pelo aplicativo.

Como resolver o problema?

O pacote SXS já está instalado na máquina de destino - na verdade, tenho todas as 3 versões de 9,0 SXS (Lançamento inicial, SP1 e Sp1+Security Patch)

A aplicação é compilada com _BIND_TO_CURRENT_VCLIBS_VERSION=1

Também defini a versão do Windows de destino certa em stdafx.h

 #define WINVER 0x0500
 #define _WIN32_WINNT 0x0500

Arquivo de manifesto

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
 <security>
 <requestedPrivileges>
  <requestedExecutionLevel level="asInvoker" uiAccess="false" /> 
  </requestedPrivileges>
  </security>
  </trustInfo>
 <dependency>
 <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> 
  </dependentAssembly>
  </dependency>
 <dependency>
 <dependentAssembly>
  <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b" /> 
  </dependentAssembly>
  </dependency>
</assembly>

Resultado de depende

Iniciado "C: Arquivos de Programas App App.exe" (Processo 0XA0) no endereço 0x00400000. Módulo com sucesso. Carregado "C: Windows System32 ntdll.dll" no endereço 0x7C900000. Módulo com sucesso. Carregado "C: Windows System32 Kernel32.dll" no endereço 0x7C800000. Módulo com sucesso. Carregado "C: Arquivos de Programas App Mfc90.dll" no endereço 0x785e0000. Módulo com sucesso. Carregado "C: Arquivos de Programas App Msvcr90.dll" no endereço 0x78520000. Módulo com sucesso. Carregado "C: Windows System32 User32.dll" no endereço 0x7E410000. Módulo com sucesso. Carregado "C: Windows System32 gdi32.dll" no endereço 0x77f10000. Módulo com sucesso. Carregado "C: Windows System32 shlwapi.dll" no endereço 0x77f60000. Módulo com sucesso. Carregado "C: Windows System32 Advapi32.dll" no endereço 0x77DD0000. Módulo com sucesso. Carregado "C: Windows System32 rpcrt4.dll" no endereço 0x77e70000. Módulo com sucesso. Carregado "C: Windows System32 Secur32.dll" no endereço 0x77fe0000. Módulo com sucesso. Carregado "C: Windows System32 msvcrt.dll" no endereço 0x77c10000. Módulo com sucesso. Carregado "C: Windows System32 comctl32.dll" no endereço 0x5d090000. Módulo com sucesso. Carregado "C: Windows System32 MSIMG32.DLL" no endereço 0x76380000. Módulo com sucesso. Carregado "C: Windows System32 shell32.dll" no endereço 0x7C9C0000. Módulo com sucesso. Carregado "C: Windows System32 OLEAUT32.DLL" no endereço 0x77120000. Módulo com sucesso. Carregado "C: Windows System32 ole32.dll" no endereço 0x774E0000. Módulo com sucesso. Ponto de entrada alcançado. Todos os módulos implícitos foram carregados. Dllmain (0x78520000, dll_process_attach, 0x0012fd30) em "C: Arquivos de programas app msvcr90.dll" chamado. GetProcAddress (0x7C800000 [C: Windows System32 Kernel32.dll], "FlsAlloc") chamado de "C: Arquivos de Programas App Msvcr90.dll" no endereço 0x78543ACC e retornaram nulo. Erro: o procedimento especificado não foi encontrado (127). GetProcAddress (0x7C800000 [C: Windows System32 Kernel32.dll], "FLSGETValue") chamado de "C: Arquivos de Programas App Msvcr90.dll" no endereço 0x78543ad9 e retorno nulo. Erro: o procedimento especificado não foi encontrado (127). GetProcAddress (0x7C800000 [C: Windows System32 Kernel32.dll], "FLSSESTValue") chamado de "C: Arquivos de Programas App MSVCR90.dll" no endereço 0x78543AE6 e retornou nulo. Erro: o procedimento especificado não foi encontrado (127). GetProcAddress (0x7C800000 [C: Windows System32 Kernel32.dll], "flsfree") chamado de "C: Arquivos de Programas App Msvcr90.dll" no endereço 0x78543af3 e devolvido. Erro: o procedimento especificado não foi encontrado (127).

Devo mencionar que tenho o Windows SDK 7 instalado e configurado como SDK padrão.

Foi útil?

Solução 2

A ferramenta de manifesto é realmente buggy e a única solução confiável foi não incorporar o manifesto nos binários, porque a incorporação falha quase aleatoriamente. Manter o manifesto do lado de fora é feio, mas pelo menos sempre funciona.

Outras dicas

Eu sempre incorporei o manifesto em minhas DLLs e nunca tive um problema. Eu só encontrei um problema quando esqueci de incorporar o manifesto. Em seguida, ele não encontra o msvcr90.dll no Windows 2008, mas funciona em versões mais antigas do Windows, o que me confundiu por um tempo.

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