如何在Win98或Win2000下直接打印中文(200)

  • 主题发起人 主题发起人 haidy
  • 开始时间 开始时间
H

haidy

Unregistered / Unconfirmed
GUEST, unregistred user!
请问如何在Win98或Win2000下如何不通过AssignFile;...Write...CloseFile或FileOpen('LPT1', fmOpenWrite)...FileWrite...FileClose采用汇编等方式直接输出打印中文内容?因为别的程序已经用此方法占用了LPT1,且不释放。所以没法打印。我试过用汇编的方法procedure TForm1.AsmPrint(ConByte:BYTE);Var Port : WORD;
begin
Port := $378;
//LPT1 ASM MOV DX, Port;
MOV AL, ConByte;
OUT DX, AL;
end;
end;
就算在Win98也不行,打印机一点反应都没有,而且Win2000就更不可用了。另外,如何将中文字串输出给ConByte呢?
 
98下面可以的,但是2000下面必须用驱动(例如sys),但是98 下面必须返回打印机状态!Mov Dx,PortMov Al,conByteOut Dx,AlInc DxIn Al,DxCmp Al,0Jnz Error
 
谢谢wql答复,我对汇编不熟,能否把函数写清楚些?例如1.“Jnz Error”怎么用?在delphi6编译时会报错:Invalid combination of opcode and operands2.如何将字符串“一二三四五”赋值给conByte?3.Win2000下如何用驱动?
 
1、2k以后系统不允许ring3程序直接操作硬件(端口),无论汇编还是Delphi。。。。。2、Jnz Error相当于Delphi的goto label,表示让asm不再顺序执行,直接跳到出错信息3、在调用Mov Al,conByte前给conByte := 1 或 conByte := 2即可。4、Win2000下的驱动,请g一下WDM
 
function PrintOneChar(_Ch:Byte):byte;asmMov Dx,Port // $378Mov Al,_ChOut Dx,AlInc DxIn Al,DxCmp Al,0Jnz _Error_Error: // 注意没有返回数值end;
Procedure PrintStr(_Str:String);Varct:word;
begin
for ct:=1 to length(_str)do
if PrintOneChr(_str[ct])<>0 then
begin
shoemessage('打印出错');exit;
end;
end;
Procedure form1.button1click();
begin
PrintStr('一二三四五');
end;
 
wql,你好!按照你的写法,在Win98下运行,打印机完全没有反应啊。function TForm1.PrintOneChar(_Ch: Byte): byte;Var Port : WORD;
begin
Port := $378;
asm Mov Dx,Port Mov Al,_Ch Out Dx,Al Inc Dx In Al,Dx Cmp Al,0 Jnz @Error mov @result,Al @Error: // 注意没有返回数值 mov @result,Al end;
end;
返回值是223,请问是哪里的问题?guanyue7613, 谢谢你的解释,请问就我这个情况,如何在Win2000下实现呢?
 
有223返回就是对了,打印不是发一个字节就OK最简单的步骤是设联机字节-》收到联机正确的返回-》发送打印字节
 
谢谢41426277指教,能否帮我改改代码?你说得太抽象了,我不懂怎么做。
 
你的特定的打印机的控制码我又不知道,例如 ESC+8: 打印中文 ESC+9+3: 打印黑体字只要先端口发送控制符号,就可以打印,Win2000/XP下下载 winio.sys即可!
 
wql,你好,谢谢你不厌其烦的赐教!我这个是兼容Epson POS58系列的打印机,在DOS下直接就可以输出的(例如:dir > prn),我不知道你需要的是打印机的什么控制指令,我不需要打印黑体,甚至中文也可以暂不打印,关键是通过汇编可以打印出东西出来。另外,就算控制码是ESC+8,那又该如何写代码呢?
 
wql 厉害啊 ,不说ASM 而是对硬件认识厉害
 
标准EPSON的ESC/POS命令集代码 功能LF 换行CR 回车ESC m 局部切割ESC o 印章ESC SP 设置右边界ESC q 释放纸ESC ! 设置打印方式ESC r 选择打印颜色ESC * 设置位映射方式ESC z 设置或取消两页并行打印ESC @ 初始化打印机ESC BEL 蜂鸣器ON/OFFESC R 选择国际字符子集ESC c5 禁止/使能面板开关ESC d 打印及N行进纸ESC c6 禁止/使能ON-LINE开关ESC t 选择字符码表ESC p 产生指定脉冲ESC l 选择或取消倒过来的字符ESC V 发送打印机状态ESC c0 选择打印页ESC ~ LED ON/OFFFF 打印送出单页HT 水平TABRS 流水TABESC % 选择或取消用户自定义字符集ESC 2 选择行间距为1/6英寸ESC & 定义用户自定义字符集ESC 3 设置行进为最小间距ESC D 设置TAB位置ESC < 返回行首ESC i 全切割ESC C 设置单页长度ESC f 设单页等待时间ESC F 选择或取消单页退纸区ESC e 打印病退回N行ESC J 以最小间距进行打印和进纸ESC c4 选择打印纸及检测器(终止打印)ESC K 以最小间距进行打印和退纸ESC c3 选择纸结束信号输出ESC U 选择或取消单向打印ESC c1 选择行间距中文模式下的命令代码 功能FS & 选择中文字符模式FS – n 设置中文字符下划线模式开关FS . 取消中文模式FS ! n 选择中文字体
 
前面这么多人都说得很清楚了, 只是不能帮你写具体的代码;不知道楼主的问题在哪里?你的问题是: Windows与打印机的通讯? 还是针式打印机的控制? 还是编程基础?
 
新世纪,谢谢你的关注!我这方面领悟较差,wql,给我的汇编代码运行后仍不能打印,望大家指教。打印机的控制码我已经贴出来了。请参考。
 
PrintStr('FS ! 3'+'选择中文字体'+'FS .');
 
delphi世界qq群:23981160,希望delphi的朋友进来
 
楼主,其他程序已经占用了LPT1,你还要打印到LPT1,应该不可能吧?
 
duancy,应该可以的,他占用也只是霸占着操作系统的内存地址而已,应该有办法。DFW里面藏龙卧虎,肯定有人知道如何做的。
 
duancy,说的对,端口占用,呢的程序时不能访问的!
 
所以希望能跳过windows的控制,直接读写端口。谢谢渡鸦!
 
后退
顶部