C++BUILDER包设计.doc_第1页
C++BUILDER包设计.doc_第2页
C++BUILDER包设计.doc_第3页
C++BUILDER包设计.doc_第4页
C++BUILDER包设计.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+ Builder 发布包作者:佚名来源:不详发布时间:2006-2-26 15:33:4910.5 发布包10.5.1发布使用包的应用程序当发布使用运行时包的应用程序时,要确保用户同时拥有应用程序的.EXE文件及应用程序调用的所有库文件(.BPL或.DLL)。如果库文件和.EXE文件不在同一目录,必须可以通过用户的Path访问。你可以遵循把库文件放在WindowsSystem目录的习惯。如果使用InstallShieldExpress,你的安装脚本应检查用户系统以搜索要求的包,以免盲目地重安装。10.5.2将包发布给其他开发者如果你发布运行时或设计时包给其他的C+Builder开发者,应确保在提供要求的头文件的同时提供.BPI和.BPL文件。要将组件静态地链接到应用程序,也就是说,创建不使用运行时包的应用程序,开发者们将会需要你提供的包的.LIB(或.OBJ)文件。10.5.3包集文件包集(Packagecollection)(.DPC文件)提供一个方便的方法将包发布给其他开发者。每个包集文件包含多个包,并包括BPL和任何想要一起发布的附加文件。当IDE安装中选择了包集时,它的成员文件自动从其.PCE容器中被提取,Installation对话框提供一个选项,可以安装包集中所有的包或有选择地安装部分包。要创建包集:1) 选择Tools|PackageCollectionEditor,打开包集编辑器。2) 点击AddPackage快速按钮,然后在SelectPackage对话框中选择BPL并点击Open。要将更多的BPL加入包集,再次点击AddPackage快速按钮。当增加BPL时,在包编辑器的左边的树图会显示出来。要删除一个包,选择它并点击RemovePackage快速按钮。3) 在树图的顶部选择Collection节点。在包集编辑器的右边出现两个字段: 在Author/VendorName编辑框,可以输入关于包集的可选信息,当用户安装包时,这些信息将出现在Installation对话框中。 在DirectoryList下,列出包集中的文件想要被安装的缺省目录。使用Add、Edit和Delete按钮编辑这张表。例如,假定你想要将所有的源代码文件拷贝到相同的目录。在这种情况下,你可输入Source作为DirectoryName,并将C:MyPackageSource作为建议的路径。Installation对话框将C:MyPackageSource作为建议的路径显示。4) 除了BPL,包集还能包含.BPI、.OBJ、.CPP(单元)文件、文档及任何想要一起发布的其他文件。辅助的文件放在与特定的包(BPL)关联的文件组中;只在关联的BPL被安装时,组中的文件才被安装。要把辅助的文件放入包集,在树图中选择BPL并点击AddFileGroup快速按钮;为文件组输入一个名字。如果需要增加更多的文件组,重复相同的步骤。当选择一个文件组时,包集编辑器右边将出现一些新字段: 在InstallDirectory列表框,选择组中文件想要被安装的目录。下拉列表中包括了在步骤3时在DirectoryList中输入的目录。 如果想要以可选方式安装这个文件组,选择OptionalGroup复选框。 在IncludeFiles,列出想要在这个组包括的文件。使用Add、Delete和Auto按钮编辑列表。按钮允许选择包的包含列表中列出的指定扩展名的所有的文件。5) 可以为包集中的包的要求列表列出的任何包选择安装目录。在树图中选择BPL时,包集编辑器的右边出现4个新字段: 在RequiredExecutables列表框,选择需求列表中列出的包的.BPL文件的安装目录(下拉列表中包括了在步骤3时在DirectoryList中输入的目录)。包集编辑器使用C+Builder的全局LibraryPath搜索这些文件,并在RequiredExecutableFiles中列出。 在RequiredLibraries列表框,选择需求列表中列出的包的.OBJ和.BPI文件的安装目录(下拉列表中包括了在步骤3时在DirectoryList中输入的目录)。包集编辑器使用C+Builder的全局LibraryPath搜索这些文件,并在RequiredLibraryFiles中列出。6) 要保存包集源文件,选择File|Save。包集源文件应以.PCE扩展名保存。7) 要编译包集,按Compile快速按钮。包集编辑器生成一个与源文件(.PCE)同名的.DPC文件。如果还没保存源文件,编辑器在编译前会询问文件名。编辑或重编译一个存在的.PCE文件,在包集编辑器中选择File|Open。C+ Builder 创建和编辑包作者:佚名来源:不详发布时间:2006-2-26 15:33:5110.4 创建和编辑包创建一个包需要指定: 包的一个名字。 新包要求使用或链接的其他包的列表。 包编译时包含或绑定的单元文件的列表。包实质上是这些包含已编译.BPL功能的源代码单元的封装,包含(Contains)列表是想编译进包的定制组件的源代码单元放置的地方。一个包由C+源文件(.CPP)和扩展名为.BPK的工程选项文件定义。这些文件由包编辑器生成。10.4.1 创建包创建包的过程如下。参见10.4.4节可获得关于这些步骤的更多信息。1) 选择File|New,然后选择Package图标并单击“OK”。2) 生成的包被显示在包编辑器中。3) 包编辑器为新包显示出一个Requires节点和一个Contains节点。4) 要把一个单元加入包含列表,点击Addtopackage快速按钮。在Addunit页的Unitfilename编辑框输入.CPP文件名,或点击Browse浏览文件,然后单击“OK”。选择的单元出现在Contains节点的包编辑器下。通过重复这个步骤增加其他单元。5) 把一个包加入要求列表,点击Addtopackage快速按钮。在Requires页的Unitfilename编辑框输入一个.BPI文件名,或点击Browse浏览文件,然后单击OK(这将增加语句USEPACKAGE(“packageName.bpi”)到步骤1生成的CPP文件)。选择的单元出现在Requires节点的包编辑器下。通过重复这个步骤增加其他包。6) 点击Options快速按钮,并决定想创建的包的种类。 创建仅用于设计时的包(不能在运行时使用的包),选择Designtimeonly单选按钮。(或增加-Gpd链接器开关到BPK文件中:LFLAGS=.-Gpd.) 创建仅用于运行时的包(不能被安装的包),选择Runtimeonly单选按钮。(或增加-Gpr链接器开关到BPK文件中:LFLAGS=.-Gpr.) 创建设计时和运行时可用的包,选择Designtimeandruntime单选按钮。7) 在包编辑器,点击Compilepackage快速按钮编译包。10.4.2 编辑现有的包下面是打开和编辑一个现有的包的方法。 选择File|Open(或File|Reopen)并选择一个CPP或BPK文件。 选择Component|InstallPackages,从DesignPackages列表中选择一个包,并点击Edit按钮。 当包编辑器打开时,在Requires节点选择包,右击鼠标,并选择Open。编辑一个包的说明或设置使用选项时,选择包编辑器中的Options快速按钮并选择Description标签页。ProjectOptions对话框的左下角有一个Default复选框。当它被选择时单击OK,所做的选择存为新的包工程的缺省设置。要恢复原来的设置,删除或重命名DEFAULT.BPK文件。10.4.3 包源文件和工程选项文件包源文件带有.CPP扩展名。包工程选项文件使用XML格式创建,并带有.BPK(Borland包)扩展名。通过在包编辑器的Contains或Requires子句上右击鼠标,并选择EditOptionSource显示包的工程选项文件。注意 C+Builder维护.BPK文件。通常不需要自行编辑它。应该使用ProjectOptions对话框的Packages标签页来修改。一个名为MyPack的包的工程选择文件的一部分如下所示:在这种情况下,MYPACK.CPP将包括下列代码:MyPack的包含列表包括3个单元:MyPack本身、Unit2和Unit3。MyPack的要求列表包括VCL50和VCLDBX50。将组件打包如果使用NewComponent向导创建组件(通过选择Component|NewComponent),C+Builder在所需位置插入PACKAGE宏。但若在旧版本的C+Builder中定制组件,必须自行将PACKAGE加入两个地方。C+Builder中一个组件的头文件声明必须包括以class引导的预定义的宏PACKAGE:class PACKAGE Mycomponent :.并且在组件被定义的CPP文件中,必须在Register函数的声明中包括PACKAGE宏:PACKAGE宏扩展为语句以便允许类可输出到结果BPL文件或从文件中引入。10.4.4 理解包的结构“包”包括下列部分: 包名。 要求列表。 包含列表。1.命名包包名必须在工程中是唯一的。如果把一个包命名为STATS,包编辑器分别生成一个源文件STATS.CPP和工程选项文件STATS.BPK;编译器生成一个可执行文件STATS.BPL,一个二进制映象STATS.BPI和(可选)一个静态库STATS.LIB。要在应用程序中使用包,把STATS加入RuntimePackages编辑框(选择Project|Options,并点击Packages标签页后)。2.要求列表要求列表指定当前包使用的其他外部的包。在编译时,要求列表中列出的外部包自动链接到使用当前包和外部包的某一单元的任何应用程序。如果当前包中包含的单元文件引用其他包的单元,那个包应在当前包的要求列表中出现,或者应将它增加到要求列表中。如果它被从要求列表中省略,编译器将把它引入到包的“隐式包含单元”。注意 你创建的大多数包将需要VCL50。任何依赖VCL单元的包(包括SysUtils)必须列出VCL50,或另外一个要求VCL50的包要在其要求列表中列出VCL50包。(1) 避免循环的包引用包的要求列表中包含循环的引用。这意味着: 包不能在它的要求列表中引用自身。 一个引用链终止前必须没有重引用链中的任何包。如果包A要求包B,那么之后包B就不能要求包A;如果包A要求包B,并且包B要求包C,之后包C不能要求包A。(2) 处理重复的包引用在包的要求列表中,或在RuntimePackages编辑框中,对包的重复引用将被编译器忽略。但为了编程清晰及可读性,应该找到并删除重复的包引用。3.Contains列表Contains列表指出被绑定到包的单元文件。如果编写自己的包,就应先将自己的源代码存入.CPP文件,然后将该文件加入到Contains列表当中。避免使用重复的源代码包不能出现在另一个包的Contains列表中。直接包含在Contains列表中的单元,或通过这些单元而间接包含进Contains列表中的单元,在编译的时候都会被绑定到包。一个单元不能(直接或间接)的被同一个应用程序(包括C+Builder的IDE)所使用的一个以上的包同时包含。这意味着,如果你创建的包中包含VCL50中的一个单元,就不能把这个包装入IDE中。要使用已包含在其他包中的单元,应将该包加入到Requires列表中。10.4.5 编译包编译包可以通过IDE,也可以使用命令行编译。要使用IDE编译包,1) 选择File|Open,选择包的源文件或工程选项文件,然后点击Open。2) 打开编辑器后,选择Project|Make或Project|Build。可以直接在包的源代码中插入编译器描述符。详细信息,参阅下面的“与包相关的编译器描述符”。如果使用命令行编译,可以使用与包相关的几个连接器开关。更多信息,参阅下文的“使用命令行编译器和链接器”。1. 与包相关的编译器描述符表10-2列出了可插入包的源代码中的一些包特定的编译器描述符。2.虚包装#pragmapackage(smart_init,weak)描述符影响.OBJ文件在包的.BPI和.BPL文件中的存储方式。如果单元文件中出现#pragmapackage(smart_init,weak)描述符,编译器会在可能的情况下忽略该程序单元,而在其他应用程序或包要求使用该单元时,为其生成一个不包含在包中的本地化副本。使用这个描述符编译的单元称为“虚包装”。例如,假设已经创建了只包含一个单元UNIT的包PACK。同时假设UNIT1没有使用其他单元,但调用了RARE.DLL。当编译包时,如果加入UNIT1.CPP文件,UNIT1就不会被包含进PACK.BPL中;同时也不必将RARE.DLL与PACK一起分发。不过,UNIT1仍然包含在PACK.BPI文件中,如果它被其他的包或应用程序引用,它会从PACK.BPI文件中被复制并直接编译到工程中。现在假设添加第二个单元UNIT2到包PACK中,并假设UNIT2使用了UNIT1。这时,即使在编译包时在UNIT1.CPP中加入#pragmapackage(smart_init,weak)描述符,编译器仍然会将UNIT1包含进PACK.BPL中。但其他的包或应用程序引用UNIT1时,仍使用从PACK.BPI文件中复制的、不包含在包中的本地化副本。注意包含#pragmapackage(smart_init,weak)描述符的单元文件不能拥有全局变量。#pragmapackage(smart_init,weak)描述符是为需要将BPL分发给其他C+Builder程序员的开发者提供的一个高级选项。它能帮助开发者避免分发不常用的DLL,并消除基于相同外部库的包之间产生的冲突。例如,C+Builder的PenWin单元引用PENWIN.DLL。大多数的工程不会使用PenWin,同时大多数的计算机中也没有安装PENWIN.DLL。因此,PenWin单元在VCL50中是虚包装。当编译一个使用包VCL50和PenWin单元的工程时,PenWin从VCL50.BPI中被复制并直接绑定到工程中;生成的可执行文件静态链接到PENWIN.DLL。如果PenWin不是虚包装,会产生两个问题。首先,VCL50本身会静态链接到PENWIN.DLL,因此在没有安装PENWIN.DLL的计算机上将不能加载它。其次,如果试图创建一个包含PenWin的包,将会产生一个编译错误,因为PenWin单元同时包含在VCL50和你的包中。因此,若没有虚包装,Penin就不能包含在标准的VCL50中分发。3.使用命令行编译器和链接器当从命令行编译时,使用-Tpp链接器选项以确保将工程作为一个包编译。其他特定的包选项在表10-3中列出。kage和DesignPackage复选框;如果既不用-Gpr,也不用-Gpd,编译的结果包在设计时和运行时都可工作。-D选项对应于同一页的Description编辑框。-Gl选项对应于ProjectOptions对话框的Linker页中的Generate.LIBFile复选框。4.成功编译创建的包文件要创建包,需使用扩展名为.BPK的工程选项文件和源(.CPP)文件来编译。编译器生成的文件名匹配源文件名;也就是,如果源文件名为TRAYPAK.CPP,工程选项文件TRAYPAK.BPK应包括:在这种情况下,编译工程创建的包名为TRAYPAK.BPL。表10-4列出了成功编译一个包而生成的文件。当编译时,BPI、BPL和LIB文件生成后缺省放置在由Tools|EnvironmentOptions对话框的Library页中指定的目录。可以点击包编辑器的Options快速按钮显示ProjectOptions对话框,然后在Directories/Conditionals页中修改缺省设置C+ Builder 设计时包作者:佚名来源:不详发布时间:2006-2-26 15:33:5210.3 设计时包设计时包用于在IDE的组件面板上安装组件和为定制组件创建特殊的属性编辑器。C+Builder捆绑了下列表10-1中的在IDE中预装的设计时组件包。这些设计时包通过调用工作,那些运行时包都在要求列表中引用。例如,DCLSTD50引用VCL50。DCLSTD50本身包含附加的功能,可把大多数标准组件放到组件面板中以供使用。除了预装的包,还可以在IDE中安装自己的组件包,或第三方的开发者的组件包。DCLUSR50设计时包被提供为新组件的缺省容器。安装组件包所有的组件都作为包在IDE中被安装。若编写了自己的组件,应创建并编译包含它们的一个包(参见1.2.4节)。组件源代码必须遵循在本书第五部分“创建定制组件”中说明的模式。如果把多个单元加入到单个包中并且每个单元中都有组件,必须为包中包含名字的名字空间中所有的组件使用单一的注册函数。安装或卸载自己的组件或第三方供应商的组件,可按这些步骤:1) 如果正在安装一个新包,拷贝或移动包文件到一个本地目录。如果包是与.BPL、.BPI、.LIB、.OBJ文件捆绑而来的,要确保全部拷贝。存储.BPI和头文件,还有.LIB或.OBJ文件的目录,如果在分布式环境中,则必须在C+Builder Library路径。2) 从IDE菜单中选择Component|InstallPackages,或选Project|Options并点击Packages标签页。3) 一个可用包列表出现在“Designpackages”下。 要在IDE中安装一个包,选择它旁边的复选框。 要卸载一个包,取消它的复选框选择。 要查看安装的包中包括的组件的列表,选择包并点击Components。 要把一个包加入列表,按Add并在AddDesignPackage对话框中浏览.BPL文件所在的目录(见步骤1)选择一个.BPL文件并点击Open。 要把一个包从表中移走,选择包并点击Remove。4)单击OK。包中的组件按RegisterComponents过程的指定在组件面板上安装,它们的名字也在同一过程中分配。除非改变缺省设置,否则创建新工程时所有的可用的包都被安装。要把当前安装选择自动作为新工程的缺省选择,在对话框的底部选择Default复选框。要从组件面色板中卸掉一个组件而不卸载包,选择Component|ConfigurePalette,或选择Tools|EnvironmentOptions,并点击Palette标签页。Palette标签页中列出了已安装的组件及它们出现的组件面板页名。选择任何组件并点击Hide会把组件从面板删除C+ Builder 运行时包作者:佚名来源:不详发布时间:2006-2-26 15:33:54第10章 使用包和组件包是C+Builder应用程序、IDE或二者同时使用的一个特殊的动态链接库。运行时包提供用户运行应用程序时的功能。设计时包用于在IDE中安装组件,并为定制组件创建特殊的属性编辑器。单个的包在设计时和运行时都能工作,并且设计时包经常通过调用运行时包来工作。包存储在扩展名为.BPL(Borland包库)的文件中以便与其他的DLL(动态链接库)区分开来。与其他的运行时库一样,包中包含能在各应用程序间共享的代码。例如,最经常使用的C+Builder组件存放在称为VCL50的包中。每次创建应用程序时,都可指定它使用VCL50。当编译这样的应用程序时,应用程序的可执行文件仅包含它特有的代码和数据;公用代码存放在VCL50.BPL中。安装了几个可用包应用程序的一台计算机仅需要VCL50.BPL的一个拷贝,它被所有的应用程序和IDE自身共享。C+Builder捆绑了一些预编译的运行时包,包括VCL50,它封装VCL组件。C+Builder也使用设计时包处理IDE中的组件。你可以创建有或没有包的应用程序。然而,如果想要把定制组件增加到IDE中,必须把它们作为设计时包安装。可以创建自己的运行时包以便在应用程序间共享。如果你编写C+Builder组件,可以在安装前将组件编译为设计时包。10.1 为什么使用包设计时包简化了发布并安装定制组件的任务。运行时包是可选的,它对常规的编程提供了一些好处。通过把可重用代码编译进一个运行时库,就可在应用程序中共享它。例如,所有应用程序包括C+Builder本身都能通过包访问标准的组件。因为应用程序没有把组件库的拷贝放进可执行文件中,可执行文件会减小很多,这节省了系统资源和硬盘空间。而且,因为仅有应用程序特有的代码被编译,所以包可以允许快速的编译。包和标准的DLL当定制在IDE中使用的组件时需要创建包。当要创建造一个可被任何Windows应用程序调用的库时,创建一个标准的DLL,而不用考虑创建应用程序使用的开发工具。注意包与应用程序中的其他模块共享其全局数据。 10.2 运行时包运行时包与C+Builder应用程序一起发布。当用户运行应用程序时提供功能。为运行使用包的一个应用程序,计算机必须有应用程序的.EXE文件和所有应用程序使用的包(.BPL文件)。BPL文件必须在应用程序可使用它们的系统路径上。当发布一个应用程序时,必须确保用户拥有任何需要的正确版本的.BPL。10.2.1在应用程序中使用运行时包要在应用程序使用包:1) 在IDE中装载或创建一个工程。2) 选择Project|Options。3) 选择Packages标签页。4) 选择“BuildwithRuntimePackages”复选框,并在下面的编辑框中输入一个或多个包名(与已安装的设计时包相关的运行时包已在编辑框中列出)。要把一个包加到已存在的表中,需点击Add按钮,并在AddRuntimePackage对话框中输入新的包名。要浏览列表中可用的包,先点击Add按钮,然后在AddRuntimePackage对话框中点击靠着PackageName编辑框的Browse按钮。如果在AddRuntimePackage对话框的SearchPath编辑框中编辑,会改变C+Builder的全局库路径。包文件不需要包括扩展名。若直接在RuntimePackages编辑框中输入,确保用分号分开多个名字。例如:VCL50;VCLDB50;VCLDBX50。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论