是否可以在运行时检查 msvcrt 内部.dll_controlfp_s

Is it possible to check for _controlfp_s inside of msvcrt.dll at run-time?

本文关键字:dll 内部 controlfp msvcrt 检查 运行时 是否      更新时间:2023-10-16

我正在Windows(在本例中为Windows 8.1)上编译一个MinGW程序,我希望有抛出浮点错误的信号。 出于某种原因,我必须使用 _controlfp_s 来启用这些信号(其他信号都不需要这样的东西,由于某种原因只有浮点错误),结合对 SetUnhandledExceptionFilter 的调用以获取异常,以便我可以做一些事情,例如获取堆栈跟踪等...... 在我正在编译/测试的Windows版本上,这不是问题。 但是,显然旧版本的msvcrt.dll(例如Windows XP上的版本)不包含_controlfp_s条目,从而导致程序崩溃,因为它在CRT库中找不到此功能。

的目标是使我的程序"跨平台",以便在我正在测试的较新版本的窗口中:_controlfp_s被正确调用,我得到浮点错误的信号,而在像XP这样的旧版本上,什么都没有被调用,我们继续我们的快乐方式,没有抛出EXCEPTION_FLT_INVALID_OPERATION或EXCEPTION_FLT_DIVIDE_BY_ZERO异常。')

这可能吗? 是否有其他方法可以做到这一点,不涉及无法抛出/捕获浮点异常?

我已经检查过SO和Google。 MSDN完全一文不值。

如果您来自Linux世界,那么在Windows上操作系统和已安装的应用程序之间存在明显的分离可能会令人惊讶。

"浮点异常信号"实际上不是操作系统的问题。这是每个应用程序的责任,假设它们甚至是用有意义的语言编写的。

Windows

XP上的"msvcrt.dll"不是普通的Visual Studio版本,而是Windows内部版本。当然,我之前说过Windows不关心你使用的编程语言,但它使用C和C++本身。这是您不能依赖的实现细节。

MinGW是极简主义者,确实依赖于它找到的任何库。它可能会找到一个完全缺乏为浮点异常生成信号的代码的 MSVCRT(为什么操作系统无论如何都需要它?为什么Windows需要任何信号?它不是 UNIX。

我建议你坚持使用SEH,在所有Windows版本上。这是本机机制,可以从XP到10工作。