是否可以在运行时检查 msvcrt 内部.dll_controlfp_s
Is it possible to check for _controlfp_s inside of msvcrt.dll at run-time?
我正在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上操作系统和已安装的应用程序之间存在明显的分离可能会令人惊讶。
"浮点异常信号"实际上不是操作系统的问题。这是每个应用程序的责任,假设它们甚至是用有意义的语言编写的。
WindowsXP上的"msvcrt.dll"不是普通的Visual Studio版本,而是Windows内部版本。当然,我之前说过Windows不关心你使用的编程语言,但它使用C和C++本身。这是您不能依赖的实现细节。
MinGW是极简主义者,确实依赖于它找到的任何库。它可能会找到一个完全缺乏为浮点异常生成信号的代码的 MSVCRT(为什么操作系统无论如何都需要它?为什么Windows需要任何信号?它不是 UNIX。
我建议你坚持使用SEH,在所有Windows版本上。这是本机机制,可以从XP到10工作。
- 挂起和取消挂起一个文件DLL
- 将函数类成员映射到类本身内部
- std::threads可以从Windows DLL中的全局变量创建/销毁吗?
- 导入库可以跨dll版本工作吗
- 从C++dll访问C#中的一行主要参数
- 链接到自行创建的dll失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- Boost Spirit,获取迭代器内部语义动作
- 从动态加载的 dll 内部调用C++函数
- Unity内部编译器错误与自定义DLL
- Visual Studio 2008版本内部版本未装饰DLL导出
- 独立 DLL 之间的内部进程通信
- 隐式 DLL 链接和类内部函数
- C++ Windows DLL 使用 try-catch 块在内部失败
- 调用DLL内部的函数
- dll内部定义的派生嵌套类的序列化
- 从c++调用vb.net-comvisible dll内部的函数
- JNI DLL的依赖关系,它在内部调用另一个DLL
- 从类函数内部调用 DLL 的外部函数
- 设置显式链接DLL的内部变量