对打印方式的求解(200分)

  • 主题发起人 主题发起人 foxyxyan
  • 开始时间 开始时间
F

foxyxyan

Unregistered / Unconfirmed
GUEST, unregistred user!
为解决一个打印的问题,实时打印票据,
但对windows的打印过程不是很清楚,有些问题希望大家能给予详解:
1、有两种方式供选择,不知那种好:对象TPrinter和操作打印口
2、连续操作时(前一打印任务正在执行中,下一个任务提交),这两种方式各会有什么
需要考虑使任务正常完成。
3、对两种打印方式各有什么函数或步骤可以检测执行情况?
 
function TPrintMai_frm.getjob(): integer;
var
Needed, Returned: DWORD;
i, Count: integer;
tbt: byte;
pNeeded: PDword;
P2: PJobInfo1;
PPI: pPRINTERINFO2;
Printer: TPrinter;
Device, Driver, Port: array[0..255] of Char;
PPr, DevMode: Cardinal;
hPrinter: THandle;
begin
result := 0;
Printer := TPrinter.Create;
//创建Printer对象
try
Printer.GetPrinter(Device, Driver, Port, DevMode);
//取得打印机的名称,驱动程序,端口号
if not OpenPrinter(@device, hPrinter, nil) then
//取得打印机的句柄
begin
ShowMessage('OpenPrinter' + SysErrorMessage(GetLastError));
//Exit;
end;
PNeeded := AllocMem(8024);
//分配内存空间
P2 := AllocMem(8048);
PPI := AllocMem(8048);
//接受打印机信息结构
if not GetPrinter(hPrinter, 2, PPI, 8048, PNeeded) then
//取得打印机队列中的任务数
begin
ShowMessage('GetPrinter' + SysErrorMessage(GetLastError));
end;
//取得打印机状态
if Enumjobs(hPrinter, 0, 1, 2, p2, 8048, Needed, Returned) then
begin
if P2.JobId = 0 then
result := 0;
if P2.JobId > 0 then
begin
result := PPI.cJobs;
end
end
else
ShowMessage('Enumjobs' + SysErrorMessage(GetLastError));
//关闭打印机,释放内存空间
finally
FreeMem(PNeeded);
FreeMem(p2);
FreeMem(PPI);
Printer.Free;
ClosePrinter(hPrinter);
end;
end;
//我用这个法子检测打印机中还有没有打印任务,你参考一下吧
 
接受答案了.
 
后退
顶部