未设置Windows默认打印机时出现“没有选择默认打印机”错误
当没有Windows默认打印机设置时,需要打开打印机对话框。当设置Windows默认打印机时,它可以正常工作。未设置Windows默认打印机时出现“没有选择默认打印机”错误
TPrintDialog *dlgPrint = new TPrintDialog(frmDisplayDetail);
if(dlgPrint->Execute()) { //code here }
但是,如果没有默认的打印机设置在Windows中,dlgPrint->Execute()
抛出一个异常:
有选择
要检查的默认打印机指数没有默认打印机,我用Printer()->PrinterIndex
。
错误E2122函数调用的地址XXX
由未处理的异常XXX终止难道我做错了什么:当没有Windows打印机设置这个值可能不可?请提出解决方案。
例外“目前选定默认打印机”由TPrinter::SetToDefaultPrinter()
方法仅抛出,当任一:
在Win32 API与(无证枚举时
EnumPrinters()
函数失败与ERROR_INVALID_NAME
错误代码)PRINTER_ENUM_DEFAULT
标志。TPrinter::Printers
列表不包含默认打印机。如果上面的EnumPrinters()
未报告默认设备,那么将从Win32 APIGetDefaultPrinter()
函数(Delphi/C++ Builder 2009及更高版本)或device
值[windows]
部分%windir%\win.ini
(Delphi/C++ Builder)中查询默认值2007年及以前)。
TPrinter::SetToDefaultPrinter()
只调用由:
的
TPrinter::PrinterIndex
吸气如果FPrinterIndex
成员目前-1。TPrinter::PrinterIndex
setter如果FPrinterIndex
成员当前为-1,或者属性设置为-1。
TPrintDialog::Execute()
(使用Win32 API的PrintDlg()
功能)首先调用TPrinter::GetPrinter()
得到一个句柄到当前所选的打印机,然后用它来初始化对话框(通过PRINTDLG::hDevMode
场)的DEVMODE
。 TPrinter::GetPrinter()
将读取TPrinter::PrinterIndex
属性,因此如果没有当前选定的打印机并且没有默认打印机,则引发异常。
如果没有配置默认打印机,你基本上是出于运气,因为你不能连TPrinter::PrinterIndex
属性设置为一个值> = 0,因为它会首先,如果新值电流匹配检查之前调用SetToDefaultPrinter()
值。
TPrinter
在Windows中没有配置默认打印机时,存在很长的故障/崩溃历史。要解决此问题,应该直接调用Win32 API PrintDlg()
函数。至少可以手动呼叫TPrinter::GetPrinter()
(获取最初的DEVMODE
)并将其包装在try/catch
区块中以放弃它可能抛出的任何异常。
如果对话结果指示成功,您可以手动调用TPrinter::SetPrinter()
将选定的打印机选项分配到TPrinter
以供后续打印。
我检查打印机是否存在对话框使用前:
// check printer interface
TPrinter *prn = Printer();
int pxs,pys,i=0;
if (prn==NULL)i=1;
if (prn->Printers==NULL) i=1;
if (prn->Printers->Count<=0) i=1;
if (i) return;
// use dialog
dlg_print->Options.Clear();
dlg_print->Options<<poPrintToFile;
if (!dlg_print->Execute()) return;
// print
prn = Printer();
pxs=prn->PageWidth;
pys=prn->PageHeight;
prn->BeginDoc();
for (i=0;i<dlg_print->Copies;i++)
{
if (i) prn->NewPage();
// here render page into prn->Canvas as image in resolution pxs,pys
}
prn->EndDoc();
其中dlg_print
是我的对话框放置在窗体上。
太宽泛。请发布[MVCE](http://*.com/help/mcve)。 – tambre
@tambre已更新。 – Santhosh