0

印刷コマンドを受信して​​デコードするアプリケーションがあります。印刷コマンドをテキスト ファイルに保存します。そして、それをバイト配列で読み取ります。デコードされた文字列には、ジャンク文字として表示される画像部分も含まれます。WritePrinter関数を使用してバイト配列をプリンターに送信しようとすると、 False が返されます。返されたエラー コード1784を確認しようとしましたが、このエラー コードとその理由については何も見つかりませんでした。

以下のコード スニペットを参照してください。

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. Delphi4を使用しています。
4

1 に答える 1

1

buffer動的配列のように見えます。変数の宣言を残りのコードに含めていれば、非常に役に立ちました。しかし、私はそのタイプが

buffer: array of Byte;

しかし、あなたはに渡し@bufferますWritePrinter。これは、配列の最初のバイトへのポインタのアドレスです。

ポインタを最初のバイトに渡すだけです。このような:

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

余談ですが、ファイルをロードする方法は少し古風です。TMemoryStreamを作成して呼び出す方がおそらく簡単でしょうLoadFromFile

stream := TMemoryStream.Create;
try
  stream.LoadFromFile(filename);
  ....
  if not WritePrinter(..., stream.Memory, stream.Size, ...) then
    ....
finally
  stream.Free;
end;
于 2012-05-15T12:34:20.943 に答える