msvcr90.dll로 인한 XP 배포 flsalloc을로드하려고합니다.
-
19-09-2019 - |
문제
Windows 7 X64에서 vs2008 SP1A (9.0.30729.4148)가있는 응용 프로그램 빌드가있어 XP에서 시작하지 않으려 고합니다.
메시지는입니다 The application failed to initialize properly (0x80000003). Click on OK to terminate the application.
. 나는 확인했다 depends.exe
그리고 그것을 발견했습니다 msvcr90.dll
로드하려고합니다 FlsAlloc
Kernel32.dll- 및 Flsalloc에서 Vista에서만 시작할 수 있습니다. 나는 그것이 응용 프로그램에서 사용하지 않는다고 확신합니다.
문제를 해결하는 방법?
SXS 패키지는 이미 대상 시스템에 설치되어 있습니다. 실제로 9.0 SXS (초기 릴리스, SP1 및 SP1+보안 패치)의 3 가지 버전이 모두 있습니다.
응용 프로그램은 다음과 같이 컴파일됩니다 _BIND_TO_CURRENT_VCLIBS_VERSION=1
또한 올바른 대상 Windows 버전을 정의했습니다 stdafx.h
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
매니페스트 파일
<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>
결과에 따라 다릅니다
주소 0x00400000에서 "c : program files app app.exe"(프로세스 0xa0)를 시작했습니다. 성공적으로 연결된 모듈. 주소 0x7c900000에서 "c : windows system32 ntdll.dll"로드. 성공적으로 연결된 모듈. 주소 0x7c800000에서 "c : windows system32 kernel32.dll"로드. 성공적으로 연결된 모듈. 주소 0x785E0000에서 "c : program files app mfc90.dll"로드. 성공적으로 연결된 모듈. 주소 0x78520000에서 "c : program files app msvcr90.dll"로드. 성공적으로 연결된 모듈. 주소 0x7e410000에서 "c : windows system32 user32.dll"로드. 성공적으로 연결된 모듈. 주소 0x77F10000에서 "c : windows system32 gdi32.dll"로드. 성공적으로 연결된 모듈. 주소 0x77F60000에서 "C : Windows System32 ShlWapi.dll"로드. 성공적으로 연결된 모듈. 주소 0x77dd0000에서 "c : windows system32 advapi32.dll"로드. 성공적으로 연결된 모듈. 주소 0x77e70000에서 "C : Windows System32 rpcrt4.dll"로드. 성공적으로 연결된 모듈. 주소 0x77fe0000에서 "c : windows system32 secur32.dll"로드. 성공적으로 연결된 모듈. 주소 0x77c10000에서 "c : windows system32 msvcrt.dll"로드. 성공적으로 연결된 모듈. 주소 0x5d090000에서 "c : windows system32 comctl32.dll"로드. 성공적으로 연결된 모듈. 주소 0x76380000에서 "c : windows system32 msimg32.dll"로드. 성공적으로 연결된 모듈. 주소 0x7c9c0000에서 "c : windows system32 shell32.dll"로드. 성공적으로 연결된 모듈. 주소 0x77120000에서 "c : windows system32 eleaut32.dll"로드. 성공적으로 연결된 모듈. 주소 0x774E0000에서 "C : Windows System32 Ole32.dll"로드. 성공적으로 연결된 모듈. EntryPoint에 도달했습니다. 모든 암시 적 모듈이로드되었습니다. "c : program files app msvcr90.dll"에서 dllmain (0x78520000, dll_process_attach, 0x0012fd30). getProcAddress (0x7c800000 [C : Windows System32 Kernel32.dll], "flsalloc") "C : Program Files App MSVCR90.dll"에서 호출 된 0x78543ACC 및 리턴 NULL. 오류 : 지정된 절차를 찾을 수 없습니다 (127). getProcAddress (0x7c800000 [C : Windows System32 Kernel32.dll], "flsgetValue") "C : Program Files App App MSVCR90.dll"에서 호출되어 0x78543AD9로 호출하고 NULL을 반환합니다. 오류 : 지정된 절차를 찾을 수 없습니다 (127). getProcAddress (0x7c800000 [C : Windows System32 Kernel32.dll], "flssetValue") "C : Program Files App App MSVCR90.dll"에서 호출되어 0x78543AE6을 반환했습니다. 오류 : 지정된 절차를 찾을 수 없습니다 (127). getProcAddress (0x7c800000 [C : Windows System32 Kernel32.dll], "flsfree") "C : Program Files App MSVCR90.dll"에서 호출 된 0x78543AF3 및 리턴 NULL. 오류 : 지정된 절차를 찾을 수 없습니다 (127).
Windows SDK 7이 기본 SDK로 설치되고 구성되어 있다고 언급해야합니다.
해결책 2
매니페스트 도구는 실제로 버그가 많고 유일한 신뢰할 수있는 솔루션은 임베딩이 거의 무작위로 실패하기 때문에 바이너리에 매니페스트를 포함시키지 않는 것이 었습니다. 표현을 외부로 유지하는 것은 못 생겼지 만 적어도 항상 작동합니다.
다른 팁
나는 항상 내 DLL에 매니페스트를 포함시키고 문제가 없었습니다. 나는 매니페스트를 포함하는 것을 잊었을 때만 문제를 일으켰습니다. 그런 다음 Windows 2008에서 msvcr90.dll을 찾지 못하지만 이전 버전의 Windows에서 작동하여 한동안 혼란 스러웠습니다.