由于.manifest引起的VS2019编译x64 ATL C++窗口程序时报错“应用程序无法正常启动0xc000007b”
今天把一个ATL C++程序改成64位,结果一编译就报错“应用程序无法正常启动0xc000007b”。这种情况一般是链接库的问题,用depends查看,发现一大堆 API-MS-WIN-***.dll 找不到。非常疑难杂症了。
我想到可能是编译器的问题,链接了错误的dll,就开以前的64位程序进行编译,但都是正常的。这就排除了装c++ runtime的想法,肯定不是c++ runtime的问题。
后面我看到有人说是 winsock2.h 和 windows.h 存在包含顺序的问题:
使用Qt库时出现winsock2.h和windos.h包含顺序错误
仔细改了包含顺序,还是报错。
一不做二不休,我把WinMain的内容全部删光,把其他文件.cpp .rc等全部排除包含。这回不报错了。
但是WinMain里但凡加一个MessageBox都弹不出来,仔细排除才发现是xp.manifest捣的鬼。只要有xp.manifest,任何窗口都弹不出来。
打开xp.manifest,发现内容:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" type="win32" name="Microsoft.Windows.Spider" processorArchitecture="x86"/>
<description>Spider Solitaire</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
language="*"
processorArchitecture="x86"
publicKeyToken="6595b64144ccf1df"
/>
</dependentAssembly>
</dependency>
</assembly>
里面只有x86的内容,没有x64。
删掉xp.manifest。包含样式:
#include <CommCtrl.h>
#pragma comment(lib,"comctl32.lib")
#include "ControlStyle.h"
其中ControlStyle.h:
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
问题解决。manifest也许可以把内容加上64位的,不过懒得搞了。