什么可能导致PrintDlgEx崩溃特定的打印机选择?

时间:2014-09-24 20:18:35

标签: 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 知道什么可能导致这样的崩溃,或者我们将如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

在这种特殊情况下,看起来打印机驱动程序预计FP异常报告将被关闭(我认为并非不合理),但是将驱动程序托管到驱动程序中的应用程序已将其打开。在调用PrintDlgEx之前屏蔽FP异常消除了崩溃。

(从中可以汲取两个教训:首先,在调用第三方代码时,您需要尝试提供尽可能干净的环境;其次,打印机驱动程序不应该使用浮点数。也指出了Windows,IMO中的设计弱点,尽管可能是旧计算机上必需的设计弱点。)