第七章Protel服务器开发
1. 前言
在前面的章节中,我们使用了很多API过程和函数来开发各种附加的服务器,并编写了相应的进程来实现各种不同的功能。我们能否开发出象原理图或印制板一样的服务器,或开发一个简单的文本服务器呢?
在本章,我们将分析SDK提供的一些服务器代码,来揭开服务器开发的奥秘。
2. 一个简单的对话框CommonDialog process
2.1 服务器功能
本服务器功能很简单,仅是弹出一个颜色对话框,您可以选择一个新的颜色,选择好后,退出对话框,系统使用一个ShowInfo过程来显示新的颜色值。此程序主要功能是示范如何使用MessageRouter_SendCommandToModule来调用Client服务器中RunCommonDialog进程。
代码请见\SAMPLES\NO7\Servers\CommonDialog process。
2.2 代码分析
2.2.1 main单元
在main单元中,定义一个TRunADialogProcess类,从TServerModule继承。过程CreateServer创建TRunADialogProcess类实例并加载命令表。代码实现如下:
Procedure CreateServer;
Begin
ServerModule :=TRunADialogProcess.Create;
LoadCommandLauncherTable;
End;
LoadCommandLauncherTable过程定义在单元ComTable中。
2.2.2增加进程到命令表
在ComTable单元中,增加一个进程到命令表中,代码实现如下:
Procedure LoadCommandLauncherTable;
Begin
CreateCommandLauncherTable;CommandLauncherTable_State_AddCommand('RunADialogProcess',@Command_RunADialogProcess);
SortCommandLauncherTable;
End;
CommandLauncherTable_State_AddCommand过程通过提供进程的名称和进程函数指针来增加一个进程入口到命令表中。命令表绑定一个进程的名称到在运行时实现进程的实际函数。只要一个进程在服务器内被调用,为查找实际的函数指针,此命令表就会被查找,如果在表中没有查找到进程的名称,将不会执行什么动作。
2.2.3 Commands单元
主程序Command_RunADialogProcess代码实现如下:
Procedure Command_RunADialogProcess(Window : TServerWindow; Parameters : PChar);
Begin
RunADialogProcess;
End;
下面,只要实现RunADialogProcess过程就可以了,RunADialogProcess过程定义也很简单。
Procedure RunADialogProcess;
Var
P: PChar;
S: TString;
Color : Integer;
Begin
GetMem(P, 4048); //申请内存。
SetState_Parameter(P,'Dialog','Color');
//SetState_Parameter过程插入一个参数到指定的参数文本块中。过程共有三个参数,分别为P,Nmae和Value。
//P指定到一个参数文本块的指针,Name指定要被插入的参数名称,Value指定要被插入的参数值。
SetState_Parameter(P,'Color', '0');
MessageRouter_SendCommandToModule('Client:RunCommonDialog',P,4048,0);
//MessageRouter_SendCommandToModule函数运行在指定模块内的指定的过程,如果成功则返回True,否则返回Flase,
//此函数允许一个服务器来运行一个在其它服务器中的进程,为了运行进程,需要指定目标文档对象的窗体句柄,
//例如,如果您从文本服务器运行一个进程,且当前打开两个文本文件,您需要使用此参数来指定哪一个文本文档要
//被操作,如果没有文档被此服务器支持,参数EditorWindow应该被设置为cProcessWindow_DontCare,如果目标服
//务器没有启动,此函数会自动启动目标服务器。
//如果此模块的标识符没有提供在Process进程参数中,它默认为"Client",举例来说,"CreateNewDocument"被认
//为是"Client:CreateNewDocument"。
//进程能使用Parameter参数来返回结果,例如"Client:RunCommonDialog"进程运行一个对话框并且通过Parameter返回结果。
//函数共有四个参数,如下所示:
//参数类型描述
//ProcessTString指定完整的进程名称,举例来说,"Macro:RunMacro",此参数对大小写不敏感。
//ParametersPChar指定进程参数内存的指针(空值终止),此参数对大小写不敏感。
//MaxParameterSizeInteger指定为参数分配的内存大小。
//EditorWindowHWnd目标文档对象窗体句柄。
GetState_Parameter(P,'Result',S);
//从参数块P中检索Result,并放到字符串S中,如果为True,说明有返回值,如果为False说明无返回值。
//GetState_Parameter函数从参数块中检索一个参数值,如果找到返回True,否则返回False,参数以一个空终止符结尾的数组形式被传递到进程中。
If (S = 'True') Then
Begin
GetState_Parameter(P,'Color',S);//从参数块P中检索'Color'返回值,并放到字符串S中。
Color := StrToInt(S);//把颜色值转换为整数型。
ShowInfo('New color is ' + S); //显示新颜色值。
End;
FreeMem(P, 4048);
End;