myamanda

博客园 首页 新随笔 联系 订阅 管理

Windows环境下的实时采集越来越多,但如何实现一台计算机控制下的两台打印机或多台打印机分时输出却困难重重,这主要是由于Windows的页式输出方式造成的。
LIBRARY MYDLL;
VAR CHARAL,PORTDX:BYTE;
FUNCTION PRINTCHAR(CHARAL,PORTDX:BYTE):INTEGER;EXPORT;
BEGIN;
ASM;
MOV AL,CHARAL
MOV DL,PORTDX
MOV AH,00H
INT 17H
MOV CHARAL,AH
END;
PRINTCHAR:=CHARAL;
END;
FUNCTION PRINTINIT (PORTDX:BYTE):INTEGER;EXPORT;
BEGIN;
ASM;
MOV DL,PORTDX
MOV AH,01H
INT 17H
MOV AH,CHARAL
END;
PRINTINIT:=CHARAL;
END;
EXPORTS
PRINTCHAR INDEX 1;
PRINTINIT INDEX 2;
BEGIN
END.
上面的DLL包括了PRINTCHAR和PRINTINT两个函数,分别用于字符输出和打印机初始化。我们给它起个名字为MYDLL.DPR,在Delphi下编译后便可生产MYDLL.DLL,将其拷入Windows的SYSTEM子目录之下就可以为其它程序所调用了。
在VB环境下调用此DLL非常容易,按VB的要求,首先在MODULE中定义这两个函数:
DECLARE FUNCTION PRINTCHAR LIB"MYDLL.DLL"(BYVAL PORT_ASCII AS INTEGER,BYVAL PORT_ADD AS INTEGER) AS INTEGERDECLARE FUNCTION PRINTINIT LIB"MYDLL.DLL"(BYVAL PORT_ADD AS INTEGER) AS INTEGER在VB的COMMAND或其它按钮的CLICK过程中运行下面的D elphi代码(假定Windows的DEFAULT打印机定义在LPT2上,纸张为A4):
DIM PRINTER1,PRINTER2 AS INTEGER
DIM OUTSTRING AS STRING
PRINTER1=0:PRINTER2=1
OUTSTRING="打印机直接输出测试程序"
PRINTER.SCALEMODE=6
PRINTER.FONTNAME="SYSTEM"
PRINTER.FONTSIZE=9.75
FOR I=1 TO 50
PRINTER.PRINT FORMAT$(I,"####.##")
FOR J=1 TO LEN(OUTSTRING)
OUTCHAR%=ASC(MID$(OUTSTRING,J,1))
OUTPORT%=PRINTER1
R%=PRINTCHAR(OUTCHAR%,OUTPORT%)
NEXT J
OUTCHAR%=&HOD
OUTPORT%=PRINTER1
R%=PRINTCHAR(OUTCHAR%,OUTPORT%)
NEXT I
PRINTER.ENDDOC
在PRINTER1上可以见到连续的输出,由于打印机具有汉字库,因此,可以实现中英文混合输出。而PRINTER2因未遇到PRINTER.ENDDOC,所以不能打印输出。
上面的程序适合于所有打印机端口,完全符合17号中断的要求,因此可以较好地完成打印工作。

posted on 2009-10-14 11:30  myamanda  阅读(214)  评论(0)    收藏  举报