0

ファイルから読み取り、プリンターに送信して印刷するプログラムを作成しています。

デフォルトのプリンタとして「HPLaserJet4」を設定し、「HPLaserJet4」のプリンタプロパティで「LPT1」をチェックしました。印刷スプーラーも実行されています(Windows 7)。

問題は、hPortが常にを返すことINVALID_HANDLE_VALUEです。

私は本物のプリンターを持っていません。それって問題ですか?

#include "stdafx.h"
#include <windows.h>

int main()
{
    HANDLE hPort = CreateFile(_T("LPT1:"), GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hPort != INVALID_HANDLE_VALUE) {
        printf("success");
    } else {
        printf("%i", GetLastError());
    }    
    return 0;
}
4

2 に答える 2

3

なぜLPTポートを開こうとするのか。これは本当にあなたにとって必要ですか?OSにプリンター(HP Laser Jet 4など)がインストールされていて、プリンタードライバーを使用せずに直接書き込みたい場合は、次のようにデータ(ファイルなど)を書き込むことができます。

TCHAR *pPrinterName = TEXT("HP Laser Jet 4");
TCHAR *pFileName = TEXT("c:\filename.prn");
HANDLE hPrinter = NULL;
DOC_INFO_1 docinfo;
FILE *pfile = NULL;
DWORD dwBytesWritten = 0L;
BYTE data[1024];
DWORD dwCount = 0L;

if (OpenPrinter(pPrinterName, &hPrinter, NULL))
{
  docinfo.pDocName = TEXT("RAW Output Document Name");
  docinfo.pOutputFile = NULL;
  docinfo.pDatatype = TEXT("RAW");

  DWORD dwPrtJob = StartDocPrinter(hPrinter, 1, (LPBYTE)&docinfo);

  if (dwPrtJob > 0)
  {
    if (0 == _tfopen_s(&pfile, pFileName, TEXT("rb")))
    {
      while (!feof(pfile))
      {
        dwCount = (DWORD)fread(&data, 1, 1024, pfile);
        WritePrinter(hPrinter, &data, dwCount, &dwBytesWritten);
      }
      fclose(pfile);
    }
  }
  EndDocPrinter(hPrinter);
  ClosePrinter(hPrinter);
}

おそらく、このコードにはいくつかのエラーがあります。私はそれをテストしていません。私は単に私の古いプロジェクトの1つからそれを切り取っています。

同様に、ファイル(たとえば、HP PCL5/PCL6プリンターの場合はPCL/PJLなどのプリンターコマンドを含む)を任意のプリンター/ポートに送信できます。

于 2011-04-01T06:48:36.820 に答える
0

問題は、hPortが常にINVALID_HANDLE_VALUEを返すことです。

私は本物のプリンターを持っていません。それって問題ですか?

これは、実際のLPT1(LPT2 ...)ポートがないが、プリンタデバイスまたはプリンタドライバがインストールされていない場合に問題になります。

LPT1ポートが実際に存在する場合は、デバイスマネージャまたはPCハードウェアをチェックインします。

実際に提示されたLPT1ポートの場合、コードは「成功」を返す必要があります

LPT1が実際にPCに表示されない場合は、コード(GetLastError())で2(ERROR_FILE_NOT_FOUND)を返す必要があります。

于 2011-04-01T07:45:03.107 に答える