將原始命令發送到啓用FGL的實用自動化ITX3002票據打印機時遇到一些問題。我一直在搜索整個一天,而且我無法找到使用winspool.drv Windows庫中的ReadPrinter方法的工作示例。使用ReadPrinter成功讀取打印機中的數據Winspool.drv
我發現的大多數代碼示例都與網絡打印機有關。這是通過USB連接的簡單打印機。我需要檢索一些我已經知道的響應結構的命令(複合結構,由供應商詳細記錄)。
我能夠發送FGL命令來成功打印正常和診斷票據。我的問題是,從打印機讀回數據。我已閱讀http://msdn.microsoft.com/en-us/library/dd162895(v=vs.85).aspx和其他幾個地方的Microsoft文檔。該文檔不解釋如何發送該方法正在閱讀的數據。
所以,我真的不知道是否必須用我需要的命令調用WritePrinter,關閉句柄,然後調用ReadPrinter來檢索數據,或者如果必須在單個打印機句柄管理中完成所有操作我的意思是,打開,工作並關閉打印機手柄)。
該供應商一直非常耐心與我,但答覆不給我任何幫助如何得到這個。
這是我的代碼:
[DllImport("winspool.Drv", EntryPoint = "ReadPrinter", SetLastError = true, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern Boolean ReadPrinter(IntPtr hPrinter, StringBuilder data, Int32 cbBuf, out Int32 pNoBytesRead);
public static Boolean ReadBytesFromPrinter(String szPrinterName, out String data)
{
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
Boolean bSuccess = false; // Assume failure unless you specifically succeed.
data = null;
di.pDocName = "SendBytesToPrinter";
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))
{
Int32 maxRead = 256;
StringBuilder sbData = new StringBuilder(maxRead);
//Read Data
bSuccess = ReadPrinter(hPrinter, sbData, maxRead, out dwWritten);
data = sbData.ToString();
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();
data = null;
}
return bSuccess;
}
ReadPrinter總是返回 「假」,並調用GetLastWin32Error始終爲零。換句話說,有一個錯誤,沒有關於什麼的線索,也沒有數據被讀回。
我按照http://support.microsoft.com/kb/322091中的說明發送命令,並且按預期方式成功工作,打印命令和診斷票證打印。
有沒有人知道代碼和打印機之間的正確握手?它應該如何編寫命令,以及如何讀取響應?對我來說,創建一個打印作業,一個打印文檔和一個打印頁面來檢索數據是沒有意義的(我已經嘗試過了,順便說一下)。我錯過了什麼嗎?我做錯了什麼?
那麼,該片段根本沒有意義。您需要OpenPrinter,然後WritePrinter發送應該返回數據的命令,然後ReadPrinter實際讀取它。您應該向供應商索取任何語言的程序示例。如果他們不能給你一個,那麼把它寫成實用的,如果供應商不能用他自己的產品做,那麼你就沒有希望了。 – 2014-09-05 23:36:14
感謝您的回覆,Hans。如果我OpenPrinter,然後WritePrinter,然後讀取,一個錯誤將被拋出(vshost32.exe停止工作)。如果我在WritePrinter之前調用「StartDocPrinter」,則不會拋出錯誤,但Read調用不會返回數據。我不認爲這對我們的供應商來說是一個特殊的問題,ReadByte的例子非常稀少,它們應該適用於任何雙向打印機。供應商正在成功從打印機讀取數據,但不會將所有命令公開給他提供的api。我無法對其進行逆向工程來重複調用...... – fabrosell 2014-09-08 13:25:29
很明顯,代替一個永遠無法工作的代碼片段,您應該發佈供應商提供的* *代碼。只有這樣才能幫助別人幫助你。 – 2014-09-08 13:42:46