信息化 频道

<连载>Protel二次开发从入门到精通

  3.8 服务器安全
  3.8.1锁

服务器图表的锁定部份允许您来指定被服务器使用的一个或多个安全锁的名称。安全锁允许您授权部份或完整地访问服务器,用户基于一个安全的访问代码入口来访问设计资源管理器。在服务器文档图表的锁定部份,使用增加,删除和编辑按扭,来为您的服务器输入您希望有的名称和任何锁的摘要描述。

  3.8.2创建锁

一个抽象的锁对象,TLock,在“Rt_forms”单元中定义如下:

TLock = Class(TObject)

LockName: String;

AccessLevel :TAccessLevel;

Status: Word;

Constructor Create(AName : String);

DestructorDestroy; Virtual;

ProcedureSetState_Lockup;

FunctionGetstate_AccessLevel :TAccessLevel;

FunctionSetstate_Unlock(KeyCode: String; VarHostId: String;

UserCount:Integer;HostIdIsHard:Boolean):TAccessLevel;Virtual;

End;

LockName是一个描述字符串,将在服务器安全对话框中被用户看到。

AccessLevel是锁定当前访问的层。TAccessLevel是一个枚举类型,在“”单元中定义如下:“eAccessLevel_Denied, eAccessLevel_Partial1,.. eAccessLevel_Partial10,eAccessLevel_Full”。在真实情况下,您将很可能仅使用eAccessLevel_Denied,第五个枚举值,和eAccessLevel_Full。

创建应该被过载(overridden,面向对象知识)来设置您的锁定的名称,并且初始化任何关联的其它对象/单元到您的控制访问方法。

SetState_Lockup不需要被过载。它设置锁来拒绝访问。GetState_AccessLevel也不需要被过载。它简单地返回访问层次。

如果您想要访问控制,SetState_Unlock必须被过载。默认的方法设计访问为完全访问。在设置您的访问层次后,不要调用继承的方法。KeyCode是访问代码,HostId通常是一序列号,UserCount是同时请求的用户数,HostIdIsHard告诉是否ID是一个硬件驱动来或从用户来。

每一个锁也必须被增加到您的TServerModule类的子孙锁的集合中。要么过载TServerModule的构造过程并且增加它们,或在“Main.pas”的“CreateServer”进程中增加它们。

增加锁:

您需要定义锁对象

TMyLock = Class(TLock)

...

End;

声明一个实例

MyLock :TMyLock;

Add the code

增加代码

MyLock :=TMyLock.Create(‘Lock Name’);

ServerModule.Locks.Add(MyLock);

现在,锁将自动地被设计资源管理器处理,且您的任何进程能基于MyLock.GetState_AccessLevel的返回结果来修改它们的行为。

  3.9 服务器源代码例子

服务器代码例子,请参见“\SDK\Examples\Server Examples”文件夹。您能打开每一个工程并且调试其代码,编译每一个工程并以插件方式加入到设计资源管理器中。这些小的服务器例子显示出,在设计资源管理器什么是可能的做到的。

下列表中例子服务器简短的描述了例子代码功能。

服务器

描述

CreateNetListServer

一个基本的连线表服务器,从一个原理图中提取连线表。

CuplText

一个基本的仅仅向导服务,创建一个Cupl模板。

DemoText

一个基本的编辑器服务,显示脱离文本编辑器的编辑能力。

EditCell

一个基本对话框服务(起源自一个向导模板),允许您来从一个展开的文档中更新或检索值。

FileFind

一个基本的很有用的服务器,来查找一个设计数据库文档,并且使您能从此服务器中选择和打开一个文档。

MMedia

一个基本的向导,示范在设计资源管理器中什么能够被实现。

PCB 2.7 Loader

一个“在DLL中拖动”服务器,在设计资源管理器中加载PCB 2.7格式文档。

PCB 2.8 Loader

一个“在DLL中拖动” 服务器,在设计资源管理器中加载PCB 2.8格式文档。

PCBSave

一个“在DLL中拖动” 服务器,从设计资源管理器中保存PCB文档。

  3.10 设计数据库实体

实体是一个设计数据库中的被调用的实体项目,一个实体可以是一个文档或文件夹。一般来说,一个实体是一个文档,能从在设计资源管理器中的一个打开的设计数据库得到它。

一个Binder与设计数据库关联,并有实体。每一个Binder默认有设计工作组文件夹、回收站文件夹和任何其它文件夹。一个Binder也能被作为一个容器描述,它在设计资源管理器的浏览器面板中显示为一个桶图标。

  3.11 下一步做什么
  3.11.1介绍

