由于.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位的,不过懒得搞了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值