2014-09-05 210 views
1

將原始命令發送到啓用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中的說明發送命令,並且按預期方式成功工作,打印命令和診斷票證打印。

有沒有人知道代碼和打印機之間的正確握手?它應該如何編寫命令,以及如何讀取響應?對我來說,創建一個打印作業,一個打印文檔和一個打印頁面來檢索數據是沒有意義的(我已經嘗試過了,順便說一下)。我錯過了什麼嗎?我做錯了什麼?

+0

那麼,該片段根本沒有意義。您需要OpenPrinter,然後WritePrinter發送應該返回數據的命令,然後ReadPrinter實際讀取它。您應該向供應商索取任何語言的程序示例。如果他們不能給你一個,那麼把它寫成實用的,如果供應商不能用他自己的產品做,那麼你就沒有希望了。 – 2014-09-05 23:36:14

+0

感謝您的回覆,Hans。如果我OpenPrinter,然後WritePrinter,然後讀取,一個錯誤將被拋出(vshost32.exe停止工作)。如果我在WritePrinter之前調用「StartDocPrinter」,則不會拋出錯誤,但Read調用不會返回數據。我不認爲這對我們的供應商來說是一個特殊的問題,ReadByte的例子非常稀少,它們應該適用於任何雙向打印機。供應商正在成功從打印機讀取數據,但不會將所有命令公開給他提供的api。我無法對其進行逆向工程來重複調用...... – fabrosell 2014-09-08 13:25:29

+0

很明顯,代替一個永遠無法工作的代碼片段,您應該發佈供應商提供的* *代碼。只有這樣才能幫助別人幫助你。 – 2014-09-08 13:42:46

回答

1

您是否在打印機屬性對話框的端口選項卡中檢查了Enable bidirectional support?如果顯示爲灰色,則需要找到支持雙向通信的驅動程序。

+1

其實,是的,我已經檢查過。由於缺乏結果,我放棄了該項目。即使製造商(誰提供了一個明顯的如何從打印機回讀工作版本)也無法幫助,因爲「他們丟失了源代碼」。這是我們都喜歡的功能,包括在我們的應用程序中(當打開時自動報告打印機序列號),但我們的業務可以處理。謝謝,順便說一句,你的幫助。 – fabrosell 2016-02-15 14:58:36