如何修改打印机的port(100分)

  • 主题发起人 主题发起人 an
  • 开始时间 开始时间
A

an

Unregistered / Unconfirmed
GUEST, unregistred user!
我正在做一个程序,需要严格控制打印分数,程序做完了才发现原来任何打印机都可以在属性中修改“打印到以下端口”为file 可实现打印的文件中,我试了setprinter等几个命令想将port强行改为LPT1:,可没有成功,
请大侠指点
另外,有朋友说有那么一个软件,可以截取送到打印口的各类数据,生成图形文件,我的命好苦阿,help!
 
有那么一个软件,可以截取送到打印口的各类数据,生成图形文件

PaperPort
 
哪里有PaperPort,如何工作?如何阻止这该死的东西?
help!help!!
 
Hubdog Tips中的东西,不知对你有没有帮助。

改变打印机的打印端口
uses Printers;


{$IFNDEF WIN32}
const MAX_PATH = 144;

{$ENDIF}

procedure TForm1.Button1Click(Sender: TObject);

var
pDevice : pChar;

pDriver : pChar;

pPort : pChar;

hDMode : THandle;

PDMode : PDEVMODE;

begin

if PrintDialog1.Execute then
begin

GetMem(pDevice, cchDeviceName);

GetMem(pDriver, MAX_PATH);

GetMem(pPort, MAX_PATH);

Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);

FreeMem(pDevice, cchDeviceName);

FreeMem(pDriver, MAX_PATH);

FreeMem(pPort, MAX_PATH);

Printer.begin
Doc;

Printer.Canvas.TextOut(100, 100, 'Delphi Is RAD!');

Printer.EndDoc;

end;


end;


 
我来简化一下:

GetMem(pDevice, cchDeviceName);

GetMem(pDriver, MAX_PATH);

GetMem(pPort, MAX_PATH);

Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

Printer.SetPrinter(pDevice, PDriver, 'FILE:', hDMode);

FreeMem(pDevice, cchDeviceName);

FreeMem(pDriver, MAX_PATH);

FreeMem(pPort, MAX_PATH);


太繁。 这样就可以了:
var s1,s2,s3:array[0..MAX_PATH] of char;
Printer.GetPrinter(s1, s2, s3, hDMode);

Printer.SetPrinter(s1, s2, 'FILE:', hDMode);



 
各位大虾:
我的问题是将port=FILE:改为port=LPT1:,运行后跟踪参数port确实改为LPT1
可是以后的打印还是打印到了file上,其实打开控制面板看打印机的属性,port还是file:不止为何故?



 
先显示打印设置,再直接打印到临时文件,不显示打印对话框,再把文件送到LPT1
 
setprinter仅可以设置文件型的输出。
下面的过程检测当前打印机输出端口,仅可以检测系统设置的端口,
在nt中,如果运行中在“控制面板/打印机”改变打印机的输出端口
也能检测到,但是在95下面行不行就不知道。
另外,如果用你自己的程序里面用 Printer.SetPrinter 设置的端口,
下面的过程也是不能检测到的。

判断严格一点,有一点不符合就退出。(比如可以指定 LPT1 ,其他端口
都禁止)

var
h:THandle;
info:Pointer;
n:DWORD;
s1,s2,s3:array[0..1024]of char;
hmem:DWORD;
begin

printer.GetPrinter(s1,s2,s3,hmem);
//这里判断一下s3(大小写无关)

if not OpenPrinter(s1,h,nil) then

RaiseLastWin32Error();

GetPrinter(h,2,@info,0,@n);
if( GetLastError()=122 )then

GetMem(info,n)
else

RaiseLastWin32Error();

if(not GetPrinter(h,2,info,n,@n))then

RaiseLastWin32Error();

ShowMessage(PRINTER_INFO_2(info^).pPortName);
//这里判断一下PRINTER_INFO_2(info^).pPortName
end;



还有一个问题,
nt的 打印机属性/调度 有个选择:“打印完后保留文档”
如果选中该项,(即使是输出到LPT1),文档在打印完后
并不会被删除,还留在那里,可以不通过程序再打几次,
你怎么解决? 95/98不知道是否有这个功能,以后总会升级
到win2000的,win2000肯定有这个功能啦.
你怎么办?

还有啊,要是 LPT1 是虚拟的端口,数据被那个虚拟端口程序截取了,
你怎么办?
 
硬拷贝可以被复印,你最好再每次打印时注明: 这时第n次打印!
 
接受答案了.
 
后退
顶部