c++ - 什么会导致 PrintDlgEx 因特定打印机选择而崩溃?

标签 c++ winapi printing

当特定打印机为默认打印机时,只要用户通过 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 );

这是客户发给我的:

enter image description here 关于什么可能导致此类崩溃,或者我们将如何解决这个问题,您有什么想法吗?

最佳答案

事件日志详细信息提供了关键线索:异常代码 0xC0000093,转换为 STATUS_FLOAT_UNDERFLOW,表明涉及 FPU。由于 float 非常复杂,因此 FPU 有很多不同的配置,不幸的是代码可能对此很敏感。

在这种特殊情况下,打印机驱动程序似乎希望 FP 异常报告关闭(我想这并非不合理),但托管驱动程序调用的应用程序已将其打开。在调用 PrintDlgEx 之前屏蔽 FP 异常消除了崩溃。

(从中得到两个教训:第一,在调用第三方代码时,需要尽量提供干净的环境;第二,打印机驱动不应该使用 float 。它也指出Windows 中的一个设计缺陷,IMO,尽管这可能是旧计算机所必需的。)

关于c++ - 什么会导致 PrintDlgEx 因特定打印机选择而崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26025732/

相关文章:

python - 如何在 python 中打印括号

c++ - 用 C++/GTK 制作音乐播放器

c++ - 将图像缓冲区转换为文件流

c++ - 在 Visual C++ 中使用 WebRTC 库

c++ - 为什么我只能将文件中的位置指示器 (SetFilePointerEx) 移动 512 乘数?

java - 使用 JTable 和 JTextField 打印 JPanel

c++ - 枚举整数类型转换 : operator or function

c++ - 为什么我在消息框中得到象形文字

winapi - 我不完全理解 D2D1_FIGURE_BEGIN : why is it needed, 有什么区别,为什么 Microsoft 的示例代码类型不匹配?

c# - 端口名称非法或无法连接到设备