gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:52:31 33 4
gpt4 key购买 nike

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com