




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 实用程序 本章提供了12个用TURBO PASCAL编写的实用程序,包括软锁驱动器的程序、锁硬盘逻辑分区的程序、稿纸排版打印程序、源程序列表程序、查找并替换程序、备份硬盘主引导记录程序、四通-PC文本文件双向转换程序、SPT文件和BMP文件的双向转换程序、数据库文件打卡程序、BATCH文件转换为COM文件的程序、机密文件的有效销毁程序、释放内存程序等12个。下面具体介绍每个程序的编写原理和使用方法。 3.1 软锁驱动器程序 一般286或386微机都有一个容量极大的硬盘,为使用方便,在硬盘上要安装许多系统软件和专用软件,同时还有很多用户开发的应用程序,由于DOS系统的安全性比较差,软件、程序或数据往往容易被他人非法复制。怎样才能防止他人非法复制呢? 人们想出许多方法,其中有给硬盘加口令字,使子目录名变为隐含等多种方法,我向大家介绍一种使逻辑驱动器失效的防拷贝方法。巧妙地使用本节提供的程序,计算机从硬盘启动后,可以使软驱(包括A、B驱)均失效,当在C:提字符下打入A:并回车,则显示“Invalid drive specification”,键入B:时,同样显示此信息。这样在不得到许可时,非法用户是很难拷贝程序和软件的。 3.1.1 获得驱动器路径表的方法 获得驱动器路径表需要用到未编入文档的DOS功能调用52H,该功能调用的用途是得到内部缓冲器的指针,该指针指向的表描述了与存储子系统有关的大多数DOS内部结构,返回指针存在ES:BX中。这个缓冲区的结构随DOS的主要版本而异,对DOS3.XX及以上版本,此表的偏移16H处为指向驱动器路径的远指针。驱动器路径表由多个表项组成,每个表项均包含缺省值路径、磁头位置和各种标志和指针,表项的数目等于有效逻辑驱动器数加1,最后一表项的标志变量为零,没有任何有用数据。驱动器路径表项的结构如表3-1。表3-1.驱动器路径表项的结构殌偏 移 长 度 说 明 0 字 节 ASCIIZ格式的当前缺省值路径名,包含着逻辑驱动 (64) 器字母、冒号分隔符和起始符 40H 双 字 保留,置为0 44H 字 节 标志变量,所有有效项包含一个40H,最后一项包含0 45H 双 字 逻辑驱动器参数块的远指针 49H 字 此逻辑驱动器的当前块或磁道/扇区编号 4BH 双 字 远指针 4FH 字 未知存储 殣 从表3-1可知,在驱动器路径表每个表项的偏移44H处的一个字节为该逻辑驱动器是否有效的标志,有效时为40H,为其它值则无效,所以要逻辑驱动器失效可以通过DOS功能调用52H,来修改这个标志为0即可。作者用TURBO PASCAL和TASM编写一个程序SL.PAS,可以用来修改逻辑驱动器路径表,使逻辑驱动器失效和有效,源程序清单附后。 3.1.2 使用方法 该程序采用命令行格式:SL d: /switch其中d代表驱动器,switch为开关,可取L和U,取时L执行锁驱动器过程,取U时解锁已锁的驱动器。典型用法:SL - 显示程序的帮助信息SL C: - 显示C逻辑盘的当前状态SL C: /L - 锁C逻辑盘SL C: /U - 解锁C逻辑盘该程序只能在MS DOS 3.0以上的操作系统下工作。在对逻辑驱动器解锁时,程序提示输入口令,程序设定的口令是“ABCDEF”,在SOFTLOCK.ASM的源程序中可以找到。 3.1.3 作用与效果 . 防止他人非法拷贝软件、程序或数据。. 预防病毒的入侵:因为非机器管理人员在未得到许可时无法使用软驱,从而可以减少病毒入侵的机会。该程序经过我的长期使用,非常有效,而且减少了病毒的入侵机会。每当交换数据前,我们均用防毒软件对软盘进行消毒,以致于病毒很难侵入系统,这对系统的安全和数据的保密都有很好的效果。 3.1.5 源程序清单 程序1: SL.PAS SL.PAS 1.0 Copyright (C) 1991 Dong Zhanshan program SoftLock; var Drive,Switch: Char; $L SOFTLOCKprocedure DriveState;External; procedure LockDrive;External; procedure UnLockDrive;External; function GetDriveNum: Byte;External; procedure Help;beginWriteLn(Syntax: SL d: /Switch);WriteLn(Switch: /L = Lock the drive d:);WriteLn( /U = Unlock the drive d:);WriteLn(Examples: SL - Display help text);WriteLn( SL C: - Display the state of drive C);WriteLn( SL C: /L - Lock the drive C);WriteLn( SL C: /U - Unlock the drive C);WriteLn(Note: Only Using in MS DOS 3.0 and over);end; procedure Works;begincase Switch ofL : LockDrive;U : UnLockDrive;else WriteLn(The switch is invalid !);end;end; procedure WriteError;beginWriteLn(The parameter is error !);Writeln;Help;Halt;end; procedure GetParameter;var TempStr: String2;TempChar: Char;beginif ParamCount 0 thenbeginTempStr := ParamStr(1);if TempStr2 = : thenbeginTempChar := UpCase(tempstr1);if TempChar in A.Z,a.z thenDrive := TempCharelseWriteError;endelseWriteError;end;if ParamCount 1 thenbeginTempStr := ParamStr(2);if TempStr1 = / thenbeginTempChar := UpCase(TempStr2);if TempChar in L,U thenSwitch := TempCharelseWriteError;endelseWriteError;end;end; beginWriteLn(SL version 1.0 Copyright (c) 1991 Dong Zhanshan);GetParameter;if (Ord(Drive) = 65) thenif (Ord(Drive) - 64 GetDriveNum) then WriteError;case ParamCount of0 : Help;1 : DriveState;2 : Works;else WriteError;end;end. 程序2: SOFTLOCK.ASM ; Turbo PASCAL 4.0-6.0; Turbo Assembler include file for SL.PAS program; Copyright (C) 1991 Dong Zhanshan Title SoftLockLOCALS DOSSEG.MODEL TPASCAL.DATAEXTRN Drive: Byte.CODEUnLockMsg1 DB 0dh,0ah,Your password is correct, DB the drive is unlocked !,0dh,0ah,$UnLockMsg2 DB 0dh,0ah,Your password is not correct, DB the drive cannot be unlocked !,0dh,0ahdb Please ask system manager to get the password !db 0dh,0ah,$LockState db The state of the drive is locked !,0dh,0ah,$UnLockState db The state of the drive is unlocked !,0dh,0ah,$LockMsg db This drive has been locked!,0dH,0ah,$YourPsWd db 6 dup (0)PsWdStr db ABCDEFPsWdMsg db Enter the PASSWORD : $ ;Function GetDriveNum:byte; PUBLIC GetDriveNum GetDriveNum:push bpsub ax,axmov ah,52hint 21hsub ah,ahmov al,es:bx+20hpop bpret ; Procedure DriveState; PUBLIC DriveState DriveState:CALL GetAddressMOV AX,ES:BXCMP AX,40HJNE 1mov dx,offset UnLockStatecall DisplayMessengeJMP 21: mov dx,offset LockStatecall DisplayMessenge2: RET ; Procedure LockDrive PUBLIC LockDriveLockDrive:CALL GetAddressMOV AH,00MOV ES:BX,AHMOV DX,OFFSET LockMsgcall DisplayMessengeRET ; Procedure UnLockDrive PUBLIC UnLockDriveUnLockDrive:CALL PassWordCMP AL,01JNE 1CALL GetAddressMOV AH,40HMOV ES:BX,AHmov dx,offset UnLockMsg1call DisplayMessengeJMP 21:mov dx,offset UnLockMsg2call DisplayMessenge 2: RET; Get Drive path address; IN none; OUT ES = Segment; BX = Offset GetAddress:SUB AX,AXMOV AH,52HINT 21HMOV AX,ES:BX+18HPUSH AXMOV AX,ES:BX+16HMOV BX,AXPOP ESsub ch,chmov cl,Drivemov al,41hsub cl,alinc cl1: ADD BX,51HLOOP 1SUB BX,0dHRET ; Get a password and check it ; IN none; OUT none; al = 0 - invalid password; al = 1 - valid password PassWord:MOV DX,OFFSET PsWdMsgcall DisplayMessengeMOV CX,06HMOV BX,00H1: MOV AH,00INT 16HMOV YourPsWdBX,alCALL WriteXCharINC BXLOOP 1MOV CX,06HMOV BX,00H2: MOV AL,YourPsWdBXcmp PsWdStrBX,ALJNE 3 INC BX LOOP 2 MOV AL,01HJMP 43: MOV AL,004: RET ; Write a char X in current cursor on screen; IN none; OUT none WriteXChar:PUSH AXPUSH BXPUSH CXMOV AH,0AHMOV AL,XMOV BH,00MOV CX,1INT 10HMOV AH,03MOV BX,00INT 10HINC DXMOV AH,02INT 10HPOP CXPOP BXPOP AXRET ;Display messenge;in DX = offset address;out none DisplayMessenge:push dspush cspop dsmov ah,09hint 21hpop dsret END 3.2 锁硬盘逻辑盘程序 随着微处理器的更新换代,目前一般的中高档微机均配备有一个容量很大的硬盘机,小则几十MB,多则上百MB。在硬盘上要同时安装许多公用软件和用户文件,通常用户文件大多是个人的私有信息,不愿让他人随意查看和复制。报刊上介绍了多种硬盘的加密方法,多数是独占整个硬盘,禁止让不知道口令的用户使用。本人通过对硬盘逻辑盘结构的详细分析,提出了对硬盘的一个逻辑盘进行加密的有效方法,达到了独占一个硬盘逻辑盘的目的,从而圆满地解决了上述问题。 3.2.1 逻辑盘的内部结构 FDISK把硬盘主引导记录存放在硬盘的第一个物理扇区,即0面0柱1扇区,在该扇区的1BEH-1FDH处(共64个字节)是硬盘的分区表,我们称这个分区表为主分区表,它由4个16字节的登记项组成,每个登记项描述一个特定的分区,其中各字节代表的意义见表3-2。表3-2.分区表登记项各字节的意义殌 意 启动 分区开始 系统 分区结束 相对扇扇 区 义 标志头 扇区 柱体标志头 扇区 柱体区数 总 数 偏移 00 01 02 03 04 05 06 07 08-11 12-15 殣其中“系统标志”字节可以取以下不同的值:01:DOS分区,该分区FAT表每项为12位;02:XENIX分区;04:DOS分区,该分区FAT表每项为16位;05:扩展DOS分区;06:大DOS分区,为MS DOS 4.00以上DOS版本在管理大于32MB盘或逻辑分区时所使用的标志,分区的FAT表每项为16位。MS/PC DOS 3.30的FDISK程序把初始DOS分区信息放在主分区表的第一个登记项,而第二个登记项为扩展DOS分区信息,其余登记项为空。初始DOS分区代表C逻辑盘,扩展DOS分区的划分要根据它自己的分区表而定。扩展DOS分区的第一个扇区上记录有该扩展DOS分区的划分信息,这个分区被称为第一扩展DOS分区表,其中的第一个登记项记录着D逻辑盘的信息,第二个登记项记录了第二个扩展DOS分区的信息;第二个扩展DOS分区的第一个扇区记录了该扩展DOS分区的信息,其第一个登记项记录了E逻辑盘的信息,第二个登记项记录了第三个扩展DOS分区的信息;依此类推,可以找到所有扩展分区的信息。表3-3列出了一个62MB硬盘的所有分区信息。由表3-3可以知道,FDISK把硬盘的分区信息,以链表格式存放在硬盘的不同物理扇区上,每一个逻辑盘均有一个对应的分区信息表,且与一个物理扇区一一对应,如C盘与0面0柱1扇区对应,D盘与0面90柱1扇区对应。表3-3.一个62MB硬盘分区信息表殌 定 位 系 统启动 分区开始 分区结束 相 对总扇逻辑面 柱 扇标 志标志面 柱 扇面 柱 扇扇 区区 数 盘 0 0 1DOS-12Yes 1 0 1 7 89 26 26 18694 C EXTENDNo 0 90 1 7 613 260 90 1DOS-16No 1 90 1 7 289 26 26 41574 D EXTENDNo 0 290 1 7 389 26 41600 20800 0 290 1DOS-16No 1 290 1 7 389 26 26 20774 E EXTENDNo 0 390 1 7 613 26 62400 46592 0 390 1DOS-16No 1 390 1 7 613 26 26 46566 F 殣3.2.2 硬盘数据保密的原理 DOS对逻辑盘的管理是通过一个单链将若干个相互独立的连续盘区联系起来,每个连续的盘区均有一套完整的分区引导记录、FAT、文件目标和数据区。DOS在启动过程中,根据每个分区表中每个登记项的系统标志字节的内容来识别逻辑分区,如果该字节的值为DOS分区的有效值,则DOS将其视为有效分区,系统启动后,用户通过一逻辑盘使用这个分区;否则认为是无效分区,系统启动后,不为这个分区分配逻辑盘符,用户也就无法使用此分区,其数据也就暂时“隐含”起来了。根据上述原理,我们可以使用BIOS提供的13H号中断完成硬盘分区表的读写和系统标志字节的更改,实现逻辑分区的锁闭与解锁,达到个人数据和机密数据的安全与保密。 3.2.3 程序设计及其使用方法 程序设计的基本思路是:首先把分区表链读入内存,分析各分区的状态,根据用户的要求,若对某一分区加锁,则判断该分区的当前状态,如已锁,则返回,否则,对代表该分区的登记项的系统标志字节求反,提示用户输入口令,最后将修改了的分区表写回对应的物理扇区,重新启动机器后,该分区就“消失”了;解锁的过程基本同上,不过多了一道校验口令的过程。本人应用TURBO PASCAL编写了一个程序HDL.PAS,经过编译生成执行文件后,在DOS系统下直接运行,能方便地完成硬盘逻辑分区的锁闭与解锁,并且可以加上用户自己的口令,某逻辑盘锁了以后,不知道口令的用户是无法打开的。程序的使用方法很简单,其使用格式为:HDL 其中d为逻辑分区对应的盘符,如C、D等,switch为选择开关,可以选:L - 为锁逻辑分区;U - 为解锁逻辑分区;尖括号代表参数可以缺省。例如直接执行“HDL”显示程序的帮助信息;执行“HDL D:”显示D逻辑盘的当前状态;执行“HDL D: /L”锁D逻辑盘。 3.2.4 源程序清单 HDL.PAS 1.1 Copyright (c) 1992,94 Dong Zhanshan program Hard_Disk_Lock; This program may lock or unlock a logical partition of the hard disk. It was written by Dong Zhanshan in 1992.8 at CRI. uses disk; var store all partition information Buffer : array1.24 of MBRT; store states of all logical drive DriveState : array1.24 of Boolean; the number of logical drives DriveNum : byte;Switch,Drive : char; procedure reboot;inline($EA/$00/$00/$FF/$FF); jmp FFFF:0000 function readkey:char;inline($b4/$07/ mov ah,07 $cd/$21); int 21h procedure Help; the help information of this program beginWriteLn(Syntax: HDL d: /Switch);WriteLn(Switch: L = Lock the specifed drive);WriteLn( U = Unlock the specifed drive);WriteLn(Examples: HDL - Display help text);WriteLn( HDL D: - Display the state of drive D:);WriteLn( HDL D: /L - Lock the drive D:);WriteLn( HDL D: /U - Unlock the drive D:);end; function FindExtendedPartition(p1:MBRT):byte; find the position of extended dos partition var i : byte;beginFindExtendedPartition := 0;for i := 1 to 4 dobeginif (p1.PartitionTablei.SysIndicator = 5)or (not p1.PartitionTablei.SysIndicator = 5)thenbeginFindExtendedPartition := i;exit;end;end;end; function FindDosPartition(p1:MBRT):byte; find the position dos partition var i : byte;beginFindDosPartition := 0;for i := 1 to 4 dobeginif (p1.PartitionTablei.SysIndicator in 1,4,6)or (not p1.PartitionTablei.SysIndicator in 1,4,6)thenbeginFindDosPartition := i;exit;end;end;end; procedure WriteError(S : string);beginWriteLn(S);Halt;end; function ReadPassWord:string;var ch : char;tstr : string6;done : boolean;i : byte;begindone := false;i := 0;tstr := ;repeatch := readkey;case ch of#0 : ch := readkey;#13 : done := true;#27 : begindone := true;tstr := ;end;else begininc(i);tstr := tstr + ch;write(X);if i = 6 then done := true;end;end;until done;ReadPassWord := Tstr;end; procedure SetPassword(var p1:MBRT);var tstr1,tstr2 : string6;i : byte;beginfor i := 0 to 6 dobegintstr1i := #0;tstr2i := #0;end;repeatwrite(Please enter password: );tstr1 := ReadPassWord;writeln;write(Please enter password again: );tstr2 := ReadPassWord;writeln;until tstr1 = tstr2;move(tstr10,p1.MainBoot439,7);end; function GetPassword(p1:MBRT) : boolean;var tstr1,tstr2 : string6;i : byte;beginGetPassWord := false;for i := 0 to 6 dobegintstr1i := #0;tstr2i := #0;end;write(Please enter password: );tstr1 := ReadPassWord;writeln;move(p1.MainBoot439,tstr20,7);if tstr1 = tstr2 then GetPassWord := true;end; procedure LockDrive;var StartCyl,StartSec : byte;i,j : byte;p : MBRT;begini := ord(Drive) - ord(C) + 1;if DriveStatei thenbeginif i = 1 thenbeginStartCyl := 0;StartSec := 1;endelsebeginj := FindExtendedPartition(Bufferi-1);StartCyl := Bufferi-1.PartitionTablej.StartCylinder;StartSec := Bufferi-1.PartitionTablej.StartSector;end;j := FindDosPartition(Bufferi);Bufferi.PartitionTablej.SysIndicator :=not Bufferi.PartitionTablej.SysIndicator;SetPassWord(Bufferi);p := Bufferi;ProcessPhysicalSector(3,$80,0,StartCyl,StartSec,1,p);writeln(The drive ,Drive,: has been locked !);reboot;endelsewriteln(The drive ,Drive,: is locked !);end; procedure UnlockDrive;var StartCyl,StartSec : byte;i,j : byte;p : MBRT;begini:= ord(Drive) - ord(C) + 1;if not DriveStatei thenbeginif GetPassWord(Bufferi) thenbeginif i = 1 thenbeginStartCyl := 0;StartSec := 1;endelsebeginj := FindExtendedPartition(Bufferi-1);StartCyl := Bufferi-1.PartitionTablej.StartCylinder;StartSec := Bufferi-1.PartitionTablej.StartSector;end;j := FindDosPartition(Bufferi);Bufferi.PartitionTablej.SysIndicator :=not Bufferi.PartitionTablej.SysIndicator;p := bufferi;ProcessPhysicalSector(3,$80,0,StartCyl,StartSec,1,p);writeln(The drive ,Drive,: has been unlocked !);reboot;endelseWriteError(Your password is error, the drive +Drive + : may not be unlocked !);endelsewriteln(The drive ,Drive,: is unlocked !);end; procedure Works;begincase Switch ofL : LockDrive;U : UnLockDrive;end;end; procedure GetDriveState;var i : byte;begini := ord(Drive) - ord(C) + 1;if DriveStatei thenwriteln(The drive ,Drive,: is unlocked !)elsewriteln(The drive ,Drive,: is locked !);end; procedure GetParameter;var TempStr : String2;TempChar : Char;beginif ParamCount 0 thenbeginTempStr := ParamStr(1);if TempStr2 = : thenbeginTempChar := UpCase(tempstr1);if TempChar in A.Z thenDrive := TempCharelseWriteError(Does not exist this drive !);endelseWriteError(The first parameter is error !);end;if ParamCount 1 thenbeginTempStr := ParamStr(2);if TempStr1 = / thenbeginTempChar := UpCase(TempStr2);if TempChar in L,U thenSwitch := TempCharelseWriteError(The switch is error !);endelseWriteError(The second parameter is error !);end;end; procedure GetAllPartition;var StartCyl,StartSec : word;i,j,k : byte;P : MBRT;beginStartCyl := 0;StartSec := 1;i := 0;repeatProcessPhysicalSector(2,$80,0,StartCyl,StartSec,1,p);j := FindExtendedPartition(p);StartCyl := P.PartitionTablej.StartCylinder;StartSec := P.PartitionTablej.StartSector;inc(i);Bufferi := p;k := FindDosPartition(p);if (P.PartitionTablek.SysIndicator in 1,4,6)then DriveStatei := true;until j = 0;DriveNum := i;end; Procedure Init;var i : byte;begindrive := #0;for i := 1 to 24 do DriveStatei := false;end; beginWriteLn(HDL version 1.0, Copyright (C) 1992 Dong Zhanshan);init;GetParameter;GetAllPartition;if drive #0 thenif (Drive in A,B) thenWriteError(Floppy diskette is not able to be locked !)else if (Ord(Drive) = 67) thenif (Ord(Drive) - 66 DriveNum) thenWriteError(This logical drive does not exist !);case ParamCount of0 : Help;1 : GetDriveState;2 : Works;else WriteError(Too many parameters !);end;end. 3.3 稿纸排版打印程序 稿纸排版打印程序(SP)是一个通用的方格稿纸打印程序,用TURBO PASCAL编写,在中文、英文操作系统下均可运行。SP适用于中文文稿的方格稿纸格式输出,可打印中文、英文、图表混合的文稿,既清晰又美观,对科技文章的作者、文艺作品的作者以及其他写作爱好者,SP将是一个无与伦比的好帮手。SP可以省去你反复改稿誊稿的烦恼,使你从繁重的重复劳动中解脱出来,去干更有意义的工作。杂志报纸的编辑部均要求文章的作者,把文稿用方格纸誊写清楚,以便送审与排版,避免不必要的差错,这就给文章的作者增加了负担。写文章的人皆把写文章比喻为“爬格子”,十分形象,象征着写文章的辛劳,我也是个“爬格子的”,苦则思变,怎样才能将“爬格子”变成一件赏心乐目的事呢?我们已跨入了办公自动化的时代,很多以前由人做的事,现在都由计算机来完成。顺应时代潮流,跟上时代的步代,把“爬格子”的苦事交给计算机来完成。当文稿写成之后,录入计算机,然后用方格稿纸打印程序排版输出。 3.3.1 程序设计的原则要求 科技文章一般均是中英文混合,且穿插一些图表,所以方格稿纸的排版的总原则是习惯化、规范化、简易化。首先,要求图表与文字分别对待,图表做为一个整体直接输出,文字部分要求中文、英文分别对待,中文字一格,英文连续排列;其次,对文章的题标居中排版,对段落的开始要留两个空格;其三,要正确分页并编码;其四,要能够满足某些特殊要求;别外还要考虑到,目前大多数人员是用WS或WPS编辑文本的,其文本中包含了许多排版符,这些字符均不是正常可见的ASCII字符,所以程序要对这些文本进行预处理后,再进行排版输出。程序采用命令串格式,并提供了几个选择开关,由使用人员指定功能,使程序更加灵活方便。 3.3.2 程序的主要功能 本程序采用采用了代码优代技术,代码紧凑,执行速度快。根据设计的原则要求,其难点主要是中英文分离及分类处理、图表的输出。该程序的主要功能有三:. 完成WS或WPS文本文件到纯ASCII文本文件的转换. 完成纯ASCII文件的方格稿纸的排版. 显示输出排版结果,打印输出排版结果 3.3.3 使用方法 语法:SP 其中“输入文件”为纯ASCII码格式的文件或WS与WPS的文本格式文件,“输出文件”为翻译成方格稿纸格式文本的输出文件,它可以在WPS系统下直接送打印机输出。选择开关有:/D = 显示翻译结果文本/E = 删除翻译输出文件/P = 打印翻译结果文本 /T = 当输入文件为WS或WPS文件时,转换此文件为纯ASCII码文件当缺省选择开关时,SP只把输入文件翻译成方格稿纸格式的文件,而不送打印机输出。 3.3.4 排版命令 (1) 命令格式:CTRL码CTRL码 数字 #其中CTRL码有四种选择: C、O、S、T,数字可为1-999之间的任意整数, #为命令结束符。(2) 命令分类:行居中命令:C段排版命令:Sn#其中n为0-20之间的任意整数,代表段落前所留空格数。行原样打印命令:On#其中n为原样打印行数,在1-999之间。图表排版命令:Tn#其中n为图表所占行数,在1-999之间。5.板样(1) WS文件(含排版命令)如下:C 方格稿纸打印软件SP V2.0中国农科院棉花研究所 董占山S2# SP V2.0软件文件清单:O7# SP.DOC SP的使用手册,这个文件SP.PAS SP的PASCAL源程序SP.EXE SP的执行程序DEMO1.TXT 一个演示文件DEMO2.TXT 又一个演示文件DEMO1.BAT DEMO1.TXT的批处理文件DEMO2.BAT DEMO2.TXT的批处理文件S2# SP V2.0的主要功能及其选择开关简介如表1所示。T10# 表1.SP V2.0的主要功能及其选择开关 主要功能 选择开关 转换WS文件 /D: 显示翻译结果文本 翻译文本为方格稿纸 /E: 删除翻译输出文件 格式的文件 /P: 打印翻译结果文本 打印输出稿纸文件 /T: 当输入文件为WS文件时, 转换WS文件为ASCII码文件 3.3.5 源程序清单 SP.PAS 2.0 Copyright (c) 1991 Dong Zhanshan $M 16000,$0,16000 Program SP; 方格稿纸排版打印程序 V2.0 uses crt,dos; typeCtrlType = record 定义排版命令类型 FMT : char;Count : integer;end;constWPS_1 = #$91#$81#$92#$94#$9b#$90#$99#$c1; WPS的排版命令 WPS_2 = #$91#$80#$92#$85#$9b#$80#$99#$c0; WPS的排版命令 CRCH = #$0D; 定义回车符 ChiTabChar : array1.5,1.2 of string2 =( 定义中文表格符 ( , left upper corner ), right upper corner ( , left down corner ), right down corner ( , column ), row ( , upper T ), down T ( , left T ) right T );ConstCtrl : CtrlType =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黄酒发酵工技术考核试卷及答案
- 海洋天然气开发环境治理技术研究报告
- 信托业务员上岗考核试卷及答案
- 第7课 美丽校园我设计说课稿-2025-2026学年小学信息技术(信息科技)旧版资料电子工业版(安徽)
- 互联网行业法务合同范本
- 《我的成长黑神话:探索心理韧性勇敢应对挫折》中学生挫折应对主题班会说课稿
- 1.4.2有理数的加法(2)说课稿2024-2025学年北京版数学七年级上册
- 国际诚信合作协议承诺书5篇
- 第二节“鱼米之乡”-长江三角洲地区说课稿-2025-2026学年初中地理人教版八年级下册-人教版2012
- 经贸合作合同履行保证承诺书(7篇)
- 《儿童铁缺乏和缺铁性贫血防治专家共识2023》解读
- 中国子宫内膜增生管理指南(2022)解读
- 2007-2000央美考研题库
- TB 10012-2019 铁路工程地质勘察规范
- 弱电维护方案
- 国开2023春《言语交际》形考任务1-6参考答案
- 抽油机井示功图分析判断1
- 机电一体化说专业比赛
- GB/T 39141.3-2022无机和蓝宝石手表玻璃第3部分:定性标准和试验方法
- GB/T 1142-2004套式扩孔钻
- 2022年天津市河东区生态环境系统事业单位招聘笔试试题及答案
评论
0/150
提交评论