并行计算编程技术浅析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
并行计算编程技术浅析
范增禄1,薛峰2
(1.河北省气象局河北石家庄0500212.国家气象中心北京100081)
【摘要】:随着高性能应用和运算需求的迅猛发展,单台高性能计算机已经不能胜任一些超大规模应用问题的解决。
这就需要将多台计算机资源通过高速网络连接起来,构成计算集群,共同解决大型应用问题。
并行程序的编程模型、运行环境和调试环境,以及如何选取适合需求的开发与运行环境,等等,都要比串行程序复杂得多,而这些问题无疑都是值得我们认真考虑的。
本文将试图就此展开讨论。
【关键词】:并行计算模式集群高性能计算机测试
1.并行计算技术概述
60年代初期,由于晶体管技术与存储器技术的发展导致并行计算机的出现,这一时期的典型代表就是IBM360。
创建和使用并行计算机的主要原因是因为并行计算机是解决单处理器速度瓶颈的最好方法之一。
并行计算机是由一组处理单元组成的,这组处理单元通过相互之间的通信与协作,以更快的速度共同完成一项大规模的计算任务。
因此,并行计算机的两个最主要的组成部分是计算节点和节点间的通信与协作机制。
并行计算机体系结构的发展也主要体现在计算节点性能的提高以及节点间通信技术的改进两方面。
就单台计算机系统而言,采用SMP技术是扩展其性能的比较有效的方法,它可以将系统中的多个操作系统分布在多个处理器上执行以获得并行处理的效果。
SMP技术可以通过多线程并行来提高性能。
通过采用并行多线程技术,服务器可以通过SMP技术同时处理多个应用请求,使得这些程序获得了更好的运行效果,而且在台式机的专业应用软件中,并行多线程技术的采用也日益增多。
伴随SMP技术的出现,带来另外的问题,那就是当应用增加时,虽然可以通过增加处理器的方法来扩展系统能力,但是,一方面需要有扩展连接处理器的系统总线的高超技术,并不是每个系统厂商都能做到,另一方面由于对共享资源的竞争所造成的系统瓶颈,使得单机系统的性能呈非线性增长。
因此,当应用增加超过单机系统的承受能力时,就采用集群系统(CLUS-TER)。
在集群系统中,每台服务器处理各自的工作,提供各自的服务。
当需要更高的的性能以适应更多的应用时,既可以升级原有的服务器(增加更多的处理器、内存和存储等),又可以在集群系统中增加新的服务器。
更进一步,集群系统在平衡和扩展整个计算机应用系统的工作负载的同时,也为用户提供了高性能和高可用性。
1977年,DEC公司推出了以VAX为结点机的松散耦合的集群系统,并成功地将VMS操作系统移植到该系统上。
20世纪90年代后,随着RISC技术的发展运用和高性能网络产品的出现,集群系统在性能价格比(Cost/Performance)、可扩展性(Scala-bility)、可用性(Availability)等方面都显示出了很强的竞争力,尤其是它在对现有单机上的软硬件产品的继承和对商用软硬件最新研究成果的快速运用,从两方面表现出传统MPP无法比拟的优势。
这里所介绍的高性能计算环境,从程序开发角度主要分为以下两类:一大类是共享内存系统,包括并行向量机(PVP,Par-allelVectorProcessor)、分布式共享存储多处理机(DSM,Dis-tributiedSharedMemory)和对称多处理机(SMP,SymmetricalMultiProcessing)等结构,其特点是多个处理器拥有物理上共享的内存,如HP的SuperDome,我国曙光1号,SGIPowerChal-lenge等;另一大类是分布存储系统(DMP),如大规模并行处理机(MPP,MassivelyParallelProcessor)和集群系统(Cluster),其特点是系统由多个物理上分布的结点组成,每个结点拥有自己的内存,结点通过高速以太网或专用高速网络连接。
由于以上两类并行环境差别较大,其采用的并行编程方法也不同的。
我们将分别介绍这两类系统上的开发环境与开发工具,同时也略带介绍一下其他类型的并行编程开发模式:HPF、并行库、串行并行化与多模式混合使用等。
2.并行程序的开发模式
2.1.共享内存模式
共享内存并行模式编程相对较为简单,程序员不用考虑数据在内存中的位置,进程管理及同步操作由系统完成。
但是用这种方式编制的程序通常并行效率不高,因为它属于细粒度并行,主要针对循环进行并行处理。
另外共享内存并行模式只能运行在共享内存类型的计算机系统上。
在共享内存模型中,一个并行程序由多个共享内存的并行任务组成,数据的交换通过隐含地使用共享数据来完成。
此编程模式一般仅需指定可以并行执行的循环,而不需考虑计算与数据如何划分,以及如何进行任务间通信,编译器会自动完成上述功能。
2.1.1.OpenMP
目前业界流行的共享内存模型开发标准是OpenMP。
OpenMP定义了一套编译指导语句,用于指定程序的并行性、数据的共享/私有等信息。
其目标是为SMP系统提供可移植、可扩展的开发接口。
Intel,DEC,SiliconGraphics,Kuch&Associates和IBM早在15年前就联合定义了OpenMP早期标准。
新的OpenMP标准由OpenMPArchitectureReviewBoard于1997年推出,现在已发展到2.0版。
作为一套可移植可扩展的标准OpenMP为程序员提供了一个简单和灵活的接口,可以方便地为共享内存的多处理器平台增加并行机制。
大部分高性能计算机厂商和软件厂商,例如。
OpenMP在所有的架构上都支持使用C/C++和FORTRAN进行共享内存并行编程,包括基于Microsoft?WindowsNT?和UNIX?操作系统的构架。
OpenMP还使用编译器指令和库函数,帮助并行应用程序员使用C/C++和FORTRAN创建多线程应用。
对于包含有多个耗时的循环的应用,OpenMP特别有用,它可以将工作划分为多个线程。
任一应用中划分粗糙的循环级别的并行机制的数量往往比较有限,限制了应用程序的可扩展性。
一个并行区域可能嵌入在其它并行区域之内,但是它们缺省的执行方式是必须使用一个线程组来串行执行。
OpenMP使用fork-join并行机制,程序首先顺序执行,然后转换成为并行程序。
OpenMP允许程序员使用划分良好的循环级并行机制来扩展应用,实现多处理。
它们可以添加划分粗糙的并行机制,同时仍然能保留以前在扩展方面所做的投资。
使用这种增量式的开发战略,程序员可以避免转向消息传递或其它并行编程模型时所具有的风险。
要开发新的应用,程序员必须分析原始问题,将它分解为多个使用共享和本地数据的任务,确定数据之间的依赖性,然后重
新组织任务进入执行单元的顺序,这可以使用并行编程环境来实现编码。
2.1.2.POSIX线程
另一个较为广泛使用的是线程库IEEE的开放系统接口标准--POSIX线程,通常称为Pthreads标准和Solaris线程库是目前使用最广泛的线程库。
这两种实现方法都是可内操作的(IN-TER-OPERABLE),它们的功能相似,并可以用在同样的应用中。
但是只有采用POSIX标准的线程才能确保可以完全的移植到其他符合POSIX标准的环境中。
这两个库--libpthread和libthread--中的大部分函数都是相互对应的。
往往具有相似后缀名的的POSIX和SOLARIS函数就具有相似的功能、参数个数以及参数的作用。
所有POSIX线程库的函数都以pthread为前缀,而所有SOLARIS线程库函数都以thr为前缀。
POSIX的整体可移植性更好。
2.2.消息传递模式
在消息传递模式中,一个并行程序由多个并行任务组成。
每个并行任务拥有自己的数据并对其进行计算操作。
任务之间数据的交换是通过显式的消息传递语句来完成的。
消息传递的并行方式虽然是在分布式内存的计算机结构基础上发展而来的,但是几乎所有类型的计算机都支持这种并行模式,因此更具通用性。
消息传递方式的并行属于粗粒度并行,程序员负责进程管理、消息传递及同步,并行的工作量要大于共享内存并行模式。
但同时程序员可以控制的也更多,可以通过仔细考虑任务分配,并行算法等方式对程序进行优化,因而获得较高的并行效率。
国际上采用消息传递方式的应用软件远远多于采用共享内存并行模式的应用软件。
国内的高性能计算用户也大多采用消息传递的并行方式开发自己的应用程序。
现在广泛使用的消息传递模型有两个:PVM和MPI。
PVM即ParallelVirtualMachine(并行虚拟机)与MPI即MessagePass-ingInterface(消息传递界面)。
PVM与MPI所提供的功能大致相同,但两者的侧重点有所不同。
PVM强调在异构环境下的可移植性和互操作性,程序之间可以互相通信,并支持动态的资源管理和一定程度的容错;而MPI更强调性能,不同的MPI实现之间缺乏互操作性,本身也不支持容错(可以通过专门的容错软件来支持容错)。
一般而言,使用MPI比较适合于开发MPP或同构集群上的并行应用,可以有较高的通信性能;而PVM更适合于异构的集群系统。
2.2.1.PVM
PVM(ParallelVirtualMachine)是由美国田纳西大学、奥克里季国家实验室等研制的并行程序开发环境。
它可以把多个异构的计算机组织起来成为一个易于管理的、可扩展的、易编程使用的并行计算资源。
它的各个计算结点可以是共享存储或分布式存储的多处理机或者是向量超级计算机、专用的图形、标量工作站。
这些异构的计算节点可以通过多种网络(比如Ethernet、FDDI等等)互联,成为一个网络计算虚拟机。
用户的计算任务被分配到各个计算节点上,多个节点并行运算,从而实现粗粒度的并行。
PVM是用于在UNIX计算机间传送系统的系统,使用PVM可以将许多台计算机连结成一台大型分布式存储并行计算机。
这个网络我们称之为虚拟机。
我们可以在不同的层次上使用PVM。
在最高层次上,也就是透明模式下,任务被自动分配到最合适的计算机上执行;在下一个层次上,也就是体系结构相关模式下,用户可以指定运行此任务的计算机类型;在最低的层次上,用户可以指定一台特定的机器来执行特定的任务。
无论采用哪种模式,PVM都负责管理计算机间数据的传送和低层数据传送的相关问题。
PVM是一种十分灵活的消息传递系统,它支持最一般的MIMD并行计算结构,这就使得几乎任何结构都可以在PVM上建立。
PVM的免费、开放以及易用使其成为一个被广泛接受的并行程序开发环境,有很多并行机公司都宣布支持PVM、PVM可以安装到各种Unix、Windows操作系统上运行。
所有这些又有力地促进了PVM的推广。
现在所有的并行机都支持PVM3。
2.2.2.MPI
1992年4月MPI论坛提出了作为标准消息传递接口所应具有的基本特点,同年11月完成了第一个草案MPI1。
该草案讨论了几种点到点通信的规范,没有涉及集群通信的规范。
MPI1旨在引起广泛关注,以推动消息传递接口标准化的进程。
1992年11月提出了MPI标准化的具体议程后,MPI论坛于1993年11月完成了MPI标准的指定工作。
目前最新的为MPI2.0版,于1998年年低推出。
MPI是并行计算机的消息传递接口标准,根据应用程序对消息传递功能的需求,全球工业、应用和研究部门联合推出标准的消息传递界面函数,不考虑其具体实现,以保证并行应用程序的可移植性;。
指定该标准的主要目的是为了提高并行程序的可移植性和使用的方便性。
有了统一的标准,并行计算环境下的应用软件库以及软件工具就都可以透明的移植。
各个厂商可以依据标准提供独具特色和优势的软件实现和硬件支持,从而提高并行处理的能力。
MPI没有简单地指定某系统为标准,而是吸取许多已经广泛应用的消息传递系统的特点。
它在采纳已有系统优点的基础上,增加了许多新的特点,从而使其成为非常有吸引力的标准。
MPI的具体实现:消息传递库函数,目前有影响的为MPICH和LAMMPI,其中MPICH应用尤为广泛;两个版本目前均已实现MPI1.2版,适用于任何并行计算平台;部分并行机已实现MPI2.0版。
MPI是目前应用最广的并行程序设计平台,几乎被所有并行计算环境(共享和分布式存储并行机、MPP、机群系统等)和流行的多进程操作系统(UNIX、WindowsNT)所支持,基于它开发的应用程序具有最佳的可移植性成为目前高效率的超大规模并行计算(1000个处理器)最可信赖的平台;工业、科学与工程计算部门的大量科研和工程软件(气象、石油、地震、空气动力学、核等)目前已经移植到MPI平台,发挥了重要作用。
MPI支持最基本的消息传递操作:发送消息(send)、接受消息(receive)、进程同步(barrier)、规约(reduction);同PVM相比,MPI有下列特点:MPI只是一个支持并行计算的程序库,并不是一个并行操作系统,MPI更模块化;PVM支持异构的集群。
而MPI标准虽然也可支持异构集群,但它并没有强制性的要求,每个厂商都提供支持异构的实现;MPI的语义更精确。
我们在MPI程序库中,能够找到各种各样的发送和按释义。
作为一种消息传递界面标准,MPI没有严格要求底层的通信协议。
它只是对于应用程序的通信程序库,至于下层的硬件,协议完全由厂商自己决定。
2.3.HPF
HPF(HighPerformanceFortran)的思想与OpenMP类似,都是通过定义编译指导语句来帮助编译器生成并行代码。
HPF的目标系统与OpenMP不同,它支持DMP系统。
因此,除了指定并行性的编译指导语句外,HPF还指定数据划分的编译指导语句。
HPF与消息传递模型的不同之处则在于:HPF通过编译器来生成通信语句,不需要程序员手工编写。
HPF得到了工业界的广泛支持,如IBM、HP、Sun都有HPF编译器。
第三方产品则有PGI的PGHPF、APR的ForgexHPF等。
其不足是对于某些问题无法得到与手工编写的消息传递程序相同的性能。
2.4.并行库
使用并行库开发高性能计算程序的基本思想是:用户不需要自己编写通用的并行算法代码,而由程序库提供并行算法,并对用户透明。
用户只需要根据自己的需求,调用相应的库函数,就可以编写出并行程序。
由于库函数的编写者一般经验丰富,而且库函数会采取较为优化的算法,并采用优化编译,使得库函数的执行效率很高。
对于大量使用通用计算算法的用户来说,使用并行库是一种高效的开发模式。
并行库的缺点是无法帮助那些
需要自己书写非通用并行算法的用户。
大多数高性能计算系统都提供在本系统上优化的PBLAS、LAPACK、ScaLAPACK等产品。
在众多的并行库产品中,ScaLA-PACK是当今世界上公认的最高水平的并行数学库,其具有先进性、通用性较强,针对DMP系统优化。
LAPACK是为SMP系统优化的版本。
BLAS经过20多年的发展和完善,是目前世界上最著名的基本线性代数子程序包,被许多实际应用问题和几乎所有有关矩阵计算的软件所采用,即可以应用于科学和工程设计的矩阵计算问题,也可以应用于生产基本线性代数计算的高水平程序库,是数学应用软件的基本核心库。
另一个著名的并行库是PETSc。
PETSc是一套基于MPI的数据结构和库函数,用于解决基于偏微分方程的典型科学计算问题。
另外,MATLAB是很常用的科学计算软件。
很多公司和研究机构也在进行并行化MATLAB的工作,如RTExpress。
2.5.串行程序并行化
另一种并行程序的开发模式是将串行程序并行化。
此模式的优点在于,可以将现有的很多串行代码转换成并行代码。
并行化分为全自动并行化和交互式并行化两种模式。
全自动并行化的并行过程不需要人的干预,可以自动发现程序中可并行的部分,生成并行代码。
现在,高性能计算系统提供商的Fortran和C编译器大都能提供面向SMP系统的自动并行化的编译选项。
对于少数程序,全自动并行化编译器可以达到较好的效果;但对大多数程序来说,并行化的效果还不理想。
交互式并行化工具通过给用户提供程序中的有效信息,包括相关性分析结果、程序调用图、性能预测结果等帮助用户进行并行化工作,但是如何更好地结合用户和并行化工具的能力还需要进一步研究。
目前产品化的交互式并行化工具主要有APR的Forge,该系统支持Fortran77的并行化,并同时支持SMP系统和DMP系统。
2.6.混合模式
在复杂的网络和运算架构基础上,将以上的开发模式有机组合,能够在某些运算环境下取得很好的并行处理性能。
如将MPI与pthread可以巧妙的利用并行与线程的优点提高整体效率;MPI与OpenMP混合的混合编程模式可能比较适合"SMP机群系统"+物理上分区计算的应用问题:即SMP之间用MPI处理各物理区,SMP内部用OpenMP并行物理区内部的计算,综合MPI的可扩展性与OpenMP的简单性,以较小的代价获取可接受的性能。
3.并行程序的开发工具
3.1.调试器
调试是程序开发的重要部分,并行程序尤其难调试,更需要调试器的支持。
高性能计算系统中大多会带有并行调试器,如IBM的pdb(命令行方式)、pedb(Xwindow图形界面)、HP的DDE(XWindow图形界面)和LaDebug(用于Alpha系统)、Sun的Prism等。
Etnus的TotalView是最著名的第三方并行调试器。
它提供对C、C++、Fortran程序的图形化符号调试,可以调试MPI、PVM、HPF、OpenMP程序,支持SGI、Sun、HP、IBM等几乎所有的高性能厂商的产品,还提供对Linux的支持。
Etnus.TotalView.v5.0.5-5.LINUX-SHOCK-1.nfoLinux下唯一的平行除错器,是一套支持多重程序(multiprocess)﹑多重执行绪(multithread)的软件分析器/除错器。
它支持了Fortran﹑C﹑C++等语言﹐还有主流的平行程序设计paradigm包括MPI﹑threads﹐和OpenMP。
TotalView以图形接口的操作为基础﹐易学易用的特性让开发者缩减发展的时间。
此外它还能让开发者在单一或多重处理器上散开或者控制多重的执行绪或是程序。
KAI的AssureThreadAnalyzer是一个支持OpenMP的程序正确性检测工具,用于自动发现程序中的常见错误。
3.2.性能分析和预测
程序性能分析(profiling)可以帮助用户找到程序中最费时的部分,从而集中精力进行改进和优化,是改进程序性能的有效手段。
传统的性能分析工具一般仅提供子程序级的性能分析,但对于高性能程序来说,对于循环程序的性能分析是必不可少的。
现有的大部分高性能计算系统中大都具有能够进行循环级性能分析的性能分析器,有些还提供了友好的用户界面,如Intel的VTune、IBM的Xprofiler等。
一些第三方厂商也提供性能分析工具,比如Pallas的Vam-pir,它支持从LinuxPC到IBM、HP、Sun、SGI等几乎所有的高性能厂商的产品。
3.3.基准测试
基准测试程序(benchmark)用于测试计算机系统的性能,试图提供一种客观、公正的评价机器性能的标准。
目前在高性能计算领域,比较有影响的基准测试程序有HINT测试、Perf测试、IOzone测试,以及Linpack测试、NASParallelBenchmark、SPECHPC测试等。
这些基准测试可以在一定程度上对并行计算机系统方案进行评价,可以对并行计算机系统的市场销售提供参考,另外,在基准测试中形成的优化方法对应用程序设计与优化具有重要的指导意义。
由J.Dongarra编写的Linpack是在高性能计算领域最出名和使用最广泛的基准测试。
Linpack采用主元高斯消去法在分布式内存计算机上求解双精度(64bits)稠密线性代数方程组,结果按每秒浮点运算次数(flops)表示。
HPL测试针对大规模并行计算系统的测试,其名称为HighPerformanceLinpack(HPL),1.0版于2000年9月发布,是第一个标准的公开版本并行Lin-pack测试软件包,一般用于TOP500超级计算机上的并行超级计算机。
数值空气动力学模拟并行基准测试(NASParallelBench-mark,NPB)已经广泛地应用于并行计算机的测试和比较中。
目前NPB2的最新版本是2002年11月19日发布的2.4beta版本和NPB3alpha版本。
NPB套件由八个程序组成,它来源于计算流体动力学(CFD)的代码。
这八个不同的程序从不同的观点提供性能特点的完整画面。
SPEC(StandardPerformanceEvaluationCooperation)HPC测试成立于20世纪80年代末,它的主要工作有两个:开发测试计算机性能的测试工具,这些工具以代码的形式发布;在SPEC网站(http://www.spec.org)上发布通过认证的测试结果。
HighPer-formanceComputingGroup(HPC)是其一个分组织,主要测试高性能计算机。
主要测试程序有SPECHPC96、SPECHPC2002和SPECOMP2001系列,其中的SPECHPC96已经于2003年2月被SPECHPC2002取代。
SPECHPC软件包有三大组成部分:SPECCHEM(化学,量子化学计算)、SPECENV(环境,气象预报计算)、SPECSEIS(地震,波动方程迭前偏移计算)。
SPECHPC2002软件包支持MPI和OpenMP并行程序设计环境,包含3个测试程序,每个都有小规模和中规模测试数据集。
HINT基准测试用于检测HPC子系统的常用基准测试。
HINT可以用来比较两个不同的平台的处理器性能和存储子系统;Perf是特殊的系统基准测试,一般用于比较机群互连网络的延迟和带宽。
IOzone检测I/O性能IOzone基准一般用于测试系统I/O性能,而且也能用于测量和比较各种级别的独立的冗余磁盘阵列(RAID)的性能
4.对并行计算的技术前景展望
通过上述讨论,我们对并行计算的技术前景可以做出以下几点展望:
一OpenMP将成为支持SMP系统编程的主要标准,将来的工作在于研究和开发更加有效的OpenMP编译器,以及更加强大友好的开发、调试工具。
二MPI和PVM将仍然是DMP系统的主要标准。
三并行Java、Ada、Linda、Occam和SR开发(下转第35页)
环境将会继续发展。
四并行库是很有前途的开发方式和研究方向,随着更多的并行程序库的出现,并行化编程会越来越容易。
程序自动并行化技术也能大大缩短并行程序的开发时间,但目前的技术即使对SMP系统也没有达到实用的水平,还需要技术上的突破。
五网格计算也是将来高性能计算的发展方向之一,尤其是OGSA(OpenGridServicesArchitecture),它把Globus标准与以商用为主的WebServices的标准结合起来,网格服务统一以Services的方式对外界提供。
目前我国也在网格计算方面开展大量的工作。
在我国,已经完成的网格研究项目主要有清华大学的先进计算基础设施ACI(AdvancedComputationalInfrastructure)和以中科院计算为主的国家高性能计算环境NHPCE(NationalHighPerformanceComputingEnvironment)。
参考文献:
1.《高性能计算之并行编程技术--MPI并行程序设计》,都志辉编著2.《开发环境-搭建应用的基础》,清华大学出版社,郑纬民陈文光3.《Linux下的网络并行计算》,计算机世界
4.《国家高性能计算环境的设计与实现》,徐志伟唐志敏谢向辉肖侬5.FoundationsofMultithreaded,Parallel,andDistributedProgramming,GregoryR.Andrews
6.DesigningandBuildingParallelPrograms,IanFoster
7.《高性能计算机的评价》,IBM互联网服务器部么石磊
8.《高速计算环境》,陈俊麟
9.OpenforSMPClusterのSurvey,ShuheiOhkado
10.MixedmodelswithPthreadsandMPI,VijaySonnad,CharyG.Tamirisa,GyanBhanot,IBM
11.《基于SMP节点的机群通信系统关键技术的研究》,马捷李国杰
12.《MPI与PETSc》,莫则尧
13.《网格发展趋势》,刘鹏
14.《Linux高性能集群-软件体系结构》,金戈,IBMCorp
15.《高性能计算机系统结构》,清华大学出版社,郑纬民等
ENDFUN
3.3在子键中写入值项数据函数
在注册表的指定子键中写入值项数据的函数WriteKeyVal()如下:
FUNCTIONWriteKeyVal
paraHKey_name,HK_dir,HK_name,HK_value&&HKey_name为根键名称,HK_dir为子键名称,HK_name为值项名称,HK_value为值项数据
DECLAREINTEGERRegOpenKeyINWin32APIINTEGERnHKey,STRINGcSubKey,INTEGER@nHandle
DECLAREINTEGERRegCreateKeyINWin32APIINTEGERnHKey,STRINGcSubKey,INTEGER@nHandle
DECLAREINTEGERRegCloseKeyINWin32APIINTEGERnHKey#DEFINEERROR_SUCCESS0
H_KEY=GetHKEYhandleVal(HKey_name)&&获取根键的句柄值ifH_KEY#-1
returnWriteRegistryString(H_Key,HK_dir,HK_name,HK_value)&&建立指定子键上的字串数据
else
return.f.
endif
ENDFUN
FUNCTIONWriteRegistryString&&返回值:.T.成功,.NULL.失败
LPARAMETERSHKey,Subkey,Entry,Value
LOCALnHandle,nResult,nSize,cDataBuffer,nType
nHandle=0
nResult=RegOpenKey(HKey,SubKey,@nHandle)&&开启机码
IFnResult#ERROR_SUCCESS
RETURN.F.
ENDIF
DECLAREINTEGERRegSetValueExINWin32APIINTEGERnHKey,STRINGlpszEntry,INTEGERdwReserved,INTEGERfdwType,STRINGlpbData,IN-TEGERcbData&&fdwType键类型:0-二进制类型,1-字符型
nSize=LEN(Value)
nResult=RegSetValueEx(nHandle,Entry,0,1,Value,nSize)
=RegCloseKey(nHandle)
IFnResult#ERROR_SUCCESS
RETURN.F.
ENDIF
RETURN.T.
ENDFUN
3.4读取子键中值项数据的函数
在注册表中读取指定子键中值项数据函数ReadKeyVal()如下:
FUNCTIONReadKeyVal
paraHKey_name,HK_dir,HK_name&&HKey_name为根键名称,HK_dir为子键名称,HK_name为值项名称
DECLAREINTEGERRegOpenKeyINWin32APIINTEGERnHKey,STRINGcSubKey,INTEGER@nHandle
DECLAREINTEGERRegCloseKeyINWin32APIINTEGERnHKey#DEFINEERROR_SUCCESS0
H_KEY=GetHKEYhandleVal(HKey_name)&&获取根键的句柄值
ifH_KEY#-1
returnReadRegistryString(H_KEY,HK_dir,HK_name)&&读取指定子
键上的字串数据
else
return''
endif
ENDFUN
FUNCTIONReadRegistryString&&返回值:字串,若返回"NULL"表无此机码
LPARAMETERSHKey,Subkey,Entry
LOCALnHandle,nResult,nBufferSize,cDataBuffer,nType
nHandle=0
nResult=RegOpenKey(HKey,SubKey,@nHandle)&&开启机码
IFnResult#ERROR_SUCCESS
RETURN"NULL"
ENDIF
DECLAREINTEGERRegQueryValueExINWin32APIINTEGERnHKey,STRINGlpszValueName,INTEGERdwReserved,INTEGER@lpdwType,STRING@lpbData,INTEGER@lpcbData&&RegQueryValueEx为决定资料型态
cDataBuffer=SPACE(256)
nBufferSize=LEN(cDataBuffer)
nType=1
*将值传回buffer
nResult=RegQueryValueEx(nHandle,Entry,0,@nType,@cDataBuffer,@nBuffer-Size)
=RegCloseKey(nHandle)
IFnResult#ERROR_SUCCESS
RETURN"NULL"
ENDIF
IFnBufferSize<2
RETURN""&&返回空字串
ENDIF
*去除空白字元及字串后的NULL
RETURNSUBSTR(CHRTRAN(cDataBuffer,CHR(0),""),1,nBufferSize)
ENDFUN
4.结束语
注册表是记录计算机配置信息的数据库中心,在应用程序中通过访问注册表可获取其中的数据,为应用程序服务。
用户也可将开发的应用程序的信息写入注册表中,供相关的其它程序调用。
但在访问注册表的操作中,也应特别注意保护好注册表,以免造成意外的系统故障。
本文所提供的源程序代码在Win-dows2000和VFP6.0的环境中调试通过,并能正确运行,读者可直接引用。
参考文献:
1.京辉热点工作室.VisualFoxPro6.0编程指南.中国水利水电出版社,2000.
2.捷新工作室编著.中文VisualFoxPro6.0资源速查.国防工业出版社,1999.
3.金栋林.在VFP应用程序中访问Windows注册表.浙江师大学报(自然科学版),2000.11.
4.http://soft.etcell.com/
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(上接第44页)。