Skip to content
This repository has been archived by the owner on Dec 8, 2021. It is now read-only.

_except_handler4_common在xp上的msvcrt.dll找不到 #9

Closed
HwangBae opened this issue Jul 17, 2017 · 24 comments
Closed

_except_handler4_common在xp上的msvcrt.dll找不到 #9

HwangBae opened this issue Jul 17, 2017 · 24 comments

Comments

@HwangBae
Copy link

vs2015。toolset选择xp。在win7运行正常。xp弹这个错误。

@mingkuang-Chuyu
Copy link
Collaborator

这个我应该处理过了,话说是不是XP mode宏没有被定义,要不你截图下宏设置?

@HwangBae
Copy link
Author

vcltltest.zip
这是我的测试工程,你看看有没有问题

@mingkuang-Chuyu
Copy link
Collaborator

确认此问题,原来 VC 2015 不会设置 _ATL_XP_TARGETING 宏……你暂时可以手动添加。

@mingkuang-Chuyu
Copy link
Collaborator

这是2015 BUG,不添加 _ATL_XP_TARGETING 将导致ATL不兼容 XP,建议你还是手动添加下吧。

@HwangBae
Copy link
Author

测试工程里面是有添加的

@mingkuang-Chuyu
Copy link
Collaborator

确认……是VC-LTL 的 ltl140xp.lib 有问题……我重新编译下

@mingkuang-Chuyu
Copy link
Collaborator

我也已经凌乱了,用 __NO_LTL_LIB 参数时,正常,但是 _except_handler4_common是在maincrt函数里面被引用的

@mingkuang-Chuyu
Copy link
Collaborator

主要是 我自己新建个工程就很正常,但是你的这个工程就会不正常 这个才是我纠结的地方。

@HwangBae
Copy link
Author

qq 20170718104439
这是编译器的版本。昨天换另外一个机器的2015也会有这个问题,2017的我还没测试

@mingkuang-Chuyu
Copy link
Collaborator

目前你暂时手动避免下吧
定义宏 __NO_LTL_LIB

在 stdafx.cpp添加
#ifdef __NO_LTL_LIB
#include "..\VC-ltl_msvcrt.cpp"
#endif

@HwangBae
Copy link
Author

2017下面如果toolset选择xp的话。sdk会被自动切换到7.0。没法选择10.0.15063.0。这个是否有影响?机子上也装了win7sdk。如果不选择xp则会弹不是有效的win32程序

@mingkuang-Chuyu
Copy link
Collaborator

这个是吗,没有影响的 XP切换过去也没事。

另外 选择XP其实就是定义 _ATL_XP_TARGETING 宏 再加 连接器 的 系统设置 所需的最低版本 调整为5.01。

所以 你手动完成上述操作 就算你用 15063 XP也不会弹窗的

@mingkuang-Chuyu
Copy link
Collaborator

我终于对比出差异了。在 stdatx.h里面 添加

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的

#include <atlbase.h>
#include <atlstr.h>

就不会 有问题了。 我他么真的醉了

@HwangBae
Copy link
Author

试了下加上__NO_LTL_LIB和包含_msvcrt.cpp就报
vcltltest..\VC-LTL_msvcrt.cpp(105): error C2065: 'PF_FASTFAIL_AVAILABLE': undeclared identifier
vcltltest..\VC-LTL_msvcrt.cpp(172): error C2065: 'STATUS_FATAL_APP_EXIT': undeclared identifier

工程里面不用到atl的也要加上这些头文件?

@mingkuang-Chuyu
Copy link
Collaborator

最后确认 添加个 #include <atlbase.h> 就没事了……估计是编译器优化在作怪

@HwangBae
Copy link
Author

我这边测试加上还是会出现

@mingkuang-Chuyu
Copy link
Collaborator

'PF_FASTFAIL_AVAILABLE
'STATUS_FATAL_APP_EXIT'
都在Winnt.h里面
2345 行

#define PF_FASTFAIL_AVAILABLE 23
#define STATUS_FATAL_APP_EXIT ((DWORD )0x40000015L)

@mingkuang-Chuyu
Copy link
Collaborator

奇怪 msvcrt.cpp不是加了 #include <winnt.h>

@mingkuang-Chuyu
Copy link
Collaborator

添加
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的

#include <atlbase.h>
#include <atlstr.h>

后 VS 2017就正常了,但是 VS 2015确实还是不正常,导入表会引用。

@mingkuang-Chuyu
Copy link
Collaborator

不过我明白怎么解决了,只能写个汇编代码,去替换了。等我好消息

@HwangBae
Copy link
Author

刚刚试了下。在2015下,不通过toolset设置xp。直接指定最低5.01。定义__NO_LTL_LIB和包含_msvcrt.cpp就正常了。怀疑toolset选了xp后。sdk虽然显示是win10。实际用的是低版本。导致那两个宏找不到。

@mingkuang-Chuyu
Copy link
Collaborator

好吧……可能是 7.1 SDK里面的Winnt.h没有那二个 宏。另外 我已经彻底醉了…… 我写个汇编代码,显试替换__imp___except_handler4_common。尼玛还会被引入。而且我也有很多工程是用 VS 2015的,就是代码更多一点,也没有发现这问题。我猜测是 某些情况会触发编译器 什么 BUG。

@mingkuang-Chuyu
Copy link
Collaborator

尼玛…… 应该就是引用顺序 BUG。直接用 连接器的附加依赖项 就不会有问题

@mingkuang-Chuyu
Copy link
Collaborator

已经修复,使用属性表 ltlvcrtWinXp.props 就可以解决此问题。谢谢反馈~

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

2 participants