当特定打印机为默认打印机时,只要用户通过 PrintDlgEx 调出 Windows 打印对话框,我们的程序就会崩溃。如果该打印机不是默认打印机,则一切正常,除非用户从对话框中选择该打印机,在这种情况下对话框会立即崩溃。
打印机是 HP LaserJet Pro 400 M451nw,同一网络上的多台计算机尝试访问该打印机时会出现问题。但是,其他程序可以打印到该打印机,包括记事本。计算机运行的是 32 位 Windows 7;该程序是用 VS C++ 编写的。
代码如下:
PRINTDLGEX printer = { 0 };
printer.lStructSize = sizeof( printer );
printer.hwndOwner = my_win;
printer.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOCURRENTPAGE | PD_USEDEVMODECOPIES;
printer.nCopies = 1;
printer.nStartPage = START_PAGE_GENERAL;
PrintDlgEx( &printer );
这是客户发给我的:
关于什么可能导致此类崩溃,或者我们将如何解决这个问题,您有什么想法吗?
最佳答案
事件日志详细信息提供了关键线索:异常代码 0xC0000093,转换为 STATUS_FLOAT_UNDERFLOW,表明涉及 FPU。由于 float 非常复杂,因此 FPU 有很多不同的配置,不幸的是代码可能对此很敏感。
在这种特殊情况下,打印机驱动程序似乎希望 FP 异常报告关闭(我想这并非不合理),但托管驱动程序调用的应用程序已将其打开。在调用 PrintDlgEx 之前屏蔽 FP 异常消除了崩溃。
(从中得到两个教训:第一,在调用第三方代码时,需要尽量提供干净的环境;第二,打印机驱动不应该使用 float 。它也指出Windows 中的一个设计缺陷,IMO,尽管这可能是旧计算机所必需的。)
关于c++ - 什么会导致 PrintDlgEx 因特定打印机选择而崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025732/