我的程序使用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”,但可能不是作为工作程序)。任何不存在的打印机都可用于测试。
与该图像一起存在分段错误 - 它发生在上面列表中的第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;
}