问题描述
|
以本知识库文章为例:http://support.microsoft.com/kb/322091/en-us,
我正在尝试将原始数据(字节数组)发送到热敏打印机。为此,我使用上面文章中的以下方法:
public static bool SendBytesToPrinter(string szPrinterName,IntPtr pBytes,Int32 dwCount)
{
Int32 dwError = 0,dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = \"My C#.NET RAW Document\";
di.pDataType = \"RAW\";
// Open the printer.
if (OpenPrinter(szPrinterName.normalize(),out hPrinter,IntPtr.Zero))
{
// Start a document.
if (StartDocPrinter(hPrinter,1,di))
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter,pBytes,dwCount,out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed,GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
所以我发送一个数组:
bool bSuccess = false;
...
try
{
bSuccess = RawPrinterHelper.SendBytesToPrinter(printerName,pUnmanagedBytes,nLength);
}
catch (Exception ex)
{
failprint = ex.Message;
}
if (bSuccess == true)
{
MessageBox.Show(\"Text printed\");
}
else
{
MessageBox.Show(\"Printing Failed: \" + failprint);
}
如果打印机可用,一切正常,我得到actual2ѭ以及实际打印的总和。但是,如果关闭打印机电源(在尝试打印之前),则不会出现“打印失败”消息框。相反,该应用程序被冻结并等待直到打开打印机电源,然后成功打印了排队的打印作业,应用程序被冻结,我得到了3英镑。
在应用程序不处于冻结等待状态的情况下,尝试捕获失败的打印作业时,我在哪里出错?
解决方法
您应该异步运行WritePrinter方法,然后检查Marshal.GetLastWin32Error();。
, 这是老派。您可能要使用此
// Create the printer server and print queue objects
LocalPrintServer localPrintServer = new LocalPrintServer();
PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
// Call AddJob
PrintSystemJobInfo myPrintJob = defaultPrintQueue.AddJob();
// Write a Byte buffer to the JobStream and close the stream
Stream myStream = myPrintJob.JobStream;
Byte[] myByteBuffer = UnicodeEncoding.Unicode.GetBytes(\"This is a test string for the print job stream.\");
myStream.Write(myByteBuffer,myByteBuffer.Length);
myStream.Close();
源msdn