<p align="center"><big><big><big>怎样编写DELPHI向导(四)</big></big></big></p>
<p>4. ToolServices<br></p>
<p>
我们已经详细讨论了可爱但功能贫乏的向导,
为了编写真正有用的向导, 我们需要在 Execute 方法中做一些实际的事情.
比如显示一个(或者多个)有趣的窗体, 其中可能发生许多事情,
有点象我们介绍的 TSysInfoExpert.
你是否曾经觉得需要在 IDE 中载入不同于 .dpr 文件的工程? 没有过吗?
使用 Delphi 编写过 DLL 吗?
我就经常需要在 IDE 中把 .pas 或其他任何非 .dpr 文件作为一个工程打开.
实际上, 我的需求太大, 我希望编写一个向导,
能帮助我浏览整个磁盘, 目录, 搜索某些文件, 并作为新的工程打开.
可能作到吗? 要回答这个问题, 我们需要看看 Delphi 1.0 的 ToolIntf.pas 单元,
其中包含 TIToolServices 的定义("I" 表示接口), 如下:
</p>
unit&nbsp;ToolIntf;
&nbsp;<br>
interface &nbsp;<br>
uses &nbsp;<br>
&nbsp;&nbsp;WinTypes,&nbsp;VirtIntf;
&nbsp;<br>
&nbsp;<br>
Type &nbsp;<br>
&nbsp;&nbsp;TIToolServices&nbsp;=&nbsp;class(TInterface) &nbsp;<br>
&nbsp;&nbsp;public &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Action&nbsp;interfaces&nbsp;} &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;CloseProject:&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;OpenProject(const&nbsp;ProjName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;OpenProjectInfo(const&nbsp;ProjName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;&nbsp;<br>
export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SaveProject:&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;CloseFile(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;SaveFile(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;OpenFile(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;ReloadFile(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;ModalDialogBox(Instance:&nbsp;THandle;&nbsp;TemplateName:&nbsp;PChar;&nbsp;&nbsp;&nbsp;<br>
WndParent:&nbsp;HWnd;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DialogFunc:&nbsp;TFarProc;&nbsp;InitParam:&nbsp;LongInt):&nbsp;Integer;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;CreateModule(const&nbsp;ModuleName:&nbsp;string;&nbsp;Source,&nbsp;Form:&nbsp;TIStream;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CreateFlags:&nbsp;TCreateModuleFlags):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Project/UI&nbsp;information&nbsp;} &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetParentHandle:&nbsp;HWND;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetProjectName:&nbsp;string;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetUnitCount:&nbsp;Integer;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetUnitName(Index:&nbsp;Integer):&nbsp;string;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetFormCount:&nbsp;Integer;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetFormName(Index:&nbsp;Integer):&nbsp;string;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetCurrentFile:&nbsp;string;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;IsFileOpen(const&nbsp;FileName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetNewModuleName(var&nbsp;UnitIdent,&nbsp;FileName:&nbsp;string):&nbsp;Boolean;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Component&nbsp;Library&nbsp;interface&nbsp;} &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetModuleCount:&nbsp;Integer;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetModuleName(Index:&nbsp;Integer):&nbsp;string;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetComponentCount(ModIndex:&nbsp;Integer):&nbsp;Integer;&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;GetComponentName(ModIndex,CompIndex:&nbsp;Integer):&nbsp;string;&nbsp;virtual;&nbsp;&nbsp;<br>
export;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;{function&nbsp;InstallModule(const&nbsp;ModuleName:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;&nbsp;&nbsp;<br>
export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;CompileLibrary:&nbsp;Boolean;&nbsp;virtual;&nbsp;export;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;} &nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Error&nbsp;handling&nbsp;} &nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;RaiseException(const&nbsp;Message:&nbsp;string);&nbsp;virtual;&nbsp;export;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;
end;
&nbsp;<br>
&nbsp;<br>
implementation &nbsp;<br>
&nbsp;<br>
<p>
Tool services 对象在(Delphi/C++Builder)应用程序一方创建,
并在初始化时传递给负责 VCS/Expert 管理的 DLL.
注意, (Delphi/C++Builder)应用程序负责创建和释放接口对象, 而使用者绝对不要释放接口.
</p>
<p>
对使用者有效的 ToolServices 函数如下(对 Delphi 1.0, 2.0x, 3 都有效):
</p>
<br><big><big><i><b>动作:</b></i></big></big><br>
<b>CloseProject</b><br>
&nbsp;&nbsp;如果当前没有打开工程, 或当前工程关闭成功, 返回 True.<br><br>
<b>OpenProject</b><br>
&nbsp;&nbsp;如果指定名称的工程打开成功, 返回 True.
要创建新的工程和主窗体, 必须传入一个空字符串.<br><br>
<b>OpenProjectInfo</b><br>
&nbsp;&nbsp;如果指定的工程打开成功, 返回 True.
这个函数略过普通工程的载入特性(比如载入桌面设置文件, 显示源代码等),
而只简单地打开 .dpr 和 .opt 文件.<br><br>
<b>SaveProject</b><br>
&nbsp;&nbsp;如果当前工程未修改, 或当前没有打开工程, 或当前工程保存成功, 返回 True.<br><br>
<b>CloseFile</b><br>
&nbsp;&nbsp;如果指定的文件没有被打开, 或关闭成功, 返回 True.<br><br>
<b>OpenFile</b><br>
&nbsp;&nbsp;如果指定的文件已经被打开, 或打开成功, 返回 True.<br><br>
<b>ReloadFile</b><br>
&nbsp;&nbsp;如果指定的文件已经被打开, 而且再次成功地从磁盘载入, 返回 True. (注意, 这项操作不检查当前编辑器状态)<br><br>
<b>RefreshBuffers</b><br>
&nbsp;&nbsp;使得 IDE 检查所有打开的文件的日期/时间标记, 确定磁盘上的文件是否修改过,
如果是, 文件将被重新载入.<br><br>
<b>ModalDialogBox</b><br>
&nbsp;&nbsp;供非 VCL DLL 使用, 显示一个模态(modal)对话框.
注意, 使用 VCL 编写的 DLL 不需要调用这个方法, 而可以简单地使用窗体的 ShowModal 函数.<br><br>
<b>CreateModule</b><br>
&nbsp;&nbsp;从内存映象中创建新的模块, 包括源文件和(可选的)窗体文件.<br>
&nbsp;&nbsp;TCreateModuleFlags 包括:<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmAddToProject: 将新模块加入到当前工程中.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmShowSource: 在最上层的编辑器窗口中显示源文件.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmShowForm: 如果创建了窗体, 将窗体显示在源文件之上.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmUnNamed: 将模块标记为未命名, 用户第一次试图保存文件时将出现 SaveAs 对话框.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmNewUnit: 创建新的单元, 并加入到当前工程中. 注意: 其他所有参数将被忽略.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmNewForm: 创建新的窗体, 并加入到当前工程中. 注意: 其他所有参数将被忽略.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmMainForm: 如果模块包括窗体, 将窗体设置为当前工程的主窗体. 必须与 cmAddToProject 选项组合才有效.<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmMarkModified: 确保新模块标记为修改过.<br>
<br><big><big><i><b>信息:</b></i></big></big><br>
<b>GetParentHandle</b><br>
&nbsp;&nbsp;返回窗口句柄, 使用者创建窗体时将以这个句柄作为父窗口句柄.<br><br>
<b>GetProjectName</b><br>
&nbsp;&nbsp;返回当前工程的完整路径及名称, 如果没有打开工程, 返回空字符串.<br><br>
<b>GetUnitCount</b><br>
&nbsp;&nbsp;返回当前工程中包含的单元数量.<br><br>
<b>GetUnitName</b><br>
&nbsp;&nbsp;返回指定单元的完整路径及名称.<br><br>
<b>GetFormCount</b><br>
&nbsp;&nbsp;返回当前工程中包含的窗体数量.<br><br>
<b>GetFormName</b><br>
&nbsp;&nbsp;返回指定窗体的完整路径及名称.<br><br>
<b>GetCurrentFile</b><br>
&nbsp;&nbsp;返回当前文件的完整路径及名称, 当前文件可以是窗体或单元. 如果当前没有选择文件, 返回空字符串.<br><br>
<b>IsFileOpen</b><br>
&nbsp;&nbsp;如果指定的文件已打开, 返回 True.<br><br>
<b>GetNewModuleName</b><br>
&nbsp;&nbsp;自动生成有效的文件名及单元名标识符. 使用与 IDE 相同的机制.<br><br>
<b>GetModuleCount</b><br>
&nbsp;&nbsp;返回组件库中安装的模块数量.<br><br>
<b>GetModuleName</b><br>
&nbsp;&nbsp;返回指定模块的名称, 模块通过索引号指定.<br><br>
<br><big><big><i><b>组件库接口:</b></i></big></big><br>
<b>GetComponentCount</b><br>
&nbsp;&nbsp;返回确定的模块中安装的组件数量.<br>
<b>GetComponentName</b><br>
&nbsp;&nbsp;返回指定组件的名称, 组件通过模块索引号及组件在模块内的索引号指定.<br><br>
<br><big><big><i><b>意外处理:</b></i></big></big><br>
<b>RaiseException</b><br>
&nbsp;&nbsp;在 IDE 中产生一个意外, 这个意外的消息由传递给这个函数的字符串参数决定.
注意: 这将导致栈释放, 控制将<font color=red><b>不会</b></font>返回到这里.
库有责任确保在调用这个函数前正确地处理了意外情况.<br><br><br>
(与 Delphi 1.x 相比)在 Delphi 2.0x, 3 中 TIToolInterface 包括一些扩展的 Tools API,
不仅是 TIExpert 增加了新的方法, 更主要的是 TIToolServices.
下面这些扩展的方法是新增的, 而且只对32位版本的 Delphi 有效(与 Delphi 1.0 中相同的方法没有列出):
<br><br>
TIToolServices&nbsp;=&nbsp;class(TInterface) &nbsp;<br>
public &nbsp;<br>
&nbsp;&nbsp;{&nbsp;Action&nbsp;interfaces&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;CreateModuleEx(const&nbsp;ModuleName,&nbsp;FormName,&nbsp;AncestorClass,
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;FileSystem:&nbsp;string;&nbsp;Source,&nbsp;Form:&nbsp;TIStream;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;CreateFlags:&nbsp;TCreateModuleFlags):&nbsp;TIModuleInterface;&nbsp;virtual;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Project/UI&nbsp;information&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;EnumProjectUnits(EnumProc:&nbsp;TProjectEnumProc;&nbsp;Param:&nbsp;Pointer):&nbsp;&nbsp;<br>
Boolean;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Virtual&nbsp;File&nbsp;system&nbsp;interfaces&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;RegisterFileSystem(AVirtualFileSystem:&nbsp;TIVirtualFileSystem):&nbsp;&nbsp;<br>
Boolean;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;function&nbsp;UnRegisterFileSystem(const&nbsp;Ident:&nbsp;string):&nbsp;Boolean;&nbsp;virtual;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;function&nbsp;GetFileSystem(const&nbsp;Ident:&nbsp;string):&nbsp;TIVirtualFileSystem;&nbsp;virtual;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Editor&nbsp;Interfaces&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;GetModuleInterface(const&nbsp;FileName:&nbsp;string):&nbsp;TIModuleInterface;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;function&nbsp;GetFormModuleInterface(const&nbsp;FormName:&nbsp;string):&nbsp;TIModuleInterface;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Menu&nbsp;Interfaces&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;GetMainMenu:&nbsp;TIMainMenuIntf;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Notification&nbsp;registration&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;AddNotifier(AddInNotifier:&nbsp;TIAddInNotifier):&nbsp;Boolean;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;function&nbsp;RemoveNotifier(AddInNotifier:&nbsp;TIAddInNotifier):&nbsp;Boolean;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Pascal&nbsp;string&nbsp;handling&nbsp;functions&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;NewPascalString(Str:&nbsp;PChar):&nbsp;Pointer;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;procedure&nbsp;FreePascalString(var&nbsp;Str:&nbsp;Pointer);&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;&nbsp;procedure&nbsp;ReferencePascalString(var&nbsp;Str:&nbsp;Pointer);&nbsp;virtual;&nbsp;stdcall;&nbsp;&nbsp;<br>
abstract;
&nbsp;<br>
&nbsp;&nbsp;procedure&nbsp;AssignPascalString(var&nbsp;Dest,&nbsp;Src:&nbsp;Pointer);&nbsp;virtual;
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
&nbsp;<br>
&nbsp;&nbsp;{&nbsp;Configuration&nbsp;Access&nbsp;} &nbsp;<br>
&nbsp;&nbsp;function&nbsp;GetBaseRegistryKey:&nbsp;string;&nbsp;virtual;&nbsp;stdcall;&nbsp;abstract;
&nbsp;<br>
end;
&nbsp;<br>
&nbsp;<br>
<p>
对使用者有效的 ToolServices 函数如下(只对32位版本的 Delphi 有效):
</p>
<br><big><big><i><b>动作:</b></i></big></big><br>
<b>CreateModuleEx</b><br>
&nbsp;&nbsp;扩展形式的 CreateModule 方法. 将返回一个 TIModuleInterface 接口.
支持 CreateModule 中使用的所有 CreateModes, 但有一点不同:<br>
&nbsp;&nbsp;&nbsp;&nbsp;cmExisting: 从指定的文件系统中创建一个已存在的模块.<br>
增加了 AncestorClass 参数, 用于指定基类(必须是工程中已有的,
可以先使用 cmAddToProject 标志将模块加入到工程中).<br><br>
<br><big><big><i><b>信息:</b></i></big></big><br>
<b>EnumProjectUnits</b><br>
&nbsp;&nbsp;对过程中的所有单元调用 EnumProc.<br><br>
<br><big><big><i><b>编辑器:</b></i></big></big><br>
<b>GetModuleInterface</b><br>
&nbsp;&nbsp;返回一个关联到指定文件的模块接口.
这个函数对给定的模块返回相同的接口, 只有计数器作了修正,
用户根据自己的需要使用这个接口, 而且结束时必须调用 release.<br><br>
<b>GetFormModuleInterface</b><br>
&nbsp;&nbsp;返回一个关联到指定窗体的模块接口.<br><br>
<br><big><big><i><b>菜单:</b></i></big></big><br>
<b>GetMainMenu &nbsp;</b><br>
&nbsp;&nbsp;返回 IDE 主菜单的接口. 详细信息参见 TIMainMenuIntf.<br><br>
<br><big><big><i><b>通知(Notification):</b></i></big></big><br>
<b>AddNotifier</b><br>
&nbsp;&nbsp;注册一个 TIAddInNotifier 派生类的实例.<br><br>
<b>RemoveNotifier</b><br>
&nbsp;&nbsp;删除一个已注册的 TIAddInNotifier 派生类的实例.<br><br>
<br><big><big><i><b>配置访问:</b></i></big></big><br>
<b>GetBaseRegistryKey</b><br>
&nbsp;&nbsp;返回 Delphi 基本注册信息主键的完整路径.
这个主键关联到 HKEY_CURRENT_USER.<br><br>
<br><big><big><i><b>虚拟文件系统:</b></i></big></big><br>
&nbsp;&nbsp;RegisterFileSystem 方法和 UnRegisterFileSystem 方法似乎是为将来的版本预留的,
以便实现与端口, 操作系统, 文件系统相关的特性.<br>
(注: 本文写作日期比较老, 大概是在 Delphi 3 时期, 新版本的 Delphi 似乎已经实现了虚拟文件系统)<br><br>
<br><big><big><i><b>Pascal 字符串处理:</b></i></big></big><br>
&nbsp;&nbsp;对于使用非 Pascal 语言(例如 C 或 C++)的程序员, 提供了 Pascal 字符串处理函数.
使用 Delphi 的程序员绝对不需要使用这些函数,
但为了完整起见, 我们还是来看看这些函数:<br><br>
<b>NewPascalString</b><br>
&nbsp;&nbsp;根据指定的PChar(在 C 中是 char*)内容分配并返回一个 Pascal 长字符串.
如果 PChar 中传入 nil 或空字符串, 则返回值将是 nil (等价于 Pascal 的空字符串).<br><br>
<b>FreePascalString</b><br>
&nbsp;&nbsp;通过减少引用计数来释放给定的 Pascal 字符串, 如果引用计数降为0, 释放实际的内存.<br><br>
<b>ReferencePascalString</b><br>
&nbsp;&nbsp;增加给定的 Pascal 字符串的引用记数.
调用这个函数可以人为地延长字符串的生存期.
必须相应地调用 FreePascalString, 以便实际地释放字符串所占用的内存.<br><br>
<b>AssignPascalString</b><br>
&nbsp;&nbsp;将 Pascal 字符串赋值给另一个字符串.
绝对不要直接在 Pascal 字符串之间进行赋值.
这样做会产生孤立内存并导致内存泄露.
目的字符串将引用源字符串,
因此目的字符串的引用记数将减少,
源字符串的引用记数将增加.<br><br>