2012-05-15 204 views
0

我有一個接收打印命令並將其解碼的應用程序。 我將打印命令保存在文本文件中。然後在字節數組中讀取它。 解碼的字符串還包含顯示爲垃圾字符的圖像部分。 當我嘗試使用WritePrinter函數將字節數組發送到打印機時,它將返回False。 我試圖檢查返回的錯誤代碼是,但找不到任何有關此錯誤代碼以及它可能發生的原因。使用熱敏打印機打印base64編碼打印命令時出錯

請找到下面的代碼片段:

AssignFile (decodedfile, st_path + '\Sample.txt'); 
reset(decodedfile); 
SetLength(buffer, FileSize(decodedfile)); 
For i := 1 to FileSize(decodedfile) do 
    Read(decodedfile, buffer[i - 1]); 
CloseFile(decodedfile); 
DocInfo.pDocName := pChar('Direct to Printer'); 
DocInfo.pOutput := Nil; 
DocInfo.pDatatype := pChar('RAW'); 
PrinterName := cmbPrinters.Text;; 
if not WinSpool.OpenPrinter(pChar(PrinterName), hPrinter, nil) then begin 
    raise exception.create('Printer not found'); 
end; 
If StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then 
    Abort; 
try 
    If not StartPagePrinter(hPrinter) then 
     Abort; 
    try 
     If not WritePrinter(hPrinter, @buffer, Length(buffer), BytesWritten) then begin 
      dError := GetLastError; 
      ShowMessage(InttoStr(dError)); 
      Abort; 
     end; 
    finally 
     EndPagePrinter(hPrinter); 
    end; 
finally 
    EndDocPrinter(hPrinter); 
end; 
WinSpool.ClosePrinter(hPrinter); 

如果有人遇到類似這樣的任何問題,請讓我知道如果我錯過了什麼。

注:

  1. 我已經證實沒有在輸入打印命令解碼沒有錯誤。
  2. 我使用Delphi 4.
+0

1784是[ERROR_INVALID_USER_BUFFER所提供的用戶緩衝區是無效的請求的操作](http://msdn.microsoft.com/en-us/library/windows/desktop/ms681386.aspx) –

回答

1

它看起來像buffer是一個動態數組。如果您將變量的聲明包含在代碼的其餘部分中,這將非常有幫助。不過,我想以合理確信它的類型是

buffer: array of Byte; 

但你傳遞給@bufferWritePrinter。這是指向數組第一個字節的指針地址。

您只需將指針傳遞給第一個字節即可。就像這樣:

WritePrinter(..., Pointer(buffer), ...); 

順便加載文件的方式是有點過時了。創建一個TMemoryStream並致電LoadFromFile可能會更簡單。

stream := TMemoryStream.Create; 
try 
    stream.LoadFromFile(filename); 
    .... 
    if not WritePrinter(..., stream.Memory, stream.Size, ...) then 
    .... 
finally 
    stream.Free; 
end; 
+0

感謝許多。這工作! – Abhineet