• getscreen > 编程中"流"的应用
  • 编程中"流"的应用

    免费下载 下载该文档 文档格式:PDF   更新时间:2006-06-02   下载次数:0   点击次数:1
    文档基本属性
    文档语言:
    文档格式:pdf
    文档作者:Administrator
    关键词:
    主题:
    备注:
    点击这里显示更多文档属性
    谈 Delphi 编程中"流"的应用
    陈经韬
    什么是流 流,简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具.在流 中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作 的,而不用关心流的另一头数据的真正流向.流不但可以处理文件,还可以处理动态内存,网 络数据等多种数据形式.如果你对流的操作非常熟练,在程序中利用流的方便性,写起程序会 大大提高效率的. 下面,笔者通过四个实例:EXE 文件加密器,电子贺卡,自制 OICQ 和网络屏幕传输来说明 Delphi 编程中"流"的利用.这些例子中的一些技巧曾经是很多软件的秘密而不公开的,现在大 家可以无偿的直接引用其中的代码了. "万丈高楼平地起",在分析实例之前,我们先来了解一下流的基本概念和函数,只有在理解 了这些基本的东西后我们才能进行下一步.请务必认真领会这些基本方法.当然,如果你对它 们已经很熟悉了,则可以跳过这一步. 一,Delphi 中流的基本概念及函数声明 在 Delphi 中,所有流对象的基类为 TStream 类,其中定义了所有流的共同属性和方法. TStream 类中定义的属性介绍如下: 1,Size:此属性以字节返回流中数据大小. 2,Position:此属性控制流中存取指针的位置. Tstream 中定义的虚方法有四个: 1,Read:此方法实现将数据从流中读出.函数原形为: Function Read(var BufferCount:Longint):Longintvirtualabstract 参数 Buffer 为数据读出时放置的缓冲区,Count 为需要读出的数据的字节数,该方法返回值为 实际读出的字节数,它可以小于或等于 Count 中指定的值. 2,Write:此方法实现将数据写入流中.函数原形为: Function Write(var BufferCount:Longint):Longintvirtualabstract 参数 Buffer 为将要写入流中的数据的缓冲区,Count 为数据的长度字节数,该方法返回值为实 际写入流中的字节数. 3,Seek:此方法实现流中读取指针的移动.函数原形为: Function Seek(Offset:LongintOrigint:Word):Longintvirtualabstract 参数 Offset 为偏移字节数,参数 Origint 指出 Offset 的实际意义,其可能的取值如下: soFromBeginning:Offset 为移动后指针距离数据开始的位置.此时 Offset 必须大于或者等于零. soFromCurrent:Offset 为移动后指针与当前指针的相对位置. soFromEnd:Offset 为移动后指针距离数据结束的位置.此时 Offset 必须小于或者等于零.该方 法返回值为移动后指针的位置. 4,Setsize:此方法实现改变数据的大小.函数原形为: Function Setsize(NewSize:Longint)virtual 另外,TStream 类中还定义了几个静态方法: 1,ReadBuffer:此方法的作用是从流中当前位置读取数据.函数原形为: Procedure ReadBuffer(var BufferCount:Longint) 参数的定义跟上面的 Read 相同.注意:当读取的数据字节数与需要读取的字节数不相同时, 将产生 EReadError 异常. 2,WriteBuffer:此方法的作用是在当前位置向流写入数据.函数原形为: Procedure WriteBuffer(var BufferCount:Longint)
    参数的定义跟上面的 Write 相同.注意:当写入的数据字节数与需要写入的字节数不相同时, 将产生 EWriteError 异常. 3,CopyFrom:此方法的作用是从其它流中拷贝数据流.函数原形为: Function CopyFrom(Source:TStreamCount:Longint):Longint 参数 Source 为提供数据的流,Count 为拷贝的数据字节数.当 Count 大于 0 时,CopyFrom 从 Source 参数的当前位置拷贝 Count 个字节的数据;当 Count 等于 0 时,CopyFrom 设置 Source 参数的 Position 属性为 0,然后拷贝 Source 的所有数据; TStream 还有其它派生类,其中最常用的是 TFileStream 类.使用 TFileStream 类来存取文件, 首先要建立一个实例.声明如下: constructor Create(const Filename:stringMode:Word) Filename 为文件名(包括路径),参数 Mode 为打开文件的方式,它包括文件的打开模式和共享 模式,其可能的取值和意义如下: 打开模式: fmCreate :用指定的文件名建立文件,如果文件已经存在则打开它. fmOpenRead :以只读方式打开指定文件 fmOpenWrite :以只写方式打开指定文件 fmOpenReadWrite:以写写方式打开指定文件 共享模式: fmShareCompat :共享模式与 FCBs 兼容 fmShareExclusive:不允许别的程序以任何方式打开该文件 fmShareDenyWrite:不允许别的程序以写方式打开该文件 fmShareDenyRead :不允许别的程序以读方式打开该文件 fmShareDenyNone :别的程序可以以任何方式打开该文件 TStream 还有一个派生类 TMemoryStream,实际应用中用的次数也非常频繁.它叫内存流,就 是说在内存中建立一个流对象.它的基本方法和函数跟上面是一样的. 好了,有了上面的基础后,我们就可以开始我们的编程之行了. 二,实际应用之一:利用流制作 EXE 文件加密器,捆绑,自解压文件及安装程序 我们先来说一下如何制作一个 EXE 文件加密器吧. EXE 文件加密器的原理:建立两个文件,一个用来添加资源到另外一个EXE 文件里面,称 为添加程序.另外一个被添加的 EXE 文件称为头文件.该程序的功能是把添加到自己里面的 文件读出来.Windows 下的 EXE 文件结构比较复杂,有的程序还有校验和,当发现自己被改变 后会认为自己被病毒感染而拒绝执行.所以我们把文件添加到自己的程序里面,这样就不会改 变原来的文件结构了.我们先写一个添加函数,该函数的功能是把一个文件当作一个流添加到 另外一个文件的尾部.函数如下: Function Cjt_AddtoFile(SourceFile,TargetFile:string):Boolean var Target,Source:TFileStream MyFileSize:integer begin try Source:=TFileStream.Create(SourceFile,fmOpenRead or fmShareExclusive) Target:=TFileStream.Create(TargetFile,fmOpenWrite or fmShareExclusive) try Target.Seek(0,soFromEnd)//往尾部添加资源

    下一页

  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 PDF格式下载
  • 您可能感兴趣的
  • getscreen下载  getscreen错位  googlegetscreen  getscreen出错  getscreen教程  getscreenv1.5.0.0  getscreen怎么用  getscreen1.5  getscreenv1.5  getscreen上帝之眼