由于服务器被作为动态连接库(.DLL)文件编译,因此它有可能在其它服务器能访问时,暴露出服务器的功能。为更多增强相互作用和在不同服务器与用户定义的宏之间进行集成,原理图(SCH)和印制板(PCB)编辑器有一个开放的应用程序接口(API),一个开放的API允许从其它服务器或从一个用户定义的宏中,直接使用PCB和SCH进程、数据库对象。

设计资源管理器有一个导航器面板,面板上有不同的图标来表现不同的实体。实体可以是文件夹,原理图图表或PCB文档。集成的设计窗体是顶层的文件夹,设计数据库包含的设计工作组文件夹、回收站文件夹和相应的文件夹和文档。一个编辑器窗体代表一个活动的服务器窗体,一个原理图编辑窗体如图所示。

在您的当前的服务器中,使用PCB API所支持的PcbApi_SendCommand函数,来运行PCB编辑器的进程是可能的,但是使用此进程,无论如何,您没有访问PCB编辑器的底层实现,例如,使用软件代理捕获PCB消息,或在PCB编辑器的一个数据库中操作实体和它们的属性。使用PCB API,您有能力来访问PCB设计对象数据库。所有的文档服务器都有API支持,您能编写程序来抽取、修改和更新这些服务器的数据库。设计资源管理器有它的自己的API,即客户端API,此客户端API提供一个接口到设计数据库的文档,在其中,程序开发者能访问它。

当您激活“Show all document kinds”选项后,任何被通过OLE服务器创建和编辑的文档(通常地注册在您的计算机上)将出现在一个新建文件的对话框中。在这里,非Protel文档被存储在设计资源管理器内部,但仍能被那个创建它们的应用程序(OLE服务器)来编辑。这是Protel 99 SE的一个强大的特点,使用它,有能力来支持Protel文档和非Protel文档。

Protel设计环境通过MacroMaker(宏制作)服务来支持OLE自动化。在其它的应用程序中,可直接从您的宏中调用OLE对象,打开一个微软Word文档,增加信息到文档并保存它,在设计资源管理器中,所有的都从您的宏中来运行。为获得更多的关于使用宏的信息,请参见宏制作服务器支持文档,那里有许多宏脚本的例子,将有助于您的理解。

    更多的信息,请参见“客户端API章节”和“设计数据库手册”、“客户端API章节”、“Protel 99运行时间库章节”和服务器手册/参考等。这些手册将帮助您来为Protel 99创建一个服务器,或通过附加的服务器(小规模的以插件方式加入的服务器)来增强已存在的服务器的特征。您也能学习Protel SDK包提供的源代码例子,这些代码例子在“\SDK\Examples”中。


图1-45 设计资源管理器和它的窗体

  3.11.2编写附加的服务器

所有的附加方式(插件方式加入设计资源管理器)的Protel服务器,使用相同的方法来编写。设计管理器的模式架构,使其易于为您集成已存在的软件到设计管理器环境中,并且免除了数据传送和用户接口定义。SDK工具为您构建一个附加的服务器工程,一个BorlandDelphi 3或5版本,并提供丰富的API功能,剩下的就是要充分发挥您创造力。

图1-46描述了开发一个附加的服务器所需要了解的知识,例如,如果您想开发一个产生自定义报表的服务器,那么您需要读一读提高篇中“第三章原理图API”和“第四章印制板 API手册”,精通篇中“第八章Protel 99数据提取和系统集成”和“第九章Protel 99与COM开发”,以及附录篇中API参考手册等章节。


图1-46 SDK路线图

  3.11.3使用Protel运行包

 

如果您想为Protel设计资源管理器开发编译一个您自己的服务器,那么您需要使用Protel的运行时间包,CSRTL.DPL(Delphi5 版本为CSRTL50.BPL),运行时间包允许您在服务器之间相互共享代码,减少代码编写量。

如何在您的服务器应用程序中使用Protel运行时间包呢?使用运行时间包非常简单。首先在Delphi IDE中加载或创建一个项目,选择菜单“Project”->“Options”菜单项,再选择“Packages”标签页,选中“Build With Runtime Packages”检查框,并且引入“CSRTL”或“CSRTL50”运行包到SDK路径中,如图1-47所示。

图1-47 显示运行包对话框

图1-48 检索路径对话框

