我在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
确实尝试从KERNEL32.dll加载FlsAlloc
- 而FlsAlloc仅从Vista开始提供。我确信应用程序没有使用它。
如何解决问题?
SxS软件包已经安装在目标机器上 - 实际上我有所有3个版本的9.0 SxS(初始版本,sp1和sp1 +安全补丁)
应用程序使用_BIND_TO_CURRENT_VCLIBS_VERSION=1
我还在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 \ OLEAUT32.DLL”。成功挂钩模块。 在地址0x774E0000处加载“c:\ windows \ system32 \ OLE32.DLL”。成功挂钩模块。 达到了切入点。已加载所有隐式模块。 调用“c:\ program files \ app \ MSVCR90.DLL”中的DllMain(0x78520000,DLL_PROCESS_ATTACH,0x0012FD30)。 GetProcAddress(0x7C800000 [c:\ windows \ system32 \ KERNEL32.DLL],“FlsAlloc”)从地址0x78543ACC的“c:\ program files \ app \ MSVCR90.DLL”调用并返回NULL。错误:找不到指定的过程(127)。 GetProcAddress(0x7C800000 [c:\ windows \ system32 \ KERNEL32.DLL],“FlsGetValue”)从地址0x78543AD9的“c:\ program files \ app \ MSVCR90.DLL”调用并返回NULL。错误:找不到指定的过程(127)。 GetProcAddress(0x7C800000 [c:\ windows \ system32 \ KERNEL32.DLL],“FlsSetValue”)从地址0x78543AE6的“c:\ program files \ app \ MSVCR90.DLL”调用并返回NULL。错误:找不到指定的过程(127)。 GetProcAddress(0x7C800000 [c:\ windows \ system32 \ KERNEL32.DLL],“FlsFree”)从地址0x78543AF3处的“c:\ program files \ app \ MSVCR90.DLL”调用并返回NULL。错误:找不到指定的过程(127)。
我应该提一下,我安装了Windows SDK 7并将其配置为默认SDK。
答案 0 :(得分:0)
我总是将清单嵌入到我的DLL中,并且从未出现过问题。当我忘记嵌入清单时,我只遇到了一个问题。然后它无法在Windows 2008上找到MSVCR90.dll,但它适用于旧版本的Windows,这让我困惑了一段时间。
答案 1 :(得分:-1)
Manifest工具确实是错误的,唯一可靠的解决方案是不将清单嵌入到二进制文件中,因为嵌入几乎是随机的。保持清单外面是丑陋的,但至少总是有效。