OpenPrinter, WritePrinter,直接写打印机端口,只要知道打印机采用的语言就可以。 WritePrinter 向打印机输出数据 例: uses CommDlg; {$IFNDEF WIN32} const MAX_PATH = 144; {$ENDIF} procedure TForm1.Button1Click(Sender: TObject); var Pd : TPrintDlg; DocInfo: TDocInfo; begin FillChar(Pd, sizeof(Pd), #0); Pd.lStructSize := sizeof(Pd); Pd.hWndOwner := Form1.Handle; Pd.Flags := PD_RETURNDC; if PrintDlg(pd) then begin FillChar(DocInfo, sizeof(DocInfo), #0); DocInfo.cbSize := SizeOf(DocInfo); GetMem(DocInfo.lpszDocName, 32); GetMem(DocInfo.lpszOutput, MAX_PATH); lStrCpy(DocInfo.lpszDocName, 'My Document '); {Add this line to print to a file } lStrCpy(DocInfo.lpszOutput, 'C:/Download/Test.doc '); StartDoc(Pd.hDc, DocInfo); StartPage(Pd.hDc); TextOut(Pd.hDc, 100, 100, 'Page 1 ', 6); EndPage(Pd.hDc); StartPage(Pd.hDc); TextOut(Pd.hDc, 100, 100, 'Page 2 ', 6); EndPage(Pd.hDc); EndDoc(Pd.hDc); FreeMem(DocInfo.lpszDocName, 32); FreeMem(DocInfo.lpszOutput, MAX_PATH); end; end; // uses winspool; procedure PrintFile(const sFileName: string); const BufSize = 16384; type TDoc_Info_1 = record pDocName: pChar; pOutputFile: pChar; pDataType: pChar; end; var Count, BytesWritten: integer; hPrinter: THandle; Device : array[0..255] of char; Driver : array[0..255] of char; Port : array[0..255] of char; hDeviceMode: THandle; DocInfo: TDoc_Info_1; f: file; Buffer: Pointer; begin Printer.PrinterIndex := -1; Printer.GetPrinter(Device, Driver, Port, hDeviceMode); if not WinSpool.OpenPrinter(@Device, hPrinter, nil) then exit; DocInfo.pDocName := 'MyDocument '; DocInfo.pOutputFile := nil; DocInfo.pDatatype := 'RAW '; if StartDocPrinter(hPrinter, 1, @DocInfo) = 0 then begin WinSpool.ClosePrinter(hPrinter); exit; end; if not StartPagePrinter(hPrinter) then begin EndDocPrinter(hPrinter); WinSpool.ClosePrinter(hPrinter); exit; end; System.Assign(f, sFileName); try Reset(f, 1); GetMem(Buffer, BufSize); while not eof(f) do begin Blockread(f, Buffer^, BufSize, Count); if Count > 0 then begin if not WritePrinter(hPrinter, Buffer, Count, BytesWritten) then begin EndPagePrinter(hPrinter); EndDocPrinter(hPrinter); WinSpool.ClosePrinter(hPrinter); FreeMem(Buffer, BufSize); exit; end; end; end; FreeMem(Buffer, BufSize); EndDocPrinter(hPrinter); WinSpool.ClosePrinter(hPrinter); finally System.Closefile( f ); end; end; ************************************* procedure WriteRawStringToPrinter(PrinterName: String; S: String); var Handle: THandle; N: DWORD; DocInfo1: TDocInfo1; begin if not OpenPrinter(PChar(PrinterName), Handle, nil) then begin ShowMessage( 'error ' + IntToStr(GetLastError)); Exit; end; with DocInfo do begin pDocName := PChar( 'test doc '); pOutputFile := nil; pDataType := 'RAW '; end; StartDocPrinter(Handle, 1, ocInfo); StartPagePrinter(Handle); WritePrinter(Handle, PChar(S), Length(S), N); EndPagePrinter(Handle); EndDocPrinter(Handle); ClosePrinter(Handle); end; The PrinterName parameter must be the name of the printer as it is installed. For example, if the name of the printer is "HP LaserJet 5MP " then that is what you should pass. </quote> / Use CreateFile to get a handle to LPT1 LPTHandle := CreateFile( 'LPT1 ',GENERIC_WRITE, 0, PSecurityAttributes(nil), OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); Then use WriteFile to send a string of characters or use While not TransmitCommChar( LPTHandle, CharToSend ) do Application.ProcessMessages; It sends one raw character at a time to the parallel port. It waits for the recent character to get processed and then immediately sends a new one. I got it printing stuff pretty fast.
#4楼 得分:0回复于:2003-02-14 14:42:45 The WritePrinter function informs the print spooler that data should be written to the specified printer. BOOL WritePrinter( HANDLE hPrinter, // handle to printer object LPVOID pBuf, // pointer to array that contains printer data DWORD cbBuf, // size, in bytes, of array LPDWORD pcWritten // addr. of variable with count of bytes written ); Parameters hPrinter Identifies the printer. pBuf Points to an array of bytes that contains the data that should be written to the printer. cbBuf Specifies the size, in bytes, of the array. pcWritten Points to a value that specifies the number of bytes of data that were written to the printer. Return Values If the function succeeds, the return value is nonzero. If the function fails, the return value is zero. To get extended error information, call GetLastError