图1-48显示了如何来设置检索路径,“\RTL3\”或“RTL5\”,具体取决于您使用的Delphi编译器版本,选择菜单“Project”->“Options”,在“Directories/Conditionals”页上来设置SDK的检索路径。

设置好运行时间包和检索路径后,当您为设计资源管理器来创建一个服务器时,还需要把SCH、 PCB或Spread API等所需要的单元加到的服务器工程中的源代码uses代码段中,这些API单元已在CSRTL或CSRTL50包中引用,否则,会得到编译错误信息,编译器将提示说找不到某个过程或方法。

  4. 服务器制作向导所产生的源代码

上面,我们已了解清楚SDK基本情况和SDK向导产生服务器架构过程,本节详细列出SDK所产生各种类型文档,使您对SDK有更进一步认识,别着急,当您读完本书时,一定能从SDK开发的初级选手上升为SDK开发人才,要的只是耐心、认真、执著、时间和不断实践。

服务器类型

源代码

描述

可安装文件

Editor

编辑器

DLL, INS, RCS, HLP*

MyServer.dpr

工程文件。

MyServer.dof

编译器设置文件。

Abstract.pas

TabstractServerWindow类。

Common.pas

TCommonWindow类继承自TabstractServerWindow类,是不同文档类型的通用类。

Editor#n.pas

Editor#n.dfm

编辑器源代码。

编辑器窗体。

Panel#n.pas

Panel#n.dfm

面板源代码。

面板窗体。

Wizard

高导

DLL, INS, RCS, HLP

MyServer.dpr

工程文件。

MyServer.dof

编译器设置。

Wizard.pas

向导源代码。

Wizard.dfm

向导窗体。

Utility

实用工具

DLL, INS

MyServer.dpr

工程文件。

MyServer.dof

编译器设置文件。

注意:Editor#n和Panel#n文件指出了编辑服务器能支持多少文档类型,例如,如果有两种文档类型,将分别会是Editor1,Panel1,Editor2,Panel2。下列的文件对以上三种服务器来说,是通用的、共有的文档:

一般文件

描述

Comtable.pas

此单元有命令的启动者表,也就是此服务器所支持的进程的列表,在此单元中,定义此服务器所支持的进程。一个服务器可有多个进程。

Commands.pas

服务器类,此类是一个继承自TServerModule对象的对象。此对象为与设计资源管理器通信而操作所有底层协议。当SDK为我们产生好服务器构架后,我们自己就可在此单元是编码代码,随便写什么代码,只要这种代码所完成的功能是您想要服务器来执行的任务,当然,前提条件是您会使用Delphi开发工具,了解Pascal语法。

Main.pas

此单元负责创建和销毁服务器。对于文档编辑器型服务器,通过此服务器实现支持的不同的文档类型,因而,服务器需要正确支持被连入的接口单元。

  4.1 源代码文档文件

Protel SDK能产生联机帮助文件和能被关联到您的EDA应用程序的必需的联机用户手册。Protel SDK将创建两类文件,一类文件富文本格式,另一类文件是带有.HPJ为扩展名的联系手册。带有.HPJ为扩展名文件是帮助文件,您能使用您更喜欢的帮助文件编译器来编译这些文件。您如果有每一个服务器进程和它们的参数的正确文档,您将能为您的服务器编译一个完全的参考帮助文件。如果您想要有一个“how-to”(如何进行)类型帮助文件,您就能使用您的编译器选择来产生其它的.HLP文件,并且编译连接到自动产生的帮助文件。

如果您运行了“创建您的第一个服务器”例子,从Protel SDK的“Tools”的选择菜单项中,您钩(√)上“Generate Help”和“Generate Manual”选项,服务器向导产生了三种文件,为您的服务器产生出帮助文档。这些在源文件中的文本,起源于在服务器向导文档中所输入的信息(MyServer.SRV),因此,在向导中输入所有描述和备注的字段信息,信息应尽量的完整和正确是很重要的。所产生的文件分别是:MyServer.rtf, Myserver.hpj和Manual.rtf。

4.1.1MyServer.rtf

Myserver.rtf文件是一个富文本格式的文档,编码适合于帮助文件。在此文件中的列出所有定义在服务器图表中的进程,和它们的描述及参数备注。因此,在向导中输入所有描述和备注的字段信息,信息应尽量的完整和正确是很重要的。此文件和MyServer.hpj文件一起被使用,可以用一个适合的标准的WinHelp编译器工具来编译帮助文件。

  4.1.2MyServer.hpj

