当特定打印机是默认打印机时,只要用户通过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 );
以下是客户发给我的信息:
知道什么可能导致这样的崩溃,或者我们将如何解决这个问题?
答案 0 :(得分:0)
事件日志详细信息提供了关键线索:异常代码0xC0000093,转换为STATUS_FLOAT_UNDERFLOW,表示涉及FPU。由于浮点非常复杂,FPU有很多不同的配置,遗憾的是代码对此很敏感。
在这种特殊情况下,看起来打印机驱动程序预计FP异常报告将被关闭(我认为并非不合理),但是将驱动程序托管到驱动程序中的应用程序已将其打开。在调用PrintDlgEx之前屏蔽FP异常消除了崩溃。
(从中可以汲取两个教训:首先,在调用第三方代码时,您需要尝试提供尽可能干净的环境;其次,打印机驱动程序不应该使用浮点数。也指出了Windows,IMO中的设计弱点,尽管可能是旧计算机上必需的设计弱点。)