打印到无效的打印机分段错误

时间:2016-10-31 17:55:56

标签: windows qt printing

我的程序使用QPrintDialog在Windows中选择打印机。选择打印机后,我画画布......

1 QPrintDialog printDialog(m_printer, this);
2 if (printDialog.exec() == QDialog::Accepted)
3 {
4    if(!m_printer || !m_printer->isValid())
     // also tried 
     // if(m_printer->printerState() == QPrinter::Error)
5    {
6        qDebug() << "printer error";
7        return;
8    }

9     QPainter painter;
10    if (! painter.begin(m_printer))             // program crashes here 
11    {
12       qDebug() << "failed to open printer";
13       return;
14    }

15    // do work
16    painter.end();
17 }

一切都很好,除非我在Windows上选择不存在的打印机。 (有人告诉我他在测试程序时使用了不存在的网络打印机,我使用了一些似乎存在于打印机列表中的“Sage PDF Converter”,但可能不是作为工作程序)。任何不存在的打印机都可用于测试。

选择打印机后,如果打印机“错误”,我会收到错误消息: enter image description here

与该图像一起存在分段错误 - 它发生在上面列表中的第10行。

(第4行是我尝试在它发生之前发现这个错误但是......没有运气)。

如何通过确定所选打印机是否不存在来阻止程序崩溃?

Windows,Qt 4.7-5.5(必须适用于Qt 4.7)

堆栈跟踪:(使用5.5.1)

0   msgBeginFailed  qprintengine_win.cpp    98  0x16c0c929  
    actual line:  if (d.lpszOutput[0])
1   QWin32PrintEngine::begin    qprintengine_win.cpp    137 0x16c0cbca  
    actual line:  if (ok && StartDoc(d->hdc, &di) == SP_ERROR) {
             ->       qErrnoWarning(msgBeginFailed("StartDoc", di));
2   QPainter::begin qpainter.cpp    1808    0xc9f5f3    
    actual line:     bool begun = d->engine->begin(pd);
3   (the correspondent in my code of line 10 above) 

在上面(在0上)lpszOutput在本地和表达式中显示0。

我甚至不想到达那里......我希望能够在我尝试绘画之前测试打印机是否有效。

违规部分 - 在Qt:

    DOCINFO di;
    memset(&di, 0, sizeof(DOCINFO));
    di.cbSize = sizeof(DOCINFO);
    if (d->docName.isEmpty())
->      di.lpszDocName = L"document1";
    else
        di.lpszDocName = reinterpret_cast<const wchar_t *>(d->docName.utf16());
    if (d->printToFile && !d->fileName.isEmpty())
        di.lpszOutput = reinterpret_cast<const wchar_t *>(d->fileName.utf16());
    if (d->printToFile)
        di.lpszOutput = d->fileName.isEmpty() ? L"FILE:" : reinterpret_cast<const wchar_t *>(d->fileName.utf16());
->  if (ok && StartDoc(d->hdc, &di) == SP_ERROR) {
  ->    qErrnoWarning(msgBeginFailed("StartDoc", di));
        ok = false;
    }

0 个答案:

没有答案