MyServer.hpj文件是一个WinHelp编译器的信息文件,此文件包含使用一个基本的WinHelp编译器,来转换MyServer.rtf文件到联机帮助文件所必须的信息。

  4.1.3Manual.rtf

Manual.rtf文件是一个富文本格式的文档文件,比较适合作为纸介质手册打印出来,或者适合作为Adobe Acrobat格式的联机手册,用于电子阅读。在此文件中的文本列出所有定义在服务器图表中的进程,和有它们的描述及参数备注。因此,在向导中输入所有描述和备注的字段信息,信息应尽量的完整和正确是很重要的。

联机手册是自动以富文本格式产生的,能被微软Word应用程序打开。如果要产生PDF格式,您需安装PDF生成程序到系统中,用程序打印将产生一个.PDF文件,此文件能被Acrobat Reader读取(从在Internet和环球网的Adobe和多个网站上可得到Acrobat Reade,Acrobat Reade是自由的),Acrobat Reade可以把联机手册打印成纸介质。

RTF文件的第一页将是目录页,按字母表列出所有的进程,在下面是一个页,描述了每一个进程,此描述根据您在向导的服务器进程对话框中所输入的进程信息构建出来的;

Summary:属性标签描述行

Content:目录标签

Parameters:参数标签

  4.2 SDK运行时间库包

Protel SDK包允许您自设计资源管理器中连接到您的服务器。SDK有两个不同的运行时间包,分别被Borland Delphi 3和Borland Delphi 5所构建,CSRTL运行包和ProtelComponents设计时间包。CSRTL运行时间包和ProtelComponents设计时间包(如是Borland Delphi 5,为CSRTL50和ProtelComponents50)允许在设计资源管理器服务器当中共享代码。这些运行时间包能被在Protel的SDK安装目录 “\RTL3”或“\RTL5”子目录下找到。更详细的有关运行时间包的描述,请参见运行时间库参考或其它Protel参考。下面表描述SDK的主要的CSRTL或CSRTL50包中的单元。

CSRTL 单元

描述

rt_forms

此单元包含大多数主要的系统函数和类。此单元的主要的部分有:TServerWindow和TPanelWindow类;TLock类声明;TServerModule类声明;文档枚举;和状态条接口函数等。

rt_Param

此单元包含参数进程所有的函数和类声明。

rt_deb

此单元包含调试函数。

rt_FileUtil

此单元包含几个为操作设计文档所用的文件名称字符串函数。

rt_Types

此单元包括所有的系统类型声明和所有的系统消息定义。

rt_Launc

此单元实现进程表。

rt_Route

此单元为到Router动态连接库的接口。

rt_DDB

此单元有到设计数据库文件的例程接口,也封装几个DDB单元。

ClientTypes

此单元包含客户端应用程序类型。

ClientProcs

此单元包含客户端应用程序API函数的调用。

ClientClass

此单元包含客户端应用程序类。

SchAPITypes

此单元包含SCH服务器类型。

SchProcs

此单元包含SCH服务器API函数的调用。

SchClass

此单元包含SCH服务器类。

PCBTypes

此单元包含PCB服务器类型。

PCBProcs

此单元包含为PCB服务API函数的调用。

PCBClass

此单元包含PCB服务器的类。

  5. 本书提供的代码例子

SDK安装好后,会在“\SDK\Examples\Server Examples”文件夹中产生很多例子。本书对其中大部份主要例子作了说明和分析注释,请您能很容易看明白。原SDK中有些代码有一些错误或功能上缺陷,笔者也作了修改,使其正确无误。

为了使于读者学习,笔者把原SDK提供的一些例子进行了详细分析,将在相关章节中作详细阐述。代码例子按章节学习需要,分别被安排放在如\Sample目录中NO1、NO2等子目录下,一些代码例子目录名称包含“Amend”是笔者对原有程序作了一些改进,因为原有程序可能有一些显示或实现上的问题。每一个代码都有“说明.PDF”文档,来说明此程序功能和运行结果。

在学习了SDK提供的一些例子后,到本书精通篇,笔者提供了一个完整的代码例子,此例子是笔者在长期的实践中,为众多大中型企业进行实际的系统集成时所研发的,现完整提供出来,您可直接使用或稍加改进就能直接运行,来解决您可能已思考很久或长期苦恼的问题。

先学习SDK提供的一些例子,再学习精通篇例子,循序渐进,心急可吃不得热豆腐。(e-works)

0
相关文章