ZYDSoft NetBox 2.8 使用手册

NetBox 2.8 使用说明书

NetBox 是一个使用脚本语言进行应用软件开发与发布的开发环境和运行平台，使用 NetBox，可以完全使用脚本语言(比如 VBScript，Javascript) 创建出稳定高效的应用软件，并且可以平滑移植到从 Windows 98 到 Windows .NET Server 的全部操作系统上。

目标

NetBox 提供大量开发部件方便脚本应用的开发，提供开发与发布两种运行模式，保障代码安全，方便应用部署，并且提供了方便的调试手段以提高应用开发效率。

适用范围

对于 WEB 应用，可以迅速将已有的 iis+asp 的应用平滑移植到 NetBox 应用中，除极少数高级编程外，代码不需要任何修改，同时 NetBox 还提供大量扩展部件，使得 WEB 应用更加方便。由于 NetBox 可以将全部代码最终发布成为应用程序，保护了开发人员的利益和代码的完整性。同时，NetBox 还可以方便地编写更多的桌面应用、系统服务器应用、定制网络应用等等。

运行环境要求

NetBox 的基本运行环境要求很低，最低要求只需要 Windows 98 或者 Windows NT + IE4 即可运行。而如果需要使用系统其他部件(比如 ado)，则需要根据系统情况，如果系统本身未缺省安装，需要自行安装。下面列出的是经过测试的所有系统平台：

Windows 98
Windows 98 SE
Windows ME
Windows NT+IE4
Windows 2000
Windows XP
Windows .NET Server

编程参考

  • 预处理指令参考
  • 已知错误
  • 常见问题
  • 对象参考

什么是 NetBox？
关于 NetBox 的简单介绍，帮助您尽快了解 NetBox 的概貌。

NetBox 步步高
按步骤一步一步地帮助你进行 NetBox 编程，从入门到高级编程。

调试脚本程序
全面介绍 NetBox 强大的调试手段，帮助您迅速修复程序中的错误。

发布 NetBox 应用
帮助您将应用发布成为运行版本，从而方便安全地部署在用户环境。

在线讨论与咨询
NetBox 讨论社区，由专业技术人员解答用户提问。

相关技术文章
收藏 NetBox 讨论社区中的精华文章，帮助您一览社区概貌。

更多信息
访问 NetBox 产品网站可以得到更多的产品信息。

版权所有: 2003-2004 网络盒子


NetBox 用户指南

NetBox 是一个使用脚本语言进行应用软件开发与发布的开发环境和运行平台，使用 NetBox，可以完全使用脚本语言(比如 VBScript，Javascript) 创建出稳定高效的应用软件，并且可以平滑移植到从 Windows 98 到 Windows .NET Server 的全部操作系统上。

相关内容

  • 什么是 NetBox？
  • NetBox 步步高
  • 调试脚本程序
  • 编译 NetBox 应用
  • 相关技术文章


什么是 NetBox？

NetBox 是一个使用脚本语言进行应用软件开发与发布的开发环境和运行平台，使用 NetBox，可以完全使用脚本语言(比如 VBScript，Javascript) 创建出稳定高效的应用软件，并且可以平滑移植到从 Windows 98 到 Windows .NET Server 的全部操作系统上。

NetBox 提供完全与操作系统无关的高性能的 HttpServer 对象，且完整支持 asp 服务器脚本技术，可以方便地将成熟的 asp 应用通过 NetBox 部署到各种操作环境，由于不再局限于操作系统的限制，甚至可以在 Windows XP 上达到超出 Windows 2000 Advance Server 的性能支持。

NetBox 还提供底层设备的支持，通过 NetBox 的内部对象 Socket 支持，可以方便地进行底层网络编程，NetBox 也提供高端对象的支持，通过使用 TcpServer，程序员可以提供高性能的多线程 Tcp 服务器，改变了 VBScript 和 Javascript 程序员不能进行低端编程的窘况。

NetBox 通过提供 Service 对象，使得 NetBox 应用得以安装成为系统服务，免除了人工干预运行之苦，通过以服务方式运行，应用软件可以在第一时间得到控制，并且不受用户登录退出的影响，从而提供更加稳定的服务。NetBox 同时提供了基于 Windows NT 技术的服务和基于 Windows 98 技术的服务，由同一套对象支持，使用方法完全相同，更加方便在不同操作系统下移植应用。

对于需要直接用户交互的软件，NetBox 提供了对控制台的访问支持，Console 对象提供了对控制台的简单支持，基本可以满足简单用户交互的需求。

对于需要复杂商业逻辑的应用，可以使用脚本部件进行逻辑封装，NetBox 支持直接使用微软 wsc 格式的脚本部件，极大方便多层应用的开发。

NetBox 可以以两种方式运行，开发模式和发布模式。在开发模式中，所有的脚本代码都是存放在 NetBox 所在的目录及其子目录中，以便于修改、调试。在最终软件发布时，出于版权考虑、代码安全考虑、代码完整性考虑等，可以将全部代码与运行环境使用 NetBox 专用的发布工具发布成为一个完全独立执行的发布版本，全部 NetBox 支持的脚本程序，包括主程序、asp 程序、wsc 对象，以及程序所引用的文件，包括 Include 文件、Web 应用所必须的静态文件等等，都可以全部被发布进这个文件，从而达到发布整个应用的目的。

相关内容

  • NetBox 的运行方式
  • NetBox 支持的文件格式
  • 创建与使用程序库


NetBox 的运行方式

NetBox 本身不提供集成开发环境，而是作为独立的运行环境存在， 同时 NetBox 也在代码层提供了充分的调试手段，以帮助开发人员迅速查找、修改程序中的错误。

执行 NetBox 时，首先进行的是 NetBox 的运行环境初始化工作。在初始化结束后，NetBox 查找发布时指定的初始化主程序。如果发现，则将其装载进 NetBox 脚本执行环境并执行，以后的运行将由主程序的具体程序决定。

如果 NetBox 在执行环境中没有找到任何的主程序，则自动进入一个简单的命令行解释程序。

main.box 是 NetBox 的主程序，在 main.box 中有两个内建对象，NetBox 和 Shell。NetBox 是基本内建对象。主要包含了 NetBox 的基本功能，包括装载运行库、创建对象、注册对象等等一系列常用操作。Shell 是程序的执行界面，通过对 Shell 的操作，可以使得 NetBox 程序以不同的方式执行，比如控制台程序，系统服务程序，超文本对话框等等。


NetBox 支持的文件格式

NetBox 是一个以脚本语言作为执行语言的开发系统，支持使用不同的文件格式来实现不同的需求，有以下三种格式：

box 文件

扩展名为 .box。是 NetBox 的主文件格式。在 NetBox 开始运行的时候，所执行的 main.box 就是这种格式的脚本文件。.box 文件是在简单的脚本程序文本文件的基础上，增加了少量的预处理指令(详见 # 指令参考(box 程序))。下面是一个简单的 .box 程序：

#language javascript
Shell.Console.WriteLine("Hello! JS");

这个程序使用预处理指令指定了脚本语言为 javascript。.box 文件可以在 HttpServer 中直接作为服务器脚本使用，也可以使用 Script 对象自行装载执行。在创建一个命令行解释程序一文中演示了如何根据用户的请求使用 Script 对象执行的 .box 外部程序。

asp 文件

扩展名为 asp。是 HttpServer 服务器脚本的主要格式，其格式与 iis 所支持的 asp 格式完全相同，特点是使用 <% 和 %> 标记脚本，而标记以外的部分为直接输出的字符。下面是一个简单的 asp 程序文件：

DATE: <%=Now()%>

与 box 文件不同，asp 文件只可以 HttpServer 服务器脚本运行。

wsc 脚本部件

扩展名为 wsc。是脚本部件的标准文件格式。.wsc 文件是一个以 xml 格式书写的脚本文件，除执行脚本部分以外，文件中还描述了脚本部件实现的方法、属性等。

在 NetBox 中，可以利用 NetBox 对象使用脚本部件，使用 RegisterClass 方法注册后可以使用 CreateObject 方法创建使用 wsc 脚本部件。也可以使用 ScriptObject 直接装载并取得脚本部件。


创建与使用程序库

在开发过程中，经常需要创建并发布一个程序库，以便于其他开发人员方便使用。通过使用程序库，可以将成熟的脚本部件共享给其他开发人员，也可以将一个成熟应用以模块方式提供给用户。NetBox 提供了强大的程序库管理功能，可以非常方便的实现这些需求。

NetBox 程序库可以以两种方式创建，一种是免费方式，另一种是授权方式。

免费程序库

免费程序库是一个允许免费使用的脚本部件集合，在免费程序库中，只允许有脚本部件 wsc 文件存在，NetBox 将在装载免费程序库时自动注册程序库中所有的脚本部件，程序可以在任何情况下直接使用免费程序库而没有任何功能的限制。

通过使用免费程序库，开发人员可以将自己开发成熟的一组脚本部件无偿的提供给别的开发人员，同时又不必担心自己的代码被别人修改抄袭。

授权程序库

授权程序库则比免费程序库更加灵活。在授权程序库中，可以包含 NetBox 支持的任何文件，所以可以直接将一个成熟的应用封装成为一个程序库，用户可以直接将其作为自己应用的一个模块使用。授权程序库的初始化也更加灵活，NetBox 在装载授权程序库时会在程序库的根目录中查找 main.box 文件，与 NetBox 主程序不同，这里的 main.box 是程序库的初始化主程序。在 NetBox 查找到 main.box 以后，将装载 main.box 并由其完成程序库的初始化工作。所以授权程序库中如果包含的脚本部件，则必须自行在程序库的 main.box 中进行初始化工作，否则将无法使用。

授权程序库与免费程序库的区别特征在于程序库中是否有初始化程序 main.box。如果发现，则为授权程序库，否则为免费程序库。

程序库的使用

程序库的使用方法非常简单，只需要使用 NetBox 对象的 Loadlibrary 方法装载程序库即可。例如如果从某处得到一个免费程序库，可以用于计算两个数的和(呵呵，当然只是一个假设，这么简单的东西没有必要这么累)，装载并使用的代码可能是这样的：

NetBox.LoadLibrary "\AddTest.nbl"
......

Set AddObj = CreateObject("My.AddClass")
ret = AddObj.Add(100, 200)

又例如你从别处得到一个聊天室的模块，可以帮助你建立一个 WEB 聊天室(酷啊......)，当然没有免费的中午饭啦，这是一个授权程序库。则可能的使用方法是这样的：

NetBox.LoadLibrary "\webchat.nbl"
......

Set chatsvr = CreateObject("My.chatserver")
chatsvr.Start

当然上面的例子都只是假设而已，具体的程序库使用方法，你还需要向程序库使用者索取使用手册，不同的实现方式使用方法也是不同的。比如那个聊天室的例子，还有一种可能的实现是程序库只是提供了聊天室所需要的全部 asp 程序，你要做的只是将某个目录设定成 web 服务器的目录而已。


NetBox 步步高

为了使您能够尽快熟悉 NetBox 的编程方法和常用技巧，下面组织了一组编程教程，按步骤建立了一组常用功能，从第一个最简单的程序，到较复杂的多层应用，几乎跨越了 NetBox 各种编程模式。

相关内容

  • 第一个 NetBox 程序
  • 在 NetBox 中使用对象
  • NetBox 的路径系统
  • 创建一个命令行解释程序
  • 创建一个 WEB 服务器
  • Windows 脚本部件
  • 远程访问的命令行解释器
  • 基于事件实现数据库事务处理
  • 创建可扩展的应用模型


第一个 NetBox 程序

NetBox 程序的执行以 main.box 最为主程序名，执行的目录即为执行程序所在的目录。NetBox 的执行程序在初始化完毕，既查找 main.box 文件，如果找到，则进行装载并运行。下面我们按步骤建立第一个新的 NetBox 程序。

第一步：准备环境

在你愿意的位置创建一个新的目录，比如：

d:\hello

第二步：编写主程序

使用任何一个文本编辑软件(你当然可以使用 Notpad)新建一个文件，输入下面的代码：

Shell.Console.WriteLine "Hello!!"
Shell.Console.ReadLine

将文件存在刚才的目录下，命名为 main.box。

这时双击此文件开始运行，会发现控制台窗口停留在屏幕上面，回车后便消失。至于控制台所显示的内容，相信你猜得出来，是：

Hello!!

第三步：进阶

既然已经得到想要的内容，那么我们开始来修改这个小程序，让它有机会更快。修改 main.box 为下面的内容：

Set Console = Shell.Console
Console.WriteLine "Hello!!"
Console.ReadLine

在这段代码里面，我先用 Console 得到 Shell.Console 对象，后面的操作直接使用 Console 而不是 Shell.Console，据说这样可以提高执行速度，经过测试，的确也是如此。

总结

到现在为止，我们已经有了第一个 NetBox 程序。


在 NetBox 中使用对象

NetBox 中提供了大量辅助功能帮助创建你的应用，这些功能是以 NetBox 内部功能的形式出现的。同时，通过创建脚本部件，你也可以自行扩展 NetBox 的对象，象使用 NetBox 内部对象一样使用您自己的脚本对象。

NetBox 对象

首先要介绍的是 NetBox 对象。NetBox 对象是 NetBox 全局对象，包含用于存放全局数据，对全局数据加锁和解锁，读取系统信息，和其他常用功能。NetBox 对象在脚本对象、主运行程序 main.box、Http 服务器脚本、TCP 服务器响应脚本都可以直接引用。在 HTML 对话框等不能直接访问内建对象的环境中，可以使用下面的 VBScript 语句自行创建：

Set NetBox = CreateObject("NetBox")

或者下面的 Javascript 语句：

var NetBox = new ActiveXObject("NetBox");

关于 NetBox 对象的更多信息，可以参阅 NetBox 对象的详细参考。

Shell 对象

在 NetBox 主运行程序 main.box 中，可以使用 Shell 对象来创建不同形式的应用。比如控制台界面、系统服务程序、HTML 对话框，以及创建多种系统通用对话框等功能。

Shell 对象通常用来创建不同形式的应用程序，所以一般情况下只是在主运行程序 main.box 中使用。而如果需要在其他环境中使用 Shell 对象，比如需要在 HTML 对话框中显示一个打开文件的对话框，则可以使用下面的 VBScript 语句自行创建：

Set Shell = CreateObject("Shell")

或者下面的 Javascript 语句：

var Shell = new ActiveXObject("Shell");

关于 Shell 对象的更多信息，可以参阅 Shell 对象的详细参考。

HTTP 服务器脚本中的内建对象

在 HTTP 服务器脚本中，可以直接引用一些内建对象：

  • NetBox
  • Request
  • Response
  • Server
  • Application
  • Session
这些对象用于访问用户数据和返回结果详细的对象可以参考其相应的对象参考。

可创建对象

除各种运行状态的内建对象以外，NetBox 还提供了大量的可创建对象用于构建功能强大的应用软件。详细的对象参考可以查询对象参考。

一般情况下，可以使用 NetBox 对象的 CreateObject 方法创建对象，比如，我们需要创建一个二进制文件对象，可以使用下面的语句：

Set bin = NetBox.CreateObject("NetBox.File")

或者如果是 Javascript 的话使用下面的语句：

var bin = NetBox.CreateObject("NetBox.File");

如果在 HTTP 服务器脚本程序中，为了兼容，也提供了 Server 对象的 CreateObject 方法，同样的，可以用下面的方法创建二进制文件对象：

Set bin = Server.CreateObject("NetBox.File")

或者如果是 Javascript 的话使用下面的语句：

var bin = Server.CreateObject("NetBox.File");

其效果完全等同于使用 NetBox 对象的 CreateObject 方法创建对象。

最后一种方法，也是最方便通用的一种方法是直接使用脚本语言内含的创建方法创建对象，可以在任何脚本状态使用。比如：

Set bin = CreateObject("NetBox.File")

或者如果是 Javascript 的话使用下面的语句：

var bin = new ActiveXObject("NetBox.File");

上面的三种对象的创建方式功能完全相同，可以任意选择使用自己习惯的方式。

脚本对象

除了使用 NetBox 提供的对象以外，你还可以自行创建并注册使用自己的对象，方法就是使用脚本对象技术。与此相关的细节，可以参考Windows 脚本部件。


NetBox 的路径系统

为了方便调试与发布，NetBox 定义了一套不同与操作系统的虚拟路径管理系统。在 NetBox 中，除了直接的文件访问对象（比如 File 对象和 FileSystemObject）外，其他的路径系统都是以 NetBox 运行目录为根目录的，所有试图超越根目录向上级目录的访问都将被限制在根目录上面，此类路径的使用，可以在手册中找到大量的例子。

一、执行方式

NetBox 中大部分应用都是以此方式运行。当以执行方式运行时，NetBox 以应用程序内部优先的方式打开文件。当同一个文件，应用程序内部和磁盘文件都有此文件时，将打开应用程序内部文件用于操作。

在 NetBox 中涉及到此类路径的有下面的对象：

  • #include 预处理指令
  • HttpServer 对象的 AddHost 方法
  • HttpServerHost 对象的 AddFolder 方法、EventSink 属性
  • JobServer 对象的 Create 方法
  • TcpServer 对象的 Create 方法
  • NetBox 对象的 LoadObject 方法、LoadLibrary 方法、RegisterClass 方法
  • Response 对象的 MapToFile 方法
  • Script 对象的 Load 方法
  • ScriptObject 对象的 Load 方法

二、只读方式

当需要直接访问应用程序内部文件，比如初始化数据等，可以使用只读方式打开应用程序内部文件，NetBox 中 File 对象和容器对象的装载方法 Load 方法都是以此方式运行。当以只读方式运行时，NetBox 同样以应用程序内部优先的方式打开文件。当同一个文件，应用程序内部和磁盘文件都有此文件时，将打开应用程序内部文件用于操作。应用程序内部的可执行脚本将不可读。

在 NetBox 中涉及到此类路径的有下面的对象：

  • Dictionary 对象的 Load 方法
  • File 对象的 Open 方法
  • List 对象的 Load 方法
  • Queue 对象的 Load 方法

三、文件方式

通常情况下，使用 NetBox 的路径系统可以满足大部分需求，有些时候，可能希望从 NetBox 的虚拟路径系统映射到系统路径，此时可以使用 NetBox 对象的 MapPath 方法来转换路径。经过转换的文件名即可直接传递给支持此类路径的对象使用。当使用文件方式运行时，NetBox 将优先访问系统中的文件，如果文件存在，则直接访问文件。如果文件不存在，则在应用程序内部查找与其对应的资源，然后根据应用的打开方式，或者创建临时文件，或者创建同名文件，复制数据后返回给应用。

上一节只读方式的对象全部支持此种方式。几乎所有的第三方对象也是以此种方式访问文件。比如 Scripting.SystemFileObject，ADO 访问 MDB 数据库，等等。

由于此方式对用户透明，所以可以用于大量场合。最典型的例子是可以直接将初始化 mdb 数据库直接编译进应用程序，当使用 ado 第一次访问此数据库时，NetBox 将自动取出初始化数据库用于访问。

四、URL 方式

NetBox 虚拟路径内的文件也可以在 Netbox 环境中使用 netbox: 协议直接访问，以便于创建基于 HTML 界面的桌面应用程序。比如在 netbox 运行路径中有一个文件：\wwwroot\default.htm，使用 netbox: 协议访问时的路径就是：netbox:/wwwroot/default.htm。需要注意的是作为 netbox: 协议的路径分割符是“/”而不是“\”。当使用 url 方式访问时，所有的执行方式和执行权限都与只读方式相同。

可以使用 netbox: 协议的对象有下面这些：

  • HtmlWindow 对象的 Open 方法

除此之外，只读方式的所有的对象也全部支持此方法。同时，HtmlWindow 窗口中运行的 HTML 和也都以这种方式访问应用程序资源。


创建一个命令行解释程序

Netbox 提供了实现命令行解释器所需的全部支持，使用 Console，可以得到对控制台的控制，使用 Arguments，可以对用户的输入进行解释，使用 Script，可以根据用户的输入执行相应的脚本程序。

下面，我们用这些对象一步一步的创建一个完整的命令行解释器。我首先假设你已经了解了如何书写 NetBox 代码并运行，与此相关的信息请参阅“什么是 NetBox？”。

第一步：控制台

书写下面的代码，我们来建立一个用户输入的响应程序，所做的响应还比较简单，仅仅回显而已：

Set Console = Shell.Console

Do While true
    strCommand = Console.ReadLine
    Console.WriteLine strCommand
Loop

这段代码比较笨拙，运行起来只是呆板的接受输入并显示出来，没有任何提示，也无法退出，只能关闭窗口或按 Ctrl+C 退出程序，下面我们修改一下代码，增加退出的指令 exit，并增加一个提示符号：

Set Console = Shell.Console

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    Console.WriteLine strCommand
Loop

再运行这段代码，会发现显示和退出都变得友好起来。然而只有友好是没有用的，下面我们开始处理用户的输入信息。

第二步：命令行

使用 Arguments 对象，我们可以将刚才读入的命令行字符串进行进一步的处理，同时显示第一个参数。

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand
    Console.WriteLine SubArgs(0)
Loop

现在，我们已经能够将用户输入的命令中的执行程序部分分离出来，如果还想查看用户输入的全部参数清单，可以修改为下面的代码：

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand
    For i = 0 To SubArgs.Count - 1
        Console.WriteLine SubArgs(i)
    Next
Loop

接下来，我们需要对用户输入的执行程序名称进行格式统一，如果用户输入的执行程序未包含了完整路径名(扩展名为 .box)，则自动在名称后面添加 .box 扩展名。

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand

    If SubArgs.Count > 0 Then
        strExecFile = SubArgs(0)
        If LCase(Right(strExecFile, 4)) <> ".box" Then
            strExecFile = strExecFile + ".box"
        End If

        Console.WriteLine strExecFile
    End If
Loop

第三步：执行程序

在取得用户输入命令行中的执行代码部分以后，便可以对其进行装载和运行，这些操作都使用 NetBox.Script 对象，继续修改代码，增加脚本部分的操作：

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand

    If SubArgs.Count > 0 Then
        strExecFile = SubArgs(0)
        If LCase(Right(strExecFile, 4)) <> ".box" Then
            strExecFile = strExecFile + ".box"
        End If

        Set Script = CreateObject("NetBox.Script")

        e = Script.Load(strExecFile)
        If e = 0 Then
            Script.SetGlobalObjects

            e = Script.Run
        End If

        Set Script = Nothing
    End If
Loop

接下来创建一个新的 Script 对象，装载刚才已经格式化了的执行程序名所指定的文件，如果成功，则使用 SetGlobalObjects 将当前的内建对象传递给新的脚本程序，然后开始执行。此时，你可以在 NetBox 执行目录建立一个新的程序文件，比如名字叫做 test.box，输入下面的代码：

Shell.Console.WriteLine "Hello! Box."

Sub OnScriptError
    Shell.Console.WriteLine "OnScriptError"
End Sub

Sub OnScriptEnd
    Shell.Console.WriteLine "OnScriptEnd"
End Sub

执行 NetBox.exe 并输入 test，哈，我们的命令行解释器已经开始工作了。

第四步：错误捕捉

上面的程序，执行的时候会发现一些问题，比如如果用户输入了一个不存在的文件，程序将不显示任何内容，而且如果程序编译出错或者运行出错，也不会有任何提示。这就需要我们再进一步改进程序。首先解决文件不存在的问题。

通过查阅手册，我们知道 Load 方法在装载失败时会返回两种结果，一个是 404，另一个是 500。404 表示的是文件未找到，而 500 则表示装载时错误，可以具体查询。所以我们可以很方便时识别是否是文件未找到。继续修改代码如下：

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand

    If SubArgs.Count > 0 Then
        strExecFile = SubArgs(0)
        If LCase(Right(strExecFile, 4)) <> ".box" Then
            strExecFile = strExecFile + ".box"
        End If

        Set Script = CreateObject("NetBox.Script")

        e = Script.Load(strExecFile)
        If e = 0 Then
            Script.SetGlobalObjects

            e = Script.Run
        End If

        If e = 404 Then
            Console.WriteLine "Bad Command"
        End If

        Set Script = Nothing
    End If
Loop

此时，如果用户输入了一个不存在的程序名，则我们的解释器会友好的现实 “Bad Command”，然而程序中的错误还是不能捕捉，继续查阅手册，我们知道 Script 对象有一个 GetLastError 方法，可以取得详细的错误信息，于是我们的代码修改成为下面的样子：

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand

    If SubArgs.Count > 0 Then
        strExecFile = SubArgs(0)
        If LCase(Right(strExecFile, 4)) <> ".box" Then
            strExecFile = strExecFile + ".box"
        End If

        Set Script = CreateObject("NetBox.Script")

        e = Script.Load(strExecFile)
        If e = 0 Then
            Script.SetGlobalObjects

            e = Script.Run
        End If

        If e = 404 Then
            Console.WriteLine "Bad Command"
        ElseIf e <> 0 Then
            Set error = Script.GetLastError
            Console.WriteLine error.Category
            Console.WriteLine "Error Number: " & Hex(error.Number)
            Console.WriteLine "File: " & error.File
            Console.WriteLine "Line: " & error.Line
            Console.WriteLine error.Description & vbCRLF
            Set error = Nothing
        End If

        Set Script = Nothing
    End If
Loop

上面的代码中，在确定不是文件未找到以后，再查看是否出错，如果出错，则使用 GetLastError 方法取得脚本的详细错误信息，然后依次输出。

第五步：内建对象

在第四步中，我们调用了 SetGlobalObjects 方法传递自己的内建对象给新的脚本运行环境。这样以来我们实际上是将两个对象 NetBox 和 Shell 传递给了新的脚本环境，这样是不够的，比如用户输入了“print Hello”，这样的命令，实际上是希望执行 print.box，并且将参数传递给它的。所以在下面的代码里面，我们使用 AddNameItem 方法添加内建对象 Arguments。

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand

    If SubArgs.Count > 0 Then
        strExecFile = SubArgs(0)
        If LCase(Right(strExecFile, 4)) <> ".box" Then
            strExecFile = strExecFile + ".box"
        End If

        Set Script = CreateObject("NetBox.Script")

        e = Script.Load(strExecFile)
        If e = 0 Then
            Script.SetGlobalObjects
            Script.AddNameItem "Arguments", SubArgs

            e = Script.Run
        End If

        If e = 404 Then
            Console.WriteLine "Bad Command"
        ElseIf e <> 0 Then
            Set error = Script.GetLastError
            Console.WriteLine error.Category
            Console.WriteLine "Error Number: " & Hex(error.Number)
            Console.WriteLine "File: " & error.File
            Console.WriteLine "Line: " & error.Line
            Console.WriteLine error.Description & vbCRLF
            Set error = Nothing
        End If

        Set Script = Nothing
    End If
Loop

这样，我们的新的脚本环境就有三个内建对象，NetBox，Shell，Arguments。其中 NetBox 就是我们的基本对象，Shell 是 Shell 的引用，Arguments 则是根据用户输入建立的参数对象。

总结

在这里，我们通过一个完整实用的命令行解释器的实现过程，展示了 Console，Arguments，Script 三个对象的具体使用，涉及到的属性与方法，可以参考对象手册中的讲解进行对照。同时，命令行解释器的实现，也扩充了 NetBox 的执行方式，可以随意执行给定的 .box 程序，方便了对其他对象的学习与调试。


创建一个 WEB 服务器

NetBox 的一大功能就是内置支持了 HttpServer 和 asp。下面就按步骤建立一个以服务方式运行的 WEB 服务器。

第一步：创建 WEB 服务器

由于 NetBox 提供了 HttpServer 对象，所以建立一个新的 HttpServer 并且启动、停止、退出，自然便是由 HttpServer 对象来实现，main.box 的代码也就比较简单了：

Set Console = Shell.Console
Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then
    httpd.Start

    Console.ReadLine

    httpd.Stop
    httpd.Close
End If

Set httpd = Nothing

在上面的代码中，先创建一个新的 HttpServer，然后在所有的本机地址的 80 端口创建一个服务器，如果创建成功，则启动服务器，等待用户在控制台上输入回车后停止并关闭服务器。

运行这个程序，如果当前系统中未安装其他 Web 服务器，则此程序会显示控制台并等待回车，否则将直接退出。呵，我们的第一个程序都是很拙劣的。没有关系，我们一步一步来。

如果成功运行了程序，便可以用浏览器访问了，由于服务器装在本机，所以打开浏览器，在地址栏输入“http://localhost/”，哈，结果出来了，不过很不好看：

418 Host Not Found

不管想访问什么，都只会是这个结果。这样的结果显然不能满足要求，所以我们需要改进我们的 Web 服务器。

第二步：添加虚拟主机

前面我们建立的服务器之所以总是返回禁止访问，原因是没有为服务器建立主机信息。所以我们修改代码，使用 AddHost 方法增加主机信息的部分：

Set Console = Shell.Console
Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then
    httpd.AddHost "", "\wwwroot"
    httpd.Start

    Console.ReadLine

    httpd.Stop
    httpd.Close
End If

Set httpd = Nothing

在 NetBox 执行目录建立一个子目录 wwwroot，然后复制一些网页进去。我们再来看看效果如何。执行程序并再次访问“http://localhost/”，结果居然还是“403 Forbidden”。再访问 wwwroot 目录中已有的文件，哈哈，出现正确内容了。所以，实际上主机已经建立出来，但是未给主机提供缺省文件名。

第三步：添加缺省文件

为了让主机知道当用户访问目录时向用户返回的文件，需要使用 AddDefault 方法为主机添加缺省文件名，修改代码如下：

Set Console = Shell.Console
Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then
    Set host = httpd.AddHost("", "\wwwroot")

    host.AddDefault "default.htm"

    httpd.Start

    Console.ReadLine

    httpd.Stop
    httpd.Close
End If

Set httpd = Nothing

我们再访问“http://localhost/”的时候，会发现不再显示禁止访问，而是开始出现了缺省页面的内容。如果给定的缺省文件不存在，则返回“404 File Not Found”。

第四步：支持服务器脚本

上面的步骤建立出来的 Web 服务器，是一个纯静态文件的服务器，是无法执行服务器脚本程序的，为了让我们的 Web 服务器能够理解服务器端脚本程序，需要修改 EnableScript 属性，同时为了让服务器能够使用脚本程序做为缺省文件，还需要再添加一个缺省文件，下面是新修改的代码：

Set Console = Shell.Console
Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then
    Set host = httpd.AddHost("", "\wwwroot")

    host.EnableScript = true
    host.AddDefault "default.asp"
    host.AddDefault "default.htm"

    httpd.Start

    Console.ReadLine

    httpd.Stop
    httpd.Close
End If

Set httpd = Nothing

接下来，我们就可以在 wwwroot 目录里建立我们的 asp 脚本程序了，建立 test.asp：

<%Response.Write "Hello"%>

NetBox 也支持服务器 box 程序，在 wwwroot 目录中建立 test.box：

Response.Write "Hello"

第五步：以服务方式运行

到目前为止，已经有一个相对完整的 Web 服务器程序了，下面我们需要将这个服务器改写为系统服务程序，可以将其安装成为一个系统服务，更加便于运行维护。改写成为服务程序需要使用 Service 对象。

下面便是一个完整的 Web 服务程序的代码，关于 Service 对象的更多信息请参阅手册相关内容。

Dim httpd

Shell.Service.RunService "NBWeb", "NetBox Web Server", "NetBox Http Server Sample"

'---------------------- Service Event ---------------------

Sub OnServiceStart()
    Set httpd = CreateObject("NetBox.HttpServer")

    If httpd.Create("", 80) = 0 Then
        Set host = httpd.AddHost("", "\wwwroot")

        host.EnableScript = true
        host.AddDefault "default.asp"
        host.AddDefault "default.htm"

        httpd.Start
    else
        Shell.Quit 0
    end if
End Sub

Sub OnServiceStop()
    httpd.Close
End Sub

Sub OnServicePause()
    httpd.Stop
End Sub

Sub OnServiceResume()
    httpd.Start
End Sub

总结

实现一个完整的 Web 服务程序，需要 HttpServer，HttpServerHost，Service 三个对象的支持，HttpServer 负责建立服务器并控制服务器的运行状态，HttpServerHost 负责建立主机信息， Service 则负责完成与服务程序相关的操作。


Windows 脚本部件

NetBox 内置对 Windows 脚本部件的支持。Windows 脚本部件是一项令人激动的技术，使用 Windows 脚本部件，你可以方便的使用脚本技术创建 COM 部件，从而封装商务逻辑， 实现多层开发。普通的 Windows 脚本部件的实现是基于微软的脚本部件运行时程序 (Scrobj.dll)实现，而 NetBox 的实现 则完全是内置的支持实现，完全与微软技术无关，独立的实现导致了运行环境的无关，所以 NetBox 甚至可以在 Windows 98 第一版 上支持 Windows 脚本部件。

同时，NetBox 还针对不同的需求增强了脚本部件的功能，从而可以构造出使用更加方便，效率更高的组件。

相关内容

  • 使用 Windows 脚本部件
  • 在脚本部件中使用可选参数
  • 创建全局的脚本部件


使用 Windows 脚本部件

NetBox 内置对 Windows 脚本部件的支持。Windows 脚本部件是一项令人激动的技术，使用 Windows 脚本部件，你可以方便的使用脚本技术创建 COM 部件，从而封装商务逻辑， 实现多层开发。普通的 Windows 脚本部件的实现是基于微软的脚本部件运行时程序 (Scrobj.dll)实现，而 NetBox 的实现 则完全是内置的支持实现，完全与微软技术无关，独立的实现导致了运行环境的无关，所以 NetBox 甚至可以在 Windows 98 第一版 上支持 Windows 脚本部件。

第一步：书写 wsc 文件

在这里，假设你已经有书写 wsc 文件的经验。如果您并不熟悉，可以参考微软的技术说明 Windows Script Components。首先书写一个简单的 wsc 文件并存放于 NetBox 根目录或者其子目录中。比如创建一个 class\test.wsc 文件，其内容如下：

<?xml version="1.0"?>
<component>
    <registration description="test" progid="NetBox.test"
        classid="{5beeff5e-368c-4015-9ccd-077cb5a2946d}"/>
    <public>
        <method name="Test"/>
    </public>
    <script language="VBScript">
<![CDATA[

Function Test(a, b)
    Test = a + b
End Function

]]></script>
</component>

可以看出，此处的 wsc 格式和语法与普通的 wsc 代码没有任何不同。需要说明的是，progid 和 classid 用于唯一标识不同的脚本部件，所以在编写脚本部件的时候务必使用不同的 progid 和 classid。

第二步：注册

普通的 wsc 文件可以使用 regsvr32 进行注册，然后便可在任何程序中创建对象。而 NetBox 的注册则与此不同，因为 NetBox 独立实现了脚本部件，所以 NetBox 注册 wsc 文件与系统完全无关，而是使用 NetBox 对象的 RegisterClass 方法。以上面的代码为例，注册的代码如下：

NetBox.RegisterClass "\class\test.wsc"

为了正常创建 wsc 对象，必须在第一次创建对象之前注册 wsc 文件，一般建议在主程序 main.box 的最开始进行注册。

第三步：创建对象

经过注册的 wsc 文件可以在整个 NetBox 过程的所有脚本中创建使用。可以使用 NetBox 对象的 CreateObject 方法来创建注册的部件。以上面的代码为例，可以使用下面的代码创建一个实例：

Set o = CreateObject("NetBox.test")

如果是在 HttpServer 的服务器脚本程序中使用 wsc 对象，也可以使用 Server 对象的 CreateObject 方法。方法与上面的完全相同：

Set o = Server.CreateObject("NetBox.test")

同样，你也可以使用 VBScript 的 CreateObject 方法直接创建：

Set o = CreateObject("NetBox.test")


在脚本部件中使用可选参数

前言

在实际应用中，创建、使用可选参数，可以很大程度上使得函数的使用更加方便。我们可以考察下面的例子：

Sub Test(p1, p2, p3)
    Shell.Console.WriteLine VarType(p1) & ", " & VarType(p2) & ", " & VarType(p3)
End Sub

Test 1, 2, 3
Test 1, , 3
Test , , 3
Test 1, 2

在上面的代码中，我们创建了一个子程序 Test，并且设定了三个参数 p1、p2、p3，然后分别以不同的方式调用这个子程序，来察看不同情况下的参数传递情况。运行这个程序，可以看到下面的运行结果：

2, 2, 2
2, 10, 2
10, 10, 2

Microsoft VBScript runtime error
Error Number: 800A01C2
File: \test.box
Line: 8
Description: Wrong number of arguments or invalid property assignment: 'Test'

在运行的结果中，我们稍加比较，便可以发现，凡是在调用子程序时传递了整数的位置，都输出的变量类型为 2(vbInteger)，而未传递参数的位置则变量类型则为 10(vbError)。然而在我们希望省略最后一个参数的时候出了麻烦，VBScript 报告了一个错误，说是错误的参数个数。

是的，这是 VBScript 的局限，在调用子程序或者函数时只允许省略除最后一个参数以外的参数。于是我们没有办法利用 VBScript 构建出一个使用方便的子程序或者函数。

实现

在实现 NetBox 的 wsc 脚本部件的时候，我们充分考虑了这种需求，并给出了解决方案。脚本部件的创建者可以创建出允许随意省略参数的方法，极大方便了脚本部件的可用性。我们可以察看下面的脚本部件代码：

<?xml version="1.0"?>
<component>
    <registration description="test" progid="NetBox.test"
        classid="{5beeff5e-368c-4015-9ccd-077cb5a2946d}"/>
    <public>
        <method name="Test"/>
    </public>
    <script language="VBScript">
<![CDATA[

Sub Test(p1, p2, p3)
    Shell.Console.WriteLine VarType(p1) & ", " & VarType(p2) & ", " & VarType(p3)
End Sub

]]></script>
</component>

我们实现了和刚才同样的子程序，不同的是在 wsc 脚本部件中实现的，并且在描述中声明了 Test 方法引出了这个子程序。下面我们创建一个脚本注册并测试这个脚本部件：

NetBox.RegisterClass "\test.wsc"

Set t = CreateObject("NetBox.Test")

t.Test 1, 2, 3
t.Test 1, , 3
t.Test , , 3
t.Test 1, 2

再运行这段代码，并察看结果：

2, 2, 2
2, 10, 2
10, 10, 2

Microsoft VBScript runtime error
Error Number: 800A01C2
File: \test.box
Line: 8
Description: Wrong number of arguments or invalid property assignment: 't.Test'

哈哈，输出了几乎更刚才同样的结果。当然了，原因是没有描述参数个数，脚本部件不能正确处理所传递的参数。我们修改脚本部件，增加参数描述部分：

<?xml version="1.0"?>
<component>
    <registration description="test" progid="NetBox.test"
        classid="{5beeff5e-368c-4015-9ccd-077cb5a2946d}"/>
    <public>
        <method name="Test">
            <parameter name="p1"/>
            <parameter name="p2"/>
            <parameter name="p3"/>
        </method>
    </public>
    <script language="VBScript">
<![CDATA[

Sub Test(p1, p2, p3)
    Shell.Console.WriteLine VarType(p1) & ", " & VarType(p2) & ", " & VarType(p3)
End Sub

]]></script>
</component>

在上面的代码中，我们在描述 Test 方法的时候为其描述了参数，根据描述，脚本部件引擎便可以清楚的了解这个方法所需要的参数情况，在引用这个方法的时候，引擎就会根据这个情况对调用参数进行处理，以满足实际的参数情况。我们可以再执行测试程序察看结果：

2, 2, 2
2, 10, 2
10, 10, 2
2, 2, 10

耶！

再进一步

单纯的省略参数没有什么意义的，但是我们可以利用省略参数创建出令人激动的程序来。比如下面的代码：

...
Sub Test(p1, p2, p3)
    If VarType(p3) = 10 Then p3 = "This is a default string."
    ...
End Sub
...

这样，当我们调用此方法并省略了 p3 的时候，便是表示 p3 使用缺省值“This is a default string.”。另外一种运用是下面的方式：

...
Sub Test(p1, p2, p3)
    If VarType(p3) = 10 Then
        Test2 p1, p2
    Else
        Test3 p1, p2, p3
End Sub
...

我们可能在发现用户只传递了两个参数的时候和传递了三个参数的时候分别调用两个完全不同的子程序以完成不同的动作，从而利用同样的方法命名实现完全不同的功能。

总结

省略参数和缺省参数是一项令人激动的技术，可以让应用更加方便易用，轻易的创建专业的脚本对象。


创建全局的脚本部件

出于性能等多方面考虑，NetBox 是在宿主线程内创建脚本部件的，对脚本部件的访问全部在一个线程内完成。这样的实现，在很大程度上提高了程序运行速度，也符合绝大多数应用的需求，大部分应用都是在一个线程中完成对象的创建，对象的使用，和对象的销毁的。

由于这样的实现方式，你将不可能将一个脚本部件作为全局对象使用，以一个流水号生成器为例，我们可能需要一个每次访问都生成一个新的序号，并且能够为所有的 asp 直接访问的对象。此时，直接使用脚本部件就需要比较复杂的部件逻辑。为了满足这种需要全局访问的需求，NetBox 提供了创建全局脚本对象的方法。

要创建全局的脚本部件，可以使用 NetBox 对象的 LoadObject 方法。使用 LoadObject 方法，你可以自行装载一个脚本部件而无须在 NetBox 中注册它。

在 LoadObject 方法的调用参数中，有一个可选参数 varGlobal，描述为：指定是否在全局线程装载对象，缺省为 False，为私有对象。我们以上面的流水号生成器为例，可能的脚本部件 genid.wsc 代码如下：

<?xml version="1.0"?>
<component>
    <public>
        <method name="GetID"/>
    </public>
    <script language="VBScript">
<![CDATA[

Dim GlobalID
GlobalID = 0

Function GetID
    GlobalID = GlobalID + 1
    GetID = GlobalID
End Function

]]></script>
</component>

上面是一个非常简单的流水号生成器，因为我们将以全局方式装载这个对象，所有的访问都将在一个全局线程中完成，所以不需要考虑多线程访问的问题。

在初始化应用程序时，我们需要装载这个脚本部件到全局，并且将对象保存到全局物体，比如 NetBox 对象或者 Application 对象中，比如在 main.box 中，我们可以这样装载：

Set NetBox("GenID") = LoadObject("genid.wsc", true)

通过上面的装载，我们将可以在任何地方取得这个对象并且直接访问：

id = NetBox("GenID").GetID

通过上面的例子我们可以了解全局脚本部件的使用方法和用处。需要注意的是，所有以全局方式装载的脚本部件都是在同一个全局线程中运行的，所以尽量不要在全局脚本部件中执行耗时较长的操作，比如访问数据库等。

参考

NetBox 对象，LoadObject 方法


远程访问的命令行解释器

NetBox 支持一个内建的 TcpServer 对象，可以方便的支持多用户网络应用，下面，我们使用 TcpServer 对象创建一个 Telnet 服务器，在 23 端口接受 telnet 请求，并将前面我们创建的命令行解释器移植到 Telnet 服务器中，以便通过远程访问命令行解释器。关于命令行解释器的建立可以参考创建一个命令行解释程序。

第一步：创建 TCP 服务器

NetBox 提供了 TcpServer 对象用于创建高性能的网络服务器。TcpServer 是 HttpServer 的基础，创建方法也基本相同。不同的是 HttpServer 对象自身实现了连接响应部分，而 TcpServer 则需要自行编程实现连接的接受部分。下面的代码在 23 端口创建一个将连接响应指向 accept.wsc 的 TcpServer 实例，并启动服务器：

Set TcpServer = CreateObject("NetBox.TcpServer")
TcpServer.Create "", 23, "\Accept.wsc"
TcpServer.Start

这段代码创建了 TcpServer 对象，并没有实现连接接受的部分，只是告诉 TcpServer 连接响应由 accept.wsc 实现。下面我们将来实现这部分代码。

第二步：连接响应

TcpServer 的连接响应由一个脚本部件实现，与普通的脚本部件并无不同，只是此脚本部件不需要在系统或者 NetBox 中进行注册，TcpServer 会自行装载。在脚本部件中，需要提供一个方法 OnAccept，其格式如下：

Function OnAccept(Socket, Contents)
...
End Function

当 TcpServer 接受到连接请求时，将自动加载此脚本部件，调用 OnAccept 方法，并传递接受的 Socket 请求及相关信息。下面就是一个完整的 TCP 连接响应脚本部件：

<?xml version="1.0"?>
<component>

<public>
    <method name="OnAccept"/>
</public>

<script language="VBScript">
<![CDATA[
Function OnAccept(Socket, Contents)
    Socket.Echo = true

    Do While Not Socket.Eof
        Socket.WriteLine Socket.ReadLine
    Loop
End Function
]]>
</script>

</component>

这个脚本部件接受到 Socket 以后，先打开 Socket 对象的 Echo 属性，自动回送接受的字符。然后进入循环，逐行回显输入的信息。

第三步：加入命令行处理

下面，我们需要把前面的脚本部件和我们以前建立的命令行解释器合并在一起，合并的过程并不复杂，只需要将命令行解释器中使用的 Shell.Console 更改为 Socket 便可，具体代码如下：

<?xml version="1.0"?>
<component>

<public>
    <method name="OnAccept"/>
</public>

<script language="VBScript">
<![CDATA[
Function OnAccept(Socket, Contents)
    Socket.Echo = true

    Set Console = Socket
    Set SubArgs = CreateObject("NetBox.Arguments")

    Do While True
        Console.Write "#"
        strCommand = Console.ReadLine
        If LCase(strCommand) = "exit" Then Exit Do
        SubArgs.CommandLine = strCommand

        If SubArgs.Count > 0 Then
            strExecFile = SubArgs(0)
            If LCase(Right(strExecFile, 4)) <> ".box" Then
                strExecFile = strExecFile + ".box"
            End If

            Set Script = CreateObject("NetBox.Script")

            e = Script.Load(strExecFile)
            If e = 0 Then
                Script.AddNameItem "NetBox", NetBox
                Script.AddNameItem "Console", Console
                Script.AddNameItem "Arguments", SubArgs

                e = Script.Run
            End If

            If e = 404 Then
                Console.WriteLine "Bad Command"
            ElseIf e <> 0 Then
                Set error = Script.GetLastError
                Console.WriteLine error.Category
                Console.WriteLine "Error Number: " & Hex(error.Number)
                Console.WriteLine "File: " & error.File
                Console.WriteLine "Line: " & error.Line
                Console.WriteLine error.Description & vbCRLF
                Set error = Nothing
            End If

            Set Script = Nothing
        End If
    Loop
End Function
]]>
</script>

</component>

总结

本文以一个完整的远程访问命令行解释器的实现，演示了 TcpServer，Socket 两个对象的使用。


基于事件实现数据库事务处理

在商务应用中，经常需要访问数据库，以完成对数据的查询、插入、更新、删除等操作。受应用逻辑的影响，有时需要将多条数据库操作指令组成一个工作单元(事务)。在数据库中，所谓事务是指一组逻辑操作单元，它使数据从一种状态变换到另一种状态。为确保数据库中数据的一致性，应当用离散的成组的逻辑单元操作数据：当它全部完成时，数据的一致性可以保持；而当单元中的一部分操作失败时，整个事务会被全部忽略，所有从起始点以后的操作全部退回到开始状态。

在 NetBox 在 Windows 2000 以后的操作系统中支持基于 MTS 的事务处理，然而出于移植性、应用程序性能(MTS 是一个缓慢的操作)与应用复杂程度的考虑，你可以使用 ADO 数据库的事务处理结合 NetBox 特有的脚本事件建立完美的事务处理框架。

第一步：ADO 事务处理

ADO 的 Connection 对象提供三个方法用以进行事务处理：

BeginTrans：启动一个事务
CommitTrans：完成/提交一个事务
RollBackTrans：撤消/放弃一个事务

下面的代码创建一个连接并启动事务处理：

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

Conn.CommitTrans

使用这种方式必须保证在结束脚本之前调用 CommitTrans 方法，比如调用 Shell.Quit、Response.End 提前结束脚本。

第二步：使用 OnScriptEnd 保证提交

NetBox 的脚本支持 OnScriptEnd 事件，当脚本正常结束时，将自动触发，所以我们可以在这个事件中进行事务提交。实现代码如下：

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

Sub OnScriptEnd
    Conn.CommitTrans
End Sub

在上面的代码中，程序结束时的事务提交被转移到了 OnScriptEnd 事件中，这样，无论脚本从什么位置正常退出脚本运行，都将提交整个事务。

第三步：使用 err.Raise 中止事务

在事务处理中，可能会出于一些原因需要中止事务。为了中止事务，可以使用 err.Raise 报告错误，从而使脚本非正常结束。

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

err.Raise errCode, errSource, errDescription

Sub OnScriptEnd
    Conn.CommitTrans
End Sub

与此类似，当脚本在事务处理过程中发生任何未被捕捉的错误时，同样也会导致脚本非正常结束。

第四步：使用 OnScriptError 进行错误处理

在程序抛出错误，或者运行时间出错时，脚本程序将非正常结束，为了在脚本出错时撤消事务和进行其他错误处理，可以使用 OnScriptError 事件。

Set Conn = CreateObject("ADODB.Connection")
Conn.Open ......
Conn.BeginTrans
......

err.Raise errCode, errSource, errDescription

Sub OnScriptEnd
    Conn.CommitTrans
End Sub

Sub OnScriptError
    Conn.RollBackTrans
    ......
End Sub

说明

本文给出的事务处理的方案适用于简单任务的事务处理，如果程序结构比较复杂，需要实现较复杂的或者多个事务处理，则需要根据需求自行进行事务的启动、提交和撤消。


创建可扩展的应用模型

几乎所有的程序员都或多或少的遇到应用的扩展性的问题，一个应用，在初期可能游刃有余，然而随着应用的成熟，功能的增加，用户规模的急速扩大，一直以为用之不竭的硬件资源终于捉襟见肘，终于有一天你会发现，买不到更快的服务器了。天啊…………

于是各种可扩展的解决方案开始进入你的视野，然而你终于发现，前路荆棘满布……

相关内容

  • 噩梦：从 Session 开始
  • 迁移：也是从 Session 开始
  • 个性化：用户友好与应用伸缩之间


噩梦：从 Session 开始

ASP 的 Session 对象是一个充满了神奇和灵感的创意，她的出现，将程序员从直接使用 Cookie 存储用户私有信息的时代带到了安全快速方便的服务器存储时代。使用 Session，我们可以方便的存储针对用户的个人信息，而且无需考虑数据的丢弃问题，服务器会自动帮助你清除垃圾数据。于是 Session 几乎成为 asp 编程中最常用的对象：用户的登录状态，用户的名称，用户的个性设置，用户的好友列表，用户的购物小车，等等等等，一切与用户个人相关的数据无一例外的被首选存放在 Session 中，以避免每次重复的数据库操作。

原本是美妙的

Session 对象以内存为基础的索引机制，带来了她高速的操作性能，方便的使用方法，但是也带来了今后发展的问题，我们先来研究一下 Session 的运行机制。当一个新的用户第一次访问一个 asp 程序时，系统发现没有与其对应的会话存在，便创建一个新的会话，并将会话的标识字符串通过 Cookie 传送给客户浏览器，此 Cookie 一般是下面的内容（以 NetBox 为例）：

Set-Cookie: OHJZVBWSIKIVAHIMHSMV=WKMLOETOSAUPJAFJWLOQSDNGRBXLXPGIPWBJYVTL; path=/

这个 Cookie 表明它是一个本站的临时 Cookie，就是说它只在浏览器运行时有效，一旦浏览器关闭，则此 Cookie 自动删除，不存放在硬盘中，并且此 Cookie 只会被传送到发送它的网站。同时我们发现无论是 Cookie 的名称还是内容都是毫无规律的一个字符串，其中名字是每个 Http 服务器的虚拟主机在创建的时候随机生成的，并且在整个运行过程中保持不变，以便接受自己发送出去的 Cookie，而 Cookie 的内容则是在服务器创建会话时随机生成的唯一标识，用于在浏览器和服务器之间维持会话使用。

当下次浏览器再访问此服务器的 asp 程序时，将自动将前面接受的这个 Cookie 返回送给服务器，服务器则根据这个 Cookie 的标识，在自己保存的会话中寻找到相应的会话，作为 Session 对象提供给 asp 程序使用。而 Session 中存储的数据，则是全部存放在服务器的内存中，以保证访问的方便快速。

很简单的原理，但是神奇而且美妙。

迁移：鱼与熊掌

鱼跟熊掌本来是没有关系的，贪心的人多了，便有了关系。 －－我

在未来的某一天，当我们的贪心发展到了一定的阶段，而不得不将一部分功能拆分出来由独立的服务器提供支撑，此时的困惑便开始出现了：在一个服务器上面登录过的用户，到了另外一个服务器还需要再次登录吗？如果不需要登录，用户怎么才能从一个服务器上迁移到另外一个服务器呢？

答案是：不可以。

首先是 Cookie。从前面的原理我们知道，维持 Session 会话的 Cookie 是一个私有的临时 Cookie，只可能被传送会发送它的主机，而当由另外一个主机提供其他相关服务时，它是无法得到这个 Cookie 的。

其次是 Session 的内容。出于效率和易用性的原因，Session 中存放的数据是全部保存的服务器的内存中的，无论如何是不能指望能够从另外一个服务器中直接访问到这些数据的，不要相信那些告诉你能够做到这些的人，他们只会带来更大的性能噩梦，频繁的服务器间访问和同步会随着应用的发展和服务器数量的增加迅速增长，很快你会发现再增加服务器反而导致性能的下降。

鱼是什么？鱼是 Session，灵巧，美味，但是单薄无力。熊掌是什么呢？

分析：鱼的什么和熊掌的什么

为了能够迁移用户，我们必须放弃一些东西。我们可以分析一下存放在 Session 里面的数据性质：

一，用户的永久属性。比如用户名，用户 ID，用户级别，用户个性化信息，等等，这些信息都是用户的固定属性，本来是存储在数据库中的，这里把它们存放在 Session 中，纯粹是为了较少数据库访问次数，以提高性能。这部分数据的关键在于用户名或者是用户 ID，一旦拥有其中的一个数据，其他的数据全部是可以从数据库中重新获得。

二，用户临时属性。一般来说可能是应用的临时数据，比如最后发言时间，当前留言状态，等等应用相关的数据。由于应用的相关性，这类数据迁移的意义并不大，在跨服务器时由于进入了另外一个应用，这些数据完全可以放弃。

三，用户临时数据。有些应用可能会在浏览过程中产生一组数据，这些数据是在不同的页面不同的时间产生，在有些实现中可能选择先暂存在 Session 中，最后根据用户的选择提交或者放弃。购物小车就是这样一个典型的应用。然而由于此类数据的特殊性质，其实存放在 Session 并不能体现出其高效灵活的特性，对于此类数据，直接在数据库中存储数据反而比在 Session 中方便。

为了让用户完全透明，在跨服务器时毫无感觉，核心的问题其实就是数据的自由获取，用户可以在他希望的地方得到自己希望的数据，比如自己的用户信息，自己的购物小车。下面我将给出一个 NetBox 针对这个问题给出的解决方案，这个方案可以有限的移植到 iis 上面，但是无论时易用性和安全性都大大削弱，大家可以自己去尝试一下。


迁移：也是从 Session 开始

为了让用户完全透明，在跨服务器时毫无感觉，核心的问题其实就是数据的自由获取，用户可以在他希望的地方得到自己希望的数据，比如自己的用户信息，自己的购物小车。下面我将给出一个 NetBox 针对这个问题给出的解决方案，关于 NetBox 的 HTTP 服务器的创建可以参见创建一个 WEB 服务器，参考手册参见 HttpServer 和 HttpServerHost。这个方案可以有限的移植到 iis 上面，但是无论时易用性和安全性都大大削弱，大家可以自己去尝试一下。

第一步，共享 Cookie

从前面的分析可以看出，迁移用户的第一个门槛是 Cookie 只能单个服务器独占，对于很多应用来说，可能在一个限定的域中由两个或者多个服务器，比如：www.netbox.cn 和 chat.netbox.cn，我们的第一个目标就是让 Session 的 Cookie 能够在整个域中有效，以便于下一步我们能够迁移 Session 数据。

在 NetBox 的 HttpServerHost 对象中，可以通过属性 SessionDomain 为虚拟主机设定 Session 的域范围，根据我们的例子，我们需要设定用户在 *.netbox.cn 的整个域中自由迁移，那么可以在创建各个服务器的 HTTP 服务器的虚拟主机时指定其 SessionDomain：

Set Host = httpd.AddHost "www.netbox.cn", "\wwwroot"
Host.SessionDomain = ".NetBox.cn"

上面的代码创建一个虚拟主机，并设定其会话有效域为 ".NetBox.cn"

第二步，共享会话标识

通过上面的方法，你已经可以在相同域内的各个服务器上面访问其他服务器发出的会话 Cookie，但是仅仅这样还是不够的，我们希望能够直接在各个服务器之间相互识别对方的标识，即只需要一个服务器发出会话标识，而其他服务器则直接获取和使用这个会话标识。要达到这个目的，就需要让所有的服务器使用相同的主机识别字符串，也就是我们前面看见的 Cookie 的名称。

在 NetBox 中，我们可以修改 HttpServerHost 对象的 ApplicationID 属性来达到这个目的。通过将 ApplicationID 设定为固定的标识字符串，我们可以将各个单独服务器的主机标识统一起来，以达到共享会话标识的目的：

Host.ApplicationID ＝ "MyNetBoxSession"

最终的应用标识名称叫什么无关紧要，只要一组服务器设定成相同的名称即可。

第三步，分析 Session

首先先澄清一个想法，我们并不是想在多个服务器之间共享 Session，那样会引入大量根本不是必须的服务器间操作，并且随着服务器增加这个浪费会呈指数上升。如果希望用户能够在多个服务器之间迁移，又不共享数据，那就需要同步。

我们可以按照上面已经有的模型来分析其中的关键。当一个用户在 www.netbox.cn 服务器上面登录，并拥有自己的私有数据，便拥有 netbox.cn 这个域的 Cookie，此时他访问 chat.netbox.cn 这个服务器，因为他在这个服务器上面并没有登录过，所以没有他的私有信息，但是服务器通过 Cookie 可以发现他已经拥有了一个会话标识，于是服务器便使用这个会话标识在本机为其创建了一个空的 Session 对象。现在的问题是，Session 里面的数据从哪里来。

第四步，保存 Session

为了让别的服务器能够获取指定用户的数据，就必须把用户的会话标识和用户关联起来，理所当然，我们首选数据库来完成这个任务。当然，如果你有一些服务器是在另外一个城市，不希望直接使用数据库操作，也可以选择其他的方式，“先进”的有 WebService，“后进”的也可以直接用 asp 程序实现一个简单小程序。

以数据库为例，在数据库中，我们创建一个名为 userlog 的表：

字段名 | 类型 | 长度 | 描述
SessionID | char | 40 | 用户的会话标识
UserID | integer |  | 用户ID，根据情况可以是其他的唯一标识
LogonTime | datetime |  | 用户的登录时间
UpdateTime | datetime |  | 用户会话更新时间
RefCount | integer |  | 引用用户会话的服务器个数，为 0 则表示无服务器引用，即为用户离开

我们的 logon.asp 除了做必要的登录之外，就需要多做一些事情：

<%If 认证成功 Then
    Session.Reset ;初始化会话
    ……… 你的登录代码

    conn.Execute("INSERT INTO userlog VALUES('" & Session.SessionKey & "', " &_
        userid & ", GETDATE(), GETDATE(), 1)")
End If
%>

在上面的代码中，使用了两个 Session 的方法和属性，一个是 Reset，用于建立一个新的会话，另外一个是 SessionKey 属性，用于查询当前会话的标识。

第五步，同步 Session

经过上面的步骤，我们已经能够从数据库中得知用户会话所对应的用户标识，当另外一个服务器得到这个会话，并创建了一个新的会话对象时，我们便可以在 Session 对象的初始化事件 OnSessionStart 中获取用户的私有信息：

Sub OnSessionStart
    ……
    conn.Execute("UPDATE userlog SET UpdateTime=GETDATE(), RefCount=RefCount+1 "&_
        "WHERE SessionID='" & Session.SessionKey & "' AND RefCount>0")
    Set rs = conn.Execute("SELECT * FROM userlog WHERE SessionID='" &_
        Session.SessionKey & "' AND RefCount>0")
    ……
End Sub

上面的代码增加会话的引用计数，修改更新时间，并返回会话的数据，以得到用户信息，得到用户 ID 以后的事情就不要我再罗嗦了吧。

而在服务器因为用户长时间未访问而放弃会话时，则需要减少引用计数：

Sub OnSessionEnd
    ……
    conn.Execute("UPDATE userlog SET UpdateTime=GETDATE(), RefCount=RefCount-1 "&_
        "WHERE SessionID='" & Session.SessionKey & "' AND RefCount>0")
    ……
End Sub

你也可以适当修改上面的 SQL 语句，减去 20 分钟的会话超时时间，以真实体现用户离线时间。

第六步，废弃 Session

在 logout.asp 中，我们也可能需要做不同处理。如果你直接使用 Session 对象的 Abandon 方法注销用户，但是因为你可能在 OnSessionEnd 事件中处理过离线时间，所以立即放弃会话可能导致时间上计算错误，所以你也可以用下面的代码来注销用户：

<%    ……
    conn.Execute("UPDATE userlog SET UpdateTime=GETDATE(), RefCount=RefCount-1 "&_
        "WHERE SessionID='" & Session.SessionKey & "' AND RefCount>0")
    Session.Reset
    ……
%>

而如果你根本不关心用户的实际下线时间，那直接使用 Abandon 也是比较方便的选择。

其他：关键修改

你可能允许用户修改了一些个性化的数据，而这些数据是被你缓存在 Session 里面的，那么你在修改了这些数据后就必须能够让其他已经缓存了的数据也同时废弃掉，此时，你可以使用上面注销用户一样的操作废弃当前 Session，然后重新装载数据，最后将新的会话信息保存到数据库中，以便于其他服务器同步数据：

<%    ……
    conn.Execute("UPDATE userlog SET UpdateTime=GETDATE(), RefCount=RefCount-1 "&_
        "WHERE SessionID='" & Session.SessionKey & "' AND RefCount>0")
    Session.Reset
    重新加载用户数据进 Session
    conn.Execute("INSERT INTO userlog VALUES('" & Session.SessionKey & "', " &_
        userid & ", GETDATE(), GETDATE(), 1)")
    ……
%>

稍微分析上面的代码，不难发现，所谓的关键个人信息修改，其实是自动帮助用户进行了一次退出和重新登录的操作。而在调用 Session 的 Reset 方法前后，SessionKey 的内容已经发生了变化，用户拥有了一个新的会话，而正是因为有了这个细微的变化，其他的服务器才有可能捕获到会话的变化，从而自动更新数据。

只有需要与其他服务器同步更新的数据才需要这样操作，如果你所修改的 Session 数据不是需要迁移的数据，比如用户修改了自己的口令，或者仅仅是统计此用户在本服务器的访问页面数，此数字对其他服务器根本没有用处，则不需要做任何特殊处理。

前进：负载均衡

这个方案同样可以用于建立基于负载均衡的服务器群集，我们可以根本不需要拆分应用，而只是将全部应用复制到所有群集的服务器中，针对不同的用户，由不同的服务器提供服务，以达到分摊负载扩大应用的目的。

以 MS 的 WLBS 为例，在构架负载均衡的时候，我们可以设定均衡模式为针对 IP 的单一映射。如果不出现意外，某个用户会固定的由某一台服务器提供服务，当服务器意外停止（硬件故障、网络原因、电源断电等），其他服务器将自动接受此服务器的用户继续服务，而用户则对此毫无知觉。同时有一些网络服务商会采用一些网络技术，比如 PIX 技术，可以让用户共享地址，并且一个用户可能最终分配的外部地址也可能频繁变化，此时，提供服务的服务器也可能会不断变化，而自动 Session 同步技术同样也可以向用户透明这些操作。

你同样也可以将负载均衡设定为地址无关的方式，此时用户的请求会被根据自动分配到不同的服务器，由于均衡是以请求，而不是以用户为单位，群集将拥有更加平衡的负载。然而因为用户可能随机转移到不同的服务器上，也导致了用户会话的重复复制，随着服务器的增加，同步会话所引入的负载也会逐步增加。同时，因为 NetBox 与浏览器之间保持网络连接，对于某个用户来说，其连接的服务器比较固定，所以实际引入的会话同步负载也是极其有限的。

最终，你可以根据应用实际测试的情况选择负载均衡方式。负载均衡也不会是最后的构架方式，程序员可以随意组合负载均衡与拆分应用等各种方法扩张自己的系统，这一切都依赖于会话的迁移。

小结：下课了下课了

上面的方案并没有包含一些性能优化上的描述，比如数据库中的表建立什么样的索引，更新数据库前先判断是否是登录用户，如果不是则根本不需要访问数据库，等等等等，因为不是这个专题的主题，所以略去了。而且上面的代码也只是一个模型，要建立一个完善的可扩展应用，还需要你的努力。

经此一役，我们成功地从 Session 的牢笼中将用户释放了出来，我们的用户从此可以在我们任何一台服务器上面随意浏览，而我们的程序则只需要修改关键的部分代码，即可无限延伸开来，你有钱吗，有多少钱就能跑多大的应用。


个性化：用户友好与应用伸缩之间

现代系统越来越关注，或者说是一厢情愿地关注每个用户不同的使用感受，个性设置几乎已经成了所有系统必备的元素：用户应该可以定义系统的颜色，用户应该可以修改进入后常用的操作，用户应该可以自由地改变系统每个模块的尺寸和位置，用户应该可以自己修改甚至定义每个模块的内容和功能，最终，用户将可以自己对系统进行二次开发，甚至二次编程。耶，我们终于把用户培养成程序员了哎。

然而不管怎么说，无论是程序员，还是用户，都还是希望系统能够“个性化”的。然而对于一个不断发展的系统来说，应用内容的增加，势必同时带来个性设置的增加，而应用规模的增大也同时带来用户群的增大，总会有一天，你发现增加一个个性设置，竟然需要系统中止服务。

数据与数据库

几乎从学习数据库的第一天开始，我们就被灌输了一个概念，数据库就是数据的仓库，如果需要存放大量数据，那就放数据库里好了。于是当我们开始考虑存放用户的个性设置时，理所当然的就想到了数据库。

对啊，你看，我们拿一个字段放颜色（也可能更多），拿一个字段放尺寸，再拿另外一个表存放他所有常用的操作，多么合理的结构啊。恩，而且查询的时候我甚至还可以把两个表关联起来，一次查询用户的常用操作出来。


调试脚本程序

在软件开发过程中，强大的调试手段是查找和纠正错误的重要因素。NetBox 因为完整地整合了各种脚本技术实现，可以方便的实现 box 程序、asp 程序和 wsc 对象等各种脚本的调试。

调试工具

NetBox 本身未提供调试工具，用户可以自行选择自己喜爱的调试工具作为 NetBox 调试程序使用。常用的脚本调试工具有 Microsoft Script Debugger 和 Visual InterDev。

相关内容

  • 运行时间错误捕捉
  • 单步跟踪运行模式
  • 在指定的位置设立断点
  • 开启 WEB 服务器脚本程序的错误调试
  • 自动禁止调试


运行时间错误捕捉

当脚本程序出现运行时间错误的时候，或者执行到程序设定的断点位置，NetBox 可以中断脚本运行，并激活你所安装的脚本调试工具，将调试位置置于出错位置，进入调试模式。

运行错误调试缺省是关闭的，用户可以根据自己的需要在具体程序中自行设定，对于不同的脚本程序，允许错误调试的方法不同，下面分别针对 box 程序、asp 程序和 wsc 程序进行说明。

BOX 程序

在 box 程序中可以使用 #debug 指令进行错误调试模式设定，如果需要设定捕捉运行时间错误，只需要在指定的 .box 程序开始插入一行即可：

#debug on
....

ASP 程序

在 asp 程序中可以使用 @DEBUG 指令进行错误调试模式设定，如果需要设定捕捉运行时间错误，只需要在指定的 .asp 程序开始插入 @DEBUG 指令即可：

<%@ DEBUG=on
....
%>

WSC 程序

可以使用 <?component?> 来设定 wsc 脚本的错误调试模式，如果需要设定捕捉运行时间错误，只需要在指定的 .wsc 程序开始插入 <?component?> 指令即可：

<?component debug="true"?>


单步跟踪运行模式

NetBox 可以以单步跟踪方式运行脚本程序，当程序刚开始运行时，NetBox 激活你所安装的脚本调试工具，将调试位置置于程序的第一行，进入单步调试模式。

单步跟踪缺省是关闭的，用户可以根据自己的需要在具体程序中自行设定，对于不同的脚本程序，允许单步跟踪的方法不同，下面分别针对 box 程序、asp 程序和 wsc 程序进行说明。

BOX 程序

在 box 程序中可以使用 #debug 指令进行单步跟踪设定，如果需要以单步跟踪方式运行程序，只需要在指定的 .box 程序开始插入一行即可：

#debug step
....

ASP 程序

在 asp 程序中可以使用 @DEBUG 指令进行单步跟踪设定，如果需要以单步跟踪方式运行程序，只需要在指定的 .asp 程序开始插入 @DEBUG 指令即可：

<%@ DEBUG=step
....
%>

WSC 程序

可以使用 <?component?> 来设定 wsc 脚本的单步跟踪模式，如果需要以单步跟踪方式运行程序，只需要在指定的 .wsc 程序开始插入 <?component?> 指令即可：

<?component debug="step"?>


在指定的位置设立断点

使用 NetBox，可以在任何一种脚本程序中设立调试断点，当程序执行到断点处时，NetBox 将中断程序运行，激活系统缺省的调试环境，开始调试下面的代码。

要使用断点进行调试，需要先打开运行时间错误捕捉，然后根据不同的脚本语言，分别使用下面不同的指令设立断点。

VBScript：Stop 语句

Set Console = Shell.Console
Stop
......

JavaScript：Debugger 语句

var Console = Shell.Console;
Debugger;
......


开启 WEB 服务器脚本程序的错误调试

NetBox 的 HttpServer 对象支持对于服务器脚本程序的全局设定，通过设定 EnableDebug，可以一次打开或禁止所有服务器脚本程序的运行时间错误捕捉。

下面的代码打开 HttpServer 的服务器脚本程序的错误调试：

Set Console = Shell.Console
Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then
    Set host = httpd.AddHost("", "\wwwroot")
    host.AddDefault "default.htm"
    host.EnableDebug = true

    httpd.Start

    Console.ReadLine

    httpd.Stop
    httpd.Close
End If

Set httpd = Nothing

通过使用 EnableDebug，可以设置此主机所执行的所有脚本程序的错误调试模式，然而如果服务器脚本程序中自行设定了调试模式，则程序最终以自行制定的模式运行。


自动禁止调试

通常情况下，只要用户要求允许调试，都是可以根据用户的要求进入相应的调试模式的。在下面两种情况下，NetBox 会自动禁止包括 HTML 脚本调试在内的任何调试手段：

发布代码

最终发布的代码将被禁止调试。如果用户的程序经过 NetBox 专用的发布工具发布成为应用程序或者运行库，其代码将成为受控代码，为保护代码，代码中的任何与调试有关的命令都将被忽略，避免在调试方式中出现代码泄露。

NT 服务程序

被安装成为系统服务的应用将被禁止调试。在安装成为系统服务时，由于用户无法响应调试请求，允许调试将导致服务阻塞。

如果需要对服务程序进行调试，可以直接作为桌面程序执行，此时服务程序将以 98 服务模式执行，由于可以访问桌面，将可以允许调试。


编译 NetBox 应用

NetBox 的最主要的目标是用于生产轻巧、灵活，易于安装部署的应用程序，因此编译 NetBox 应用就成为其重要环节。通过编译，可以将程序编译成为独立运行的执行程序，从而可以直接在用户环境中运行。

相关内容

  • NetBox 编译工具
  • 示例：编译 asp 应用程序


NetBox 编译工具

nbdw.exe 是 netbox 的编译、发布工具，用于将 netbox 应用编译成为最终的执行文件。执行 nbdw 后，可以看到一个对话框，其中各个部分的作用如下：

Source Folder

要编译的应用程序所在的目录。也可以直接选择以前编译过的目录。

Select Folder

浏览应用程序的目录，直接浏览系统目录以查找应用程序所在的目录。

文件列表

全部文件清单，文件名中的选框用于设定此文件是否被编译。编译前应先确认此列表。

Files of type

自动文件选择，可以成批添加或者删除指定文件，支持通配符“*”，“?”。

Build for

指定编译为应用程序还是代码库。代码库是一个可以被别人装载的库文件。

Output File

输出文件名，可以使用后面的 Browse 浏览选择。

View Certificate

netbox 的编译是由授权控制的，此处可以查询、获取和更新授权。开发人员可以自由下载免费授权。

Build...

前面的都是为这个服务的啦，点这个就开始编译了。


示例：编译 asp 应用程序

使用 NetBox 可以方便的将 asp 应用编译成为独立运行的执行程序，完全摆脱 iis 的束缚，在几乎所有的 Windows 版本上面直接运行，完全不需要考虑平台兼容性和对 asp 运行环境的要求。下面就是快速移植已有的 asp 应用的步骤。

一、创建 asp 运行环境

首先创建一个空的目录，在你喜欢的位置，假设是 d:\websvr。在目录中创建一个文件：main.box，编辑其内容为：

Dim httpd

Shell.Service.RunService "NBWeb", "NetBox Web Server", "NetBox Http Server Sample"

'---------------------- Service Event ---------------------

Sub OnServiceStart()
    Set httpd = CreateObject("NetBox.HttpServer")

    If httpd.Create("", 80) = 0 Then
        Set host = httpd.AddHost("", "\wwwroot")

        host.EnableScript = true
        host.AddDefault "default.asp"
        host.AddDefault "default.htm"

        httpd.Start
    else
        Shell.Quit 0
    end if
End Sub

Sub OnServiceStop()
    httpd.Close
End Sub

Sub OnServicePause()
    httpd.Stop
End Sub

Sub OnServiceResume()
    httpd.Start
End Sub

上面的代码摘自《创建一个 WEB 服务器》。其中加粗的部分是缺省文件名，如果你的应用不同，可以自行添加修改。

二、复制 asp 应用

在目录中再创建一个子目录：wwwroot，将你在 iis 中的文件全部复制到 wwwroot 中。此时，你的 asp 运行环境应该已经准备好了。

三、测试运行

为了运行你刚才新建的 netbox 应用，你必须确认你的 iis 或者其他占用 80 端口的程序已经停止，较大的可能是你的 iis 在使用这个端口，所以最好停止你的 iis，或者将 iis 的使用端口更换为其他端口。

在确保 iis 已经停止后，你便可以执行你的 netbox 应用了。双击 main.box 文件，很快，你将在窗口右下角看见 netbox 的图标。此时，netbox 已经正常运行了。你需要做的是使用 ie 访问 http://localhost 测试你的 asp 应用是否也已经正常运行。一般情况下此时 asp 也已经完全正常运行了。

四、编译

编译的过程是简单的，执行 nbdw.exe。

点 Select Folder，找到刚才我们建立的目录 d:\websvr，点 Browser，设定要生成的执行文件名，点 Build...，开始编译。

成功喽……

最后，我们得到了编译成功的那个执行文件，这个就是我们的最后目标。

因为这个例程是以服务方式创建的 Web 服务器，所以你可以使用：

myapp -install

将应用安装成为服务，这样，系统无须登录便可以自动运行应用了。如果需要卸载服务，则可以执行下面的命令：

myapp -remove


相关技术文章

这里列出的是在线讨论与咨询中的热点精华文章。

相关内容

  • 用 NetBox 实现 asp 的推技术
  • 使用 asp 建立安全的用户识别系统
  • 提高 asp 代码的可移植性
  • 判断浏览器是否接受 Cookies


用 NetBox 实现 asp 的推技术

一直以来，如何用 asp 技术实现推技术的聊天室，都是困扰 asp 程序员的一个难题。不同的解决方案，不同的尝试，结果却一直不能令人满意，主要有以下几个问题：

一、iis 的线程问题。由于推技术的实现必须以独立线程为基础，即每一个推连接必须占用一个线程，直至此连接结束为止。iis 的 asp 是基于 isapi 技术的，而 isapi 在实现时有着严格的线程限制，只能创建很少的线程，直接导致了很少的推连接数。

二、推线程的等待问题。正是因为 iis 在 isapi 管理上面的限制，asp 在实现时是假设程序是绝对不会进入等待的，所以在 asp 中间隔一段时间几乎是不可能的。于是有些开发人员为了实现延时效果，采用了不断判断时间的死循环的方法。殊不知这种循环几乎只需要一个就足以吃掉全部的 cpu 资源。

而使用 NetBox 则没有此类问题。NetBox 的实现采用了自由线程，可创建的线程总数只受限于系统限制，远远高于 iis 的线程限制，在 asp 中适当等待已经不再成为问题。同时 NetBox 的 asp 支持一个新的 NetBox 内建对象，所包含的 Sleep 方法更加方便的实现低负载的等待。

下面就是一段简单的推技术的演示代码：

<%Response.Buffer = false%>
<html>
<body>
<br>
<%Do While Response.IsClientConnected
NetBox.Sleep 1000
Response.Write now & "<br>"
Loop%>


使用 asp 建立安全的用户识别系统

有一定经验的开发人员一般都实现过一个用户系统，无论是网站社区、聊天室，还是办公系统、管理系统，都必须支持一个用户识别系统，以区别不同的用户，达到个性服务和权限系统的目的。

一般来说，这样的用户系统往往是一个数据库，里面包含了所有的用户，每个用户分别保存了用户名和口令，在用户登录时将其口令和指定用户的口令比较，进行用户识别。

然而这样的用户识别系统却存在着很大的安全隐患。

首先是系统管理员的信任问题，因为所有的用户和口令对于系统管理员来说都是公开的，所以管理员可以直接得到任何用户的口令，一旦管理员的信用出现问题，则整个系统的信用机制便立刻崩溃。

其次是攻击问题，由于口令以明码形式存放在数据库中，数据库的数据泄露将直接导致口令的失窃，同样也直接导致信用的崩溃。

同时，因为大多数人会在不同的系统上使用同样的口令(虽然很不安全，但是事实存在)，所以一个系统的口令失窃将导致连锁失窃反应。

基于这些原因，商用系统的用户识别系统就必须支持单向的口令加密系统，以防止类似事件的发生。按照安全的识别系统的需求，我们需要在数据库中存放不可逆向解密的用户口令，而在需要的时候，我们又必须能够识别用户口令是否匹配，报文摘要算法就是一种典型的实现方法。

NetBox 支持大量报文摘要算法，包括 MD2，MD4，MD5，MDC2，RipeMD160，SHA，SHA-1，SHA-2 等，在使用时可以根据安全级别要求的不同选用不同的算法来建立用户识别系统。下面以 MD5 为例演示安全的用户识别系统的实现。

在接受到用户输入的口令后，先将口令使用 MD5 进行单向加密，然后才能更新到数据库中或者与数据库中的口令进行比较，由于 MD5 返回的是二进制数据，所以需要使用 NetBox.Encoding 的 HexEncode 方法转换成为可见字符，下面就是这段代码：

Set MD5 = CreateObject("NetBox.Hash")
MD5.Create
MD5Pass = NetBox.Encoding.HexEncode(MD5.Final(password))
Set MD5 = NoThing

经过上面的运算，MD5Pass 中存放的就是以 16 进制方式编码的 password 的 MD5 运算值。由于报文摘要算法的特性，同样的 password 总是能得到同样的 MD5Pass，而通过 MD5Pass 是无法运算得出 password 的。


提高 asp 代码的可移植性

使用 NetBox 以后，asp 应用不在局限于某一个操作系统，你甚至可以在 Windows 98 第一版上直接部署你的应用。同时，NetBox 的广泛移植性也带来 asp 应用的移植问题。在使用 iis 时，因为代码不可能在其他平台使用，所以使用脚本语言时只要系统支持，就可以随意使用，而使用 NetBox 则不同，虽然 NetBox 提供了应用层和对象层的移植性，但如果 asp 程序中使用了较高版本的脚本语言的语法，则有可能导致应用在低版本的操作系统中不能正常运行。

为了提高 NetBox 应用中 asp 代码的可移植性，我们就必须了解脚本语言在不同的系统中的细微区别，尽量使用可移植性比较好的语法，即较低版本的脚本语法。

下面的表格是由微软提供的不同版本的脚本语言所依赖的系统，以及不同版本脚本语言之间的区别。以便大家参考。

下表列举了宿主应用程序所执行的 Visual Basic Scripting Edition 版本信息。

宿主应用程序 | 1.0 | 2.0 | 3.0 | 4.0 | 5.0 | 5.5 | 5.6
Microsoft Internet Explorer 3.0 | x |  |  |  |  |  |
Microsoft Internet Information Server 3.0 |  | x |  |  |  |  |
Microsoft Internet Explorer 4.0 |  |  | x |  |  |  |
Microsoft Internet Information Server 4.0 |  |  | x |  |  |  |
Microsoft Windows Scripting Host 1.0 |  |  | x |  |  |  |
Microsoft Outlook 98 |  |  | x |  |  |  |
Microsoft Visual Studio 6.0 |  |  |  | x |  |  |
Microsoft Internet Explorer 5.0 |  |  |  |  | x |  |
Microsoft Internet Information Services 5.0 |  |  |  |  | x |  |
Microsoft Internet Explorer 5.5 |  |  |  |  |  | x |
Microsoft Visual Studio.NET |  |  |  |  |  |  | x

下表列举了 VBScript 语言特征首次引用时的版本信息。

语言元素 | 1.0 | 2.0 | 3.0 | 4.0 | 5.0 | 5.5 | 5.6
Abs 函数 | x |  |  |  |  |  |
加法运算符 (+) | x |  |  |  |  |  |
And 运算符 | x |  |  |  |  |  |
Array 函数 |  | x |  |  |  |  |
Asc 函数 | x |  |  |  |  |  |
赋值运算符 (=) | x |  |  |  |  |  |
Atn 函数 | x |  |  |  |  |  |
Call 语句 | x |  |  |  |  |  |
CBool 函数 | x |  |  |  |  |  |
CByte 函数 | x |  |  |  |  |  |
CCur 函数 | x |  |  |  |  |  |
CDate 函数 | x |  |  |  |  |  |
CDbl 函数 | x |  |  |  |  |  |
Chr 函数 | x |  |  |  |  |  |
CInt 函数 | x |  |  |  |  |  |
Class 对象 |  |  |  |  | x |  |
Class 语句 |  |  |  |  | x |  |
Clear 方法 | x |  |  |  |  |  |
CLng 函数 | x |  |  |  |  |  |
Color 常数 |  | x |  |  |  |  |
Comparison 常数 |  | x |  |  |  |  |
字符串连接运算符 (&) | x |  |  |  |  |  |
Const 语句 |  | x |  |  |  |  |
Cos 函数 | x |  |  |  |  |  |
CreateObject 函数 |  | x |  |  |  |  |
CSng 函数 | x |  |  |  |  |  |
CStr 函数 | x |  |  |  |  |  |
Date 和 Time 常数 |  | x |  |  |  |  |
Date Format 常数 |  | x |  |  |  |  |
Date 函数 | x |  |  |  |  |  |
DateAdd 函数 |  | x |  |  |  |  |
DateDiff 函数 |  | x |  |  |  |  |
DatePart 函数 |  | x |  |  |  |  |
DateSerial 函数 | x |  |  |  |  |  |
DateValue 函数 | x |  |  |  |  |  |
Day 函数 | x |  |  |  |  |  |
Description 属性 | x |  |  |  |  |  |
Dim 语句 | x |  |  |  |  |  |
除法运算符 (/) | x |  |  |  |  |  |
Do...Loop 语句 | x |  |  |  |  |  |
Empty | x |  |  |  |  |  |
Eqv 运算符 | x |  |  |  |  |  |
Erase 语句 | x |  |  |  |  |  |
Err 对象 | x |  |  |  |  |  |
Eval 函数 |  |  |  |  | x |  |
Execute 方法 |  |  |  |  | x |  |
Execute 语句 |  |  |  |  | x |  |
ExecuteGlobal 语句 |  |  |  |  | x |  |
Exit 语句 | x |  |  |  |  |  |
Exp 函数 | x |  |  |  |  |  |
幂运算符 (^) | x |  |  |  |  |  |
False | x |  |  |  |  |  |
Filter 函数 |  | x |  |  |  |  |
FirstIndex 属性 |  |  |  |  | x |  |
Fix 函数 | x |  |  |  |  |  |
For...Next 语句 | x |  |  |  |  |  |
For Each...Next 语句 |  | x |  |  |  |  |
FormatCurrency 函数 |  | x |  |  |  |  |
FormatDateTime 函数 |  | x |  |  |  |  |
FormatNumber 函数 |  | x |  |  |  |  |
FormatPercent 函数 |  | x |  |  |  |  |
Function 语句 | x |  |  |  |  |  |
GetLocale 函数 |  |  |  |  | x |  |
GetObject 函数 |  | x |  |  |  |  |
GetRef 函数 |  |  |  |  | x |  |
Global 属性 |  |  |  |  | x |  |
Hex 函数 | x |  |  |  |  |  |
HelpContext 属性 |  | x |  |  |  |  |
HelpFile 属性 |  | x |  |  |  |  |
Hour 函数 | x |  |  |  |  |  |
If...Then...Else 语句 | x |  |  |  |  |  |
IgnoreCase 属性 |  |  |  |  | x |  |
Imp 运算符 | x |  |  |  |  |  |
Initialize 事件 |  |  |  |  | x |  |
InputBox 函数 | x |  |  |  |  |  |
InStr 函数 | x |  |  |  |  |  |
InStrRev 函数 |  | x |  |  |  |  |
Int 函数 | x |  |  |  |  |  |
整除运算符 (\) | x |  |  |  |  |  |
Is 运算符 | x |  |  |  |  |  |
IsArray 函数 | x |  |  |  |  |  |
IsDate 函数 | x |  |  |  |  |  |
IsEmpty 函数 | x |  |  |  |  |  |
IsNull 函数 | x |  |  |  |  |  |
IsNumeric 函数 | x |  |  |  |  |  |
IsObject 函数 | x |  |  |  |  |  |
Join 函数 |  | x |  |  |  |  |
LBound 函数 | x |  |  |  |  |  |
LCase 函数 | x |  |  |  |  |  |
Left 函数 | x |  |  |  |  |  |
Len 函数 | x |  |  |  |  |  |
Length 属性 |  |  |  |  | x |  |
LoadPicture 函数 |  | x |  |  |  |  |
Log 函数 | x |  |  |  |  |  |
LTrim 函数 | x |  |  |  |  |  |
Match 对象 |  |  |  |  | x |  |
Matches 集合 |  |  |  |  | x |  |
Mid 函数 | x |  |  |  |  |  |
Minute 函数 | x |  |  |  |  |  |
Miscellaneous 常数 |  | x |  |  |  |  |
求余运算符 | x |  |  |  |  |  |
Month 函数 | x |  |  |  |  |  |
MonthName 函数 |  | x |  |  |  |  |
MsgBox 常数 |  | x |  |  |  |  |
MsgBox 函数 | x |  |  |  |  |  |
乘法运算符 (*) | x |  |  |  |  |  |
减法运算符 (-) | x |  |  |  |  |  |
Not 运算符 | x |  |  |  |  |  |
Now 函数 | x |  |  |  |  |  |
Nothing | x |  |  |  |  |  |
Null | x |  |  |  |  |  |
Number 属性 | x |  |  |  |  |  |
Oct 函数 | x |  |  |  |  |  |
On Error 语句 | x |  |  |  |  |  |
Option Explicit 语句 | x |  |  |  |  |  |
Or 运算符 | x |  |  |  |  |  |
Pattern 属性 |  |  |  |  | x |  |
Private 语句 |  | x |  |  |  |  |
PropertyGet 语句 |  |  |  |  | x |  |
PropertyLet 语句 |  |  |  |  | x |  |
PropertySet 语句 |  |  |  |  | x |  |
Public 语句 |  | x |  |  |  |  |
Raise 方法 | x |  |  |  |  |  |
Randomize 语句 | x |  |  |  |  |  |
ReDim 语句 | x |  |  |  |  |  |
RegExp 对象 |  |  |  |  | x |  |
Rem 语句 | x |  |  |  |  |  |
Replace 函数 |  | x |  |  |  |  |
Replace 方法 |  |  |  |  | x |  |
RGB 函数 |  | x |  |  |  |  |
Right 函数 | x |  |  |  |  |  |
Rnd 函数 | x |  |  |  |  |  |
Round 函数 |  | x |  |  |  |  |
RTrim 函数 | x |  |  |  |  |  |
ScriptEngine 函数 |  | x |  |  |  |  |
ScriptEngineBuildVersion 函数 |  | x |  |  |  |  |
ScriptEngineMajorVersion 函数 |  | x |  |  |  |  |
ScriptEngineMinorVersion 函数 |  | x |  |  |  |  |
Second 函数 | x |  |  |  |  |  |
Select Case 语句 | x |  |  |  |  |  |
Set 语句 | x |  |  |  |  |  |
SetLocale 函数 |  |  |  |  | x |  |
Sgn 函数 | x |  |  |  |  |  |
Sin 函数 | x |  |  |  |  |  |
Source 属性 | x |  |  |  |  |  |
Space 函数 | x |  |  |  |  |  |
Split 函数 |  | x |  |  |  |  |
Sqr 函数 | x |  |  |  |  |  |
StrComp 函数 | x |  |  |  |  |  |
String 常数 |  | x |  |  |  |  |
String 函数 | x |  |  |  |  |  |
StrReverse 函数 |  | x |  |  |  |  |
Sub 语句 | x |  |  |  |  |  |
减法运算符 (-) | x |  |  |  |  |  |
Tan 函数 | x |  |  |  |  |  |
Terminate 事件 |  |  |  |  | x |  |
Test 方法 |  |  |  |  | x |  |
Time 函数 | x |  |  |  |  |  |
Timer 函数 |  |  |  |  | x |  |
TimeSerial 函数 | x |  |  |  |  |  |
TimeValue 函数 | x |  |  |  |  |  |
Trim 函数 | x |  |  |  |  |  |
三态常数 |  | x |  |  |  |  |
True | x |  |  |  |  |  |
TypeName 函数 |  | x |  |  |  |  |
UBound 函数 | x |  |  |  |  |  |
UCase 函数 | x |  |  |  |  |  |
Value 属性 |  |  |  |  | x |  |
VarType 常数 |  | x |  |  |  |  |
VarType 函数 | x |  |  |  |  |  |
VBScript 常数 |  | x |  |  |  |  |
Weekday 函数 | x |  |  |  |  |  |
WeekdayName 函数 |  | x |  |  |  |  |
While...Wend 语句 | x |  |  |  |  |  |
With 语句 |  |  |  |  | x |  |
Xor 运算符 | x |  |  |  |  |  |
Year 函数 | x |  |  |  |  |  |


判断浏览器是否接受 Cookies

在 asp 应用中，经常用到 Session 对象来保存用户临时私有数据，而 asp 的 Session 对象是依赖于浏览器的 Cookie 的，如果用户出于安全原因或者无意中关闭了 Cookie 选项，则 asp 将无法正确识别用户，最终导致 Session 对象不能正常使用。

要正确执行以后的程序，就要先识别客户程序是否接受 Cookie，然而浏览器并没有提供识别 Cookie 是否关闭的方法，这样就需要我们自己来想办法进行测试。

于是很多开发人员就纷纷用自己的办法来测试浏览器的 Cookie 状态，最常见的方法是在一个页面里面送出一个 Cookie，然后在另一个页面中测试此 Cookie 是否存在。这样以来，我们就需要两次 asp 请求。

我这里介绍的是一种结合服务器脚本与客户端脚本，一次测试浏览器状态的方法。

在 NetBox 第一次初始化 asp 程序时，将分配一个新的 Session 对象，并向客户端送出一个以 Application.ApplicationID 为名称的 Cookie，浏览器如果接受　Cookie，则下次访问时将回送此 Cookie，NetBox 服务器在接受到此 Cookie 以后，将选用其指定的 Session 对象作为此次 asp 请求的 Session 对象使用，以保证 Session 对象针对具体用户的唯一性和持久性。

由此我们知道，可以通过判断浏览器是否接受了 Application.ApplicationID 为名称的 Cookie 来判断能否继续下面的程序。而判断浏览器中是否含有某个 Cookie，则可是使用浏览器的 cookie 对象来完成。下面这段代码就是测试浏览器是否接受了 NetBox 的 Session：

<html>
<body>
<Script language="javascript">
if(document.cookie.search("<%=Application.ApplicationID%>=") == -1)document.write("Not ");
</Script>Allow.
</body>
</html>

这段代码的前提是知道 NetBox 送出的 Cookie 的名称。如果希望在 iis 中使用此段代码，则比较困难，因为 iis 每次启动后送出的 Cookie 的名称都是不同的，所以为了测试，可以自行送出一个 Cookie 然后再进行测试：

<%Response.Cookie("CookieCheck")="on"%>
<html>
<body>
<Script language="javascript">
if(document.cookie.search("CookieCheck=") == -1)document.write("Not ");
</Script>Allow.
</body>
</html>


预处理指令参考

预处理指令是为 NetBox 提供编译信息的命令，不属于语言本身的部分，NetBox 按照预处理指令的要求准备符合要求的运行环境，然后再装载具体的程序。

对于不同的脚本程序，预处理的格式也不相同，对于 box 程序，预处理指令是一组以 # 开头的命令，而对于 asp 程序，预处理指令则是一组以 @ 开头的命令。

相关内容

  • # 指令参考(box 程序)
  • @ 指令参考(asp 程序)


# 指令参考(box 程序)

# 指令是一组通知 NetBox 如何解释组织 .box 脚本程序的命令，# 指令不是脚本语言的一部分，但是 # 指令将可以影响脚本执行的语言和方式。

下面的例子指定脚本语言为 Javascript：

#language javascript
Shell.Console.WriteLine("Hello! JS");

# 指令是由 NetBox 解释的指令，必须出现在第一条脚本程序之前。从第一行不是以 # 开始的非空行开始，一直到文件结束，都将被 NetBox 认为是脚本代码。

相关内容

  • #language
  • #debug
  • #include
  • #transaction


#language

设定当前脚本程序的脚本语言

语法

#language {scriptengine}

注释

#language 指令可以设定为系统已经安装的任何一种脚本语言的名称，一般有两种：VBScript 和 Javascript。

示例

下面的代码设定脚本语言为 Javascript：

#language javascript
Shell.Console.WriteLine("Hello! JS");


#debug

设定当前脚本程序的错误调试模式

语法

#debug {on|true|off|false|step}

注释

#debug 指令可以设定为下面三个值：

on|true | 开启错误调试。如果脚本程序出现未被捕捉的运行时间错误，NetBox 将自动激活系统安装的脚本调试环境，并定位至错误代码处，进入调试模式
off|false | 关闭错误调试模式。脚本程序未被捕捉的运行时间错误将导致脚本程序的错误中止，不激活调试环境
step | 单步调试。在脚本程序执行的第一行程序便予以中断，并激活脚本调试环境，进入单步跟踪模式

示例

下面代码设定错误调试打开，然后当执行到“a="abcdef" + 100”时将触发调试环境。

#debug on
......
a="abcdef" + 100


#include

包含指定的脚本文件

语法

#include FileName

注释

使用 #include 指令，可以将指定的脚本程序包含进当前的脚本，成为当前脚本程序的一部分。利用 #include，可以实现简单的代码公用。#include 允许多层嵌套包含。

#include 给定的文件如果未找到，或者 #include 出现循环包含，即出现自己直接或间接包含了自己，脚本装载都将返回错误，可以使用 GetLastError 方法取得详细的错误信息。

示例

下面的程序包含了一段公共函数文件：

#include pubfun.box

a = AddNum(100, 200)


#transaction

可以使用 #transaction 指定一个 box 脚本启动一个事务处理

语法

#transaction value

注释

通过设定不同的 value 的值，可以指定脚本以不同的规则建立事务，可以是下面的值：

Required | 总是初始化一个新的事务
Requires_New | 如果存在事务，则加入，否则创建一个新的事务
Supported | 如果存在事务，则加入，否则不支持事务
Not_Supported | 不支持事务

如果脚本创建或者加入了一个事务，则可以通过访问内建对象 ObjectContext 来中止一个事务处理。

当脚本在一个事务中需要创建一个新的对象并加入此事务时，需要使用 NetBox 对象的 CreateObject 方法或者在服务器脚本中使用 Server 对象的 CreateObject 方法进行对象的创建，直接使用 VBScript 语言自身提供的 CreateObject 方法将创建出独立于事务的对象来，不能加入事务。

示例

下面的代码将指定脚本创建一个事务，并在某个条件中止事务：

#transaction Required
......

If ... Then
    ObjectContext.SetAbort
End If

限制

创建一个事务需要操作系统对 COM+ 的支持，所以你只能在 Windows 2000 以上的操作系统使用事务处理，目前包括的操作系统为：Windows 2000、Windows XP、Windows .NET Server。


@ 指令参考(asp 程序)

可以在脚本中使用 @ 指令将有关如何处理 .asp 文件的信息发送给 HttpServer。例如，以下脚本用 @LANGUAGE 处理指令将脚本语言设置为 VBScript。

<%@Language=VBScript
Dim myvar
Application("myvar") = This is my var
Response.Write(myvar)%>

相关内容

  • @LANGUAGE
  • @DEBUG
  • @ENABLESESSIONSTATE
  • @TRANSACTION


@LANGUAGE

设定当前 asp 脚本程序的脚本语言

语法

<%@ LANGUAGE=scriptengine %>

注释

@ LANGUAGE指令可以设定为系统已经安装的任何一种脚本语言的名称，一般有两种：VBScript 和 Javascript。

示例

下面的代码设定脚本语言为 Javascript：

<%@ LANGUAGE=javascript
Response.Write("Hello! JS");%>


@DEBUG

设定当前脚本程序的错误调试模式

语法

<%@ DEBUG=on|true|off|false|step %>

注释

@ DEBUG 指令可以设定为下面三个值：

on|true | 开启错误调试。如果脚本程序出现未被捕捉的运行时间错误，NetBox 将自动激活系统安装的脚本调试环境，并定位至错误代码处，进入调试模式
off|false | 关闭错误调试模式。脚本程序未被捕捉的运行时间错误将导致脚本程序的错误中止，不激活调试环境
step | 单步调试。在脚本程序执行的第一行程序便予以中断，并激活脚本调试环境，进入单步跟踪模式

示例

下面代码设定错误调试打开，然后当执行到“a="abcdef" + 100”时将触发调试环境。

<%@ DEBUG=on
......
a="abcdef" + 100%>


@ENABLESESSIONSTATE

可以使用 @ENABLESESSIONSTATE 指令关闭网页会话跟踪。会话跟踪维护由单个客户端发布的一组请求信息。

语法

<%@ ENABLESESSIONSTATE=True|False %>

示例

下面的代码关闭会话跟踪，再进行其他操作。

<%@ ENABLESESSIONSTATE=False

........
%>


@TRANSACTION

可以使用 @TRANSACTION 指定一个 asp 服务器脚本启动一个事务处理

语法

<% @TRANSACTION = value %>

注释

通过设定不同的 value 的值，可以指定脚本以不同的规则建立事务，可以是下面的值：

Required | 总是初始化一个新的事务
Requires_New | 如果存在事务，则加入，否则创建一个新的事务
Supported | 如果存在事务，则加入，否则不支持事务
Not_Supported | 不支持事务

如果脚本创建或者加入了一个事务，则可以通过访问内建对象 ObjectContext 来中止一个事务处理。

当脚本在一个事务中需要创建一个新的对象并加入此事务时，需要使用 NetBox 对象的 CreateObject 方法或者在服务器脚本中使用 Server 对象的 CreateObject 方法进行对象的创建，直接使用 VBScript 语言自身提供的 CreateObject 方法将创建出独立于事务的对象来，不能加入事务。

示例

下面的代码将指定脚本创建一个事务，并在某个条件中止事务：

<% @TRANSACTION = Required
......

If ... Then
    ObjectContext.SetAbort
End If%>

限制

创建一个事务需要操作系统对 COM+ 的支持，所以你只能在 Windows 2000 以上的操作系统使用事务处理，目前包括的操作系统为：Windows 2000、Windows XP、Windows .NET Server。


已知错误

此处通报的是各个版本已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含在最后一个出现该错误的版本中。

相关内容

  • 版本 2.5
  • 版本 2.6


版本 2.5

此处通报的是版本 2.5 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 版本 2.5.4116
  • 版本 2.5.4117
  • 版本 2.5.4118
  • 版本 2.5.4119


版本 2.5.4116

此处通报的是版本 2.5.4116 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：在 include 中使用单引号时出错
  • 错误：Request.Cookies 取回的信息未解码
  • 错误：当项目不存在时，Request 返回空字符串而不是 Empty
  • 错误：OnSessionEnd 事件中未解锁将可能导致死锁


错误：在 include 中使用单引号时出错

基本信息

发现者：aqiang
发现时间：2003-08-27
错误描述：当在 asp 中使用 include 包含一个外部文件，而文件名使用单引号分割时，单引号会被认为是文件名的一部分，从而导致文件包含错误。

影响版本

NetBox 2.5.4116

处理情况

这个错误已经在 2.5.4117 版本中予以修正。

解决办法

可以修改代码，将单引号更换为双引号，也可以下载 2.5.4117 或者更高的版本。


错误：Request.Cookies 取回的信息未解码

基本信息

发现者：aqiang
发现时间：2003-08-27
错误描述：当发送的某个 Cookie 内容不为多项时，通过 Request.Cookies 取回的信息为 urlencode 后的信息。

影响版本

NetBox 2.5.4116

处理情况

这个错误已经在 2.5.4117 版本中予以修正。

解决办法

请下载 2.5.4117 或者更高的版本。


错误：当项目不存在时，Request 返回空字符串而不是 Empty

基本信息

发现者：ygl_mail
发现时间：2003-08-29
错误描述：在使用 Request 查询的项目不存在时，Request 返回了一个空对象，此对象的缺省值为空字符串而不是 Empty，所以导致与其相关的程序出错。

影响版本

NetBox 2.5.4116

处理情况

这个错误已经在 2.5.4117 版本中予以修正。

解决办法

请下载 2.5.4117 或者更高的版本。


错误：OnSessionEnd 事件中未解锁将可能导致死锁

基本信息

发现者：joe
发现时间：2003-09-04
错误描述：在 OnSessionEnd 中调用 NetBox.Lock 或者 Application.Lock 加锁，如果退出事件前未调用 NetBox.Unlock 或者 Application.Unlock 正常解锁，则可能在其他位置产生死锁现象。

影响版本

NetBox 2.5.4116

处理情况

这个错误已经在 2.5.4117 版本中予以修正。

解决办法

请下载 2.5.4117 或者更高的版本。


版本 2.5.4117

此处通报的是版本 2.5.4117 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：使用 Server.Execute 执行非 asp 文件将退出应用


错误：使用 Server.Execute 执行非 asp 文件将退出应用

基本信息

发现者：zz
发现时间：2003-09-09
错误描述：当使用 Server.Execute 时传递一个非 asp 的文件名时，应用将停止运行。

影响版本

NetBox 2.5.4117

处理情况

这个错误已经在 2.5.4118 版本中予以修正。

解决办法

请下载 2.5.4118 或者更高的版本。


版本 2.5.4118

此处通报的是版本 2.5.4118 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：安装成服务后有时会报告无效状态
  • 错误：使用中文文件名或者中文参数时参数获取不正常
  • 错误：使用 Response.Cookies 设定的内容不能在 Request.Cookies 中直接查询
  • 错误：在某些杀毒软件运行时报告对象不能创建


错误：安装成服务后有时会报告无效状态

基本信息

发现者：zz
发现时间：2003-09-15
错误描述：当 NetBox 安装成为服务后，在某些情况下，Service Control Manager 会报告 “The ServiceName service has reported an invalid current state 0.”。此错误不影响服务正常运行，此错误产生是操作系统错误。参见微软错误报告：Q320789。

影响版本

NetBox 2.5.4118

处理情况

这个错误已经在 2.5.4119 版本中予以修正。

解决办法

请下载 2.5.4119 或者更高的版本。因为不影响使用，所以也可继续使用。


错误：使用中文文件名或者中文参数时参数获取不正常

基本信息

发现者：hlh
发现时间：2003-09-19
错误描述：当执行文件名为中文，或者路径中包含中文，或者参数中包含中文时，通过 Shell.Arguments 查询的参数可能是错误的。

影响版本

NetBox 2.5.4118

处理情况

这个错误已经在 2.5.4119 版本中予以修正。

解决办法

请下载 2.5.4119 或者更高的版本。


错误：使用 Response.Cookies 设定的内容不能在 Request.Cookies 中直接查询

基本信息

发现者：XUNPO
发现时间：2003-09-18
错误描述：当使用 Response.Cookies 设定 Cookie 内容后，iis 可以在本 asp 中直接通过 Request.Cookies 查询，而 NetBox 则需要将 Cookie 送往客户端，当下次请求时才能通过 Request.Cookies 查询。

影响版本

NetBox 2.5.4118

处理情况

这个错误已经在 2.5.4119 版本中予以修正。

解决办法

请下载 2.5.4119 或者更高的版本。


错误：在某些杀毒软件运行时报告对象不能创建

基本信息

发现者：ouyang、huangqyun、ruixing123、cantops、awerli 等，并感谢 awerli 配合调试
发现时间：2003-10-21
错误描述：当系统安装某些杀毒软件时，会很大程度影响系统的正常运行，从而导致 NetBox 的一些部件不能成功注册加载，最终出现不能创建对象的错误。

影响版本

NetBox 2.5.4118

处理情况

这个问题已经在 2.5.4119 版本中予以修正。

解决办法

请下载 2.5.4119 或者更高的版本。


版本 2.5.4119

此处通报的是版本 2.5.4119 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：向 HtmlWindow 中拖放一个文件将导致其中的程序被取消
  • 错误：窗口设定透明模版后无法取消


错误：向 HtmlWindow 中拖放一个文件将导致其中的程序被取消

基本信息

发现者：3A
发现时间：2003-11-30
错误描述：打开一个 HtmlWindow 并装载 Html 文件后，如果用户将另外一个 Html 或者其他可显示的文件拖放至窗口，将导致以前装载的 Html 文件被替换，从而中断程序运行。

影响版本

NetBox 2.5.4119

处理情况

这个错误已经在 2.6.4120 版本中予以修正。

解决办法

请下载 2.6.4120 或者更高的版本。


错误：窗口设定透明模版后无法取消

基本信息

发现者：greefar12
发现时间：2003-12-22
错误描述：通过设定 HtmlWindow 透明模版后，无法取消模版使窗口恢复到正常模式。

影响版本

NetBox 2.5.4119

处理情况

这个错误已经在 2.6.4120 版本中予以修正。

解决办法

请下载 2.6.4120 或者更高的版本。


版本 2.6

此处通报的是版本 2.6 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 版本 2.6.4120
  • 版本 2.6.4121
  • 版本 2.6.4123
  • 版本 2.6.4124
  • 版本 2.6.4125


版本 2.6.4120

此处通报的是版本 2.6.4120 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：在 OnApplicationStart 事件中使用 Server.MapPath 将返回空
  • 错误：NetBox 2.6.4120 在 WIN98 下运行失败


错误：在 OnApplicationStart 事件中使用 Server.MapPath 将返回空

基本信息

发现者：hlh
发现时间：2003-12-28
错误描述：在 OnApplicationStart 事件中使用 Server.MapPath 将返回空，导致以次为基础的程序不能正常运行。

影响版本

NetBox 2.6.4120，因为 OnApplicationStart 事件从次版本开始支持，所以不影响以前版本

处理情况

这个错误已经在 2.6.4121 版本中予以修正。

解决办法

请下载 2.6.4121 或者更高的版本。


错误：NetBox 2.6.4120 在 WIN98 下运行失败

基本信息

发现者：sheepchang1、ruixing123
发现时间：2003-12-28
错误描述：2.6.4120 版本在 windows 98 下面运行时，初始化系统时会因为系统数据而产生随机错误，导致不能运行。

影响版本

NetBox 2.6.4120，不影响以前版本

处理情况

这个错误已经在 2.6.4121 版本中予以修正。

解决办法

请下载 2.6.4121 或者更高的版本。


版本 2.6.4121

此处通报的是版本 2.6.4121 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：当操作 Application 或者 Session 集合内的数据时，以变量作为键值将不能成功


错误：当操作 Application 或者 Session 集合内的数据时，以变量作为键值将不能成功

基本信息

发现者：hlh
发现时间：2003-12-29
错误描述：当操作 Application 或者 Session 集合内的数据时，以变量作为键值将不能成功，使用常量作为键值的程序将不受影响。例如，下面的代码将不能正常运行：

k = "key"
Application(k) = 100

而直接的 Application("key") = 100 则会正常运行。

影响版本

NetBox 2.6.4120，2.6.4121。不影响以前版本

处理情况

这个错误已经在 2.6.4122 版本中予以修正。

解决办法

请下载 2.6.4122 或者更高的版本，如果未使用变量作为键值则可以不予升级或者将操作修改为：Application.Contents(k) 或者 Session.Contents(k)。


版本 2.6.4123

此处通报的是版本 2.6.4123 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：未编译时在 URL 后面包含 DBCS 引导字符将会泄露 asp 代码


错误：未编译时在 URL 后面包含 DBCS 引导字符将会泄露 asp 代码

基本信息

发现者：siping
发现时间：2003-12-28
错误描述：因为操作系统处理文件名的原因，在文件名结尾的 DBCS 引导字符将被忽略，此原因导致文件实际扩展名与请求扩展名不同，导致访问权限判断错误，从而引起代码泄露。因为此错误只因操作系统文件操作而引起，编译以后的 asp 因无文件操作而不会有此问题。

影响版本

NetBox 2.6.4123

处理情况

这个错误已经在 2.6.4124 版本中予以修正。

解决办法

请下载 2.6.4124 或者更高的版本。


版本 2.6.4124

此处通报的是版本 2.6.4124 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：未编译时在 URL 后面包含某些非法字符将会泄露 asp 代码
  • 错误：使用数字下标访问 Request 信息时，起始值为 0，与 iis 不兼容


错误：未编译时在 URL 后面包含某些非法字符将会泄露 asp 代码

基本信息

发现者：olo
发现时间：2004-02-09
错误描述：因为操作系统处理文件名的原因，在文件名结尾的某些非法字符将被忽略，此原因导致文件实际扩展名与请求扩展名不同，导致访问权限判断错误，从而引起代码泄露。因为此错误只因操作系统文件操作而引起，编译以后的 asp 因无文件操作而不会有此问题。

能够产生此错误的字符有：“.”，“%2e”，“%20”

影响版本

NetBox 2.6.4124

处理情况

这个错误已经在 2.6.4125 版本中予以修正。

解决办法

请下载 2.6.4125 或者更高的版本。


错误：使用数字下标访问 Request 信息时，起始值为 0，与 iis 不兼容

基本信息

发现者：websky
发现时间：2004-02-17
错误描述：使用 Request.Form(n) 或者 Request.Form("key")(n) 等类似的语法访问请求信息时，iis 的数字下标 n 起始值为 1，而 NetBox 起始值为 0，导致一些 iis 应用移植到 NetBox 后报告下标出界。

影响版本

NetBox 2.6.4124

处理情况

这个错误已经在 2.6.4125 版本中予以修正。

解决办法

修改程序为从 0 开始，或者请下载 2.6.4125 或者更高的版本。


版本 2.6.4125

此处通报的是版本 2.6.4125 已经发现的 NetBox 的错误，在没有特殊说明的情况下，错误将包含以前的版本中。

相关内容

  • 错误：长时间频繁更换图标将耗尽系统资源
  • 错误：网络故障将导致 TcpServer 和 HttpServer 不再接受请求


错误：长时间频繁更换图标将耗尽系统资源

基本信息

发现者：Frank
发现时间：2004-04-19
错误描述：当使用 Service.Icon 或者 HtmlWindow.Icon 更换图标时，以前的图标将不被释放，长时间频繁更换后，因为丢失的图标占用系统资源而导致资源耗尽。现象通常为桌面图标消失、混乱，菜单不能正常显示等。

影响版本

NetBox 2.6.4125

处理情况

这个错误已经在 2.7.4126 版本中予以修正。

解决办法

请下载 2.7.4126 或者更高的版本。


错误：网络故障将导致 TcpServer 和 HttpServer 不再接受请求

基本信息

发现者：hlh
发现时间：2004-03-15
错误描述：当网络请求频繁发生时，如果其间出现网络故障将导致 TcpServer 和 HttpServer 不再 accept 客户请求。现象为客户能够连接，但是不再响应，或者在长时间出错后不能连接。

影响版本

NetBox 2.6.4125

处理情况

这个错误已经在 2.7.4126 版本中予以修正。

解决办法

或者请下载 2.7.4126 或者更高的版本。


常见问题

这里列出的是用户经常问到的问题。

相关内容

  • 编译与发布
  • 与 Internet Information Server 的兼容性


编译与发布

使用 NetBox 可以将已经测试通过的应用编译发布成为独立运行的执行文件，以方便在用户计算机上部署。

相关内容

  • 问题：编译时报告 netbox.exe 文件找不到
  • 问题：为什么我编译出来的执行程序运行时出现命令行？
  • 问题：为什么使用 mappath 映射的文件名编译后不能创建？
  • 问题：将 mdb 数据库编译后，执行时为什么会被提取出来


问题：编译时报告 netbox.exe 文件找不到

NBDW 在编译时，将使用与其相同目录中的 NetBox.exe 对给定的目录中的项目进行编译，如果其目录下无 NetBox.exe 文件，则会报告文件找不到。

解决方法

在 NBDW 目录下保留一个最新的 NetBox.exe 文件。


问题：为什么我编译出来的执行程序运行时出现命令行？

在编译 NetBox 之前，你必须先保证你的项目目录是可以成功运行的，如果编译后出现命令行，说明你的项目目录中没有 main.box 主程序。也就是说你的项目目录本身还没有能够正确运行。

参见

NetBox 的运行方式


问题：为什么使用 mappath 映射的文件名编译后不能创建？

通常，asp 程序习惯于使用 Server.MapPath 来映射一个与 asp 相同目录的文件名，然后再直接访问。例如下面的代码：

Set file = CreateObject("NetBox.File")
file.Create Server.MapPath("temp.txt")
......

从代码中可以知道，作者是希望在当前目录创建一个 temp.txt 的文件。至于这么做的原因，主要是因为 asp 本身并不知道自己运行在哪个目录，或者是因为权限的原因。

这样的代码在未编译的时候是能够正常运行的，原因是在没有编译的时候，所有的 asp 都是存放在系统磁盘上面，而同时，其所在的目录也为实际系统目录，故经过映射，创建的文件也能够正确定位。

而经过编译以后，asp 文件就不再出现在系统磁盘上面，而与之对应的目录也是不存在的，此时再使用 Server.MapPath 映射得到的文件名所包含的目录也将是虚拟的，使用这样的文件名创建文件，其结果将是程序出错。

解决方法

对于只是临时使用的文件，可以简单将 Server.mappath 更换成为 netbox.mappath，这样，临时文件将创建在应用程序相同的目录。

对于需要永久存放的文件，一般的建议是在应用程序目录下面创建一个子目录，将文件全部存放在那个目录中。创建目录的操作可以放在 main.box 中，在初始化程序中完成。而如果这个目录中的文件还需要直接使用浏览器访问的话，可以使用 AddFolder 将此目录添加在 Web 服务器的虚拟主机上面即可。

参见

HttpServer
HttpServerHost
NetBox


问题：将 mdb 数据库编译后，执行时为什么会被提取出来

当使用 Access 数据库的应用被编译时，可以将数据库直接编译进应用程序中，而当次应用被执行时，此文件将被自动取出，按照其编译前的相对路径存放在应用程序存放的目录中。

现象原因

当 mdb 数据库被封装在应用程序内部后，文件已经成为执行文件的一个部分，当数据库系统需要访问此文件时，按照 NetBox 的路径系统 的运行规则，系统将以文件方式访问此文件，所以此文件将被自动提取出来，并且以后都将直接使用外部文件，这样对数据库的修改也将会被文件保持。

另类需求

对于有些应用，比如应用程序存放在光盘或者只读设备，或者作者可能根本不想让别人看到有个数据库放在外面。对于这种情况，如果此数据库根本不需要修改，则可以以只读方式打开数据库，具体代码如下：

Set Conn = CreateObject("ADODB.Connection")
Conn.Mode = 8
Conn.Open "Provider=Microsoft.Jet.oledb.4.0;Data Source="&NetBox.MapPath("test.mdb")

使用只读方式打开数据库时，数据库将被以临时文件的方式建立在临时目录，并且将在数据库关闭时自动删除，在应用程序执行目录将不会产生任何文件。然而这种方式将可能多次生成临时文件，会一定程度的影响性能，如果需要频繁使用数据库，而且对性能有所要求，还是建议不要这样使用。


与 Internet Information Server 的兼容性

NetBox 在最大程度上尽可能与 iis 做到兼容，以减少用户在代码移植方便的投入。然而还是没有做到完全兼容。这里列出的就是常见的兼容问题。

相关内容

  • 兼容：NetBox 不支持 runat=server 的语法
  • 兼容：shtml 文件不能被正确处理
  • 兼容：global.asa 不能被处理
  • 兼容：专为 iis 设计的 com 组件将不能使用


兼容：NetBox 不支持 runat=server 的语法

在有些 asp 程序中，因为种种原因，会有一些这样的代码：

<script runat=server>
……………
</script>

<object runat=server ……>

这样的代码在 NetBox 目前的版本中是不能被正常运行的。因为目前 NetBox 还不支持象 script runat=server 这样的语法。

解决方法

解决此类问题的方法是将 <script runat=server> 更换为 <% 格式语法。而 <object runat=server 可以更换成自行创建对象。

开发计划

NetBox 将在以后的版本中支持这种语法，但是最近将不会提供支持。


兼容：shtml 文件不能被正确处理

shtml 是一种需要简单处理的静态文件，在目前的 NetBox 版本中未提供相关支持。

解决方法

无。如果你需要使用目前的 NetBox 版本，请将 shtml 处理成独立的 html。

开发计划

NetBox 将在以后的版本中支持 shtml 文件，但是最近将不会提供支持。


兼容：global.asa 不能被处理

global.asa 是 iis 用于在初始化应用和初始化会话的时候允许程序员编程做相应初始化的接口文件。在 NetBox 目前的版本中，此文件将不被处理。

解决方法

global.asa 主要由两部分组成，一部分是应用的初始化。因为 NetBox 应用的初始化本身就是由程序员自行编程的，在 main.box 中完成。同样，应用的初始化也可以在 main.box 中直接完成，不需要再使用 global.asa 来实现。

另外一个部分是用户会话的初始化，主要由两个事件实现。在 NetBox 中，实现这些事件的方式是通过 EventSink 来实现。可以将 global.asa 中关于会话初始化部分的代码改写成为 EventSink 要求的格式即可。

开发计划

NetBox 将在以后的版本中兼容支持 global.asa，但是最近将不会提供支持。


兼容：专为 iis 设计的 com 组件将不能使用

因为 NetBox 目前的实现方式与 iis 不同，所以当使用一些特别为 iis 设计的组件时将不能成功运行。原因是 NetBox 未调用这些组件的初始化，也未提供这些组件所使用的 Interface。

解决方法

此类组件最经常是用于扩充 asp 功能的，比如上传文件、发送邮件、二进制文件处理、加密处理、等等，这些组件 NetBox 都已经内部直接支持。对于 NetBox 中未提供相应支持的组件，需要修改组件才能与 NetBox 共同执行。

另外还有一些此类组件，是用于加密隐藏代码而编写的，大部分是使用 vb 书写的组件，此类组件的使用将大大降低服务器的性能。而在 NetBox 中，因为本身就是编译运行，所以根本不存在此类问题。

开发计划

NetBox 将在以后的版本中支持全部的接口和调用，允许直接使用这些 com 组件，但是最近将不会提供支持。


对象参考

对象 | 说 明
Application | 可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟目录及其子目录中定义。因为多个用户可以共享 Application 对象，所以必须要有 Lock 和 Unlock 方法以确保多个用户无法同时改变某一属性。
Arguments | 命令行分析工具，用于将命令行分解成为一组命令参数
Browser | 查询访问者的浏览器类型及其特性
Cipher | 对称密钥加密算法对象
Comm | 串口通讯对象，可以对串口进行修改配置和读写操作
Console | 缺省控制台对象，提供基于命令行的程序控制台输入输出功能
Database | 提供对 SQLite 数据库的基本操作，用于建立独立与环境的数据库应用
Dictionary | 存储数据键和项目对的对象，数据键为一个字符串，项目可以是任何数据类型
Encoding | 提供一组常用的编码与解码功能
File | 文件访问对象，可对文件进行文本和二进制操作，也可以使用 url 直接访问互联网资源
FileInfo | 查询文件的属性
FileSystem | 文件系统操作对象，可操作文件夹、文件等文件系统对象
FolderInfo | 查询文件夹的属性
Hash | 报文摘要算法
HtmlWindow | 用于创建一个 WEB Base 的桌面应用程序
Http | 使用 HTTP(超级文本传输协议) 传输数据
HttpServer | 创建一个 HTTP 服务器，支持虚拟服务器、SSL、服务器脚本
HttpServerHost | 设定 HttpServer 服务器的虚拟主机信息，允许对不同的虚拟主机设定不同的运行方式
Identity | 数据标识生成对象，用于统一管理、生成唯一的数据标识
JobServer | 任务服务器，建立线程池来完成大量重复的任务
List | 可随机访问的动态数组对象，可以任意增大和缩小数组尺寸
MessageColl | 消息对象，可用于创建、管理、保存消息
MessageManager | 多语种消息管理对象，可用于创建、管理、保存多语种消息
NetBox | NetBox 对象是 NetBox 的基本对象，在主运行程序、asp 程序和 wsc 对象中均可直接使用，用于访问系统通用对象。可以使用 NetBox 对象在整个 NetBox 应用中共享数据。NetBox 对象可以多个用户同时操作，所以可以使用 Lock 和 Unlock 对 NetBox 对象进行加锁和解锁。
ObjectContext | ObjectContext 对象用于中止或者提交当前的事务，只有使用 #transaction 或 @TRANSACTION 成功创建或者加入事务后才能够访问
PipeLine | 双向管道对象，可进行双向数据传输
Queue | 可双向存取的队列，通过不同的存取方式，可以构造出队列和堆栈等数据模型
Random | 生成高随机性的数据块
Recordset | 数据库结果集，用于返回、传递 SQLite 数据库结果集
Request | Request 对象在 HTTP 请求期间，检索客户端浏览器传递给服务器的值
Response | 使用 Response 对象可以将输出发送到客户端
RSA | 非对称加密算法 RSA 加密解密对象
Script | 支持在程序中创建一个新的脚本运行环境，并可以实现对其的完全控制
ScriptError | ScriptError 用于传递 Script 对象的错误信息
ScriptObject | 支持在程序中创建一个脚本部件运行环境，并可以实现对其的完全控制
Server | Server 对象提供对服务器上的方法和属性的访问，其中大多数方法和属性是作为实用程序的功能服务的
Service | 提供用于创建服务程序的一组工具
Session | 存储特定用户会话所需的信息，当用户在应用程序的 Web 页之间跳转时，存储在 Session 对象中的变量将不会丢失，而是在整个用户会话中一直存在下去
Shell | Shell 对象是 NetBox 主程序的内建对象，用于提供基本运行平台所需要的外部设备
Smtp | 使用 SMTP(简单邮件发送协议) 发送邮件
Socket | 提供 TCP 的控制与读写操作，同时支持底层的二进制读写和高级的字符流处理
Stream | 标准 Stream 代理对象
Struct | 自定义简单对象，可以自行注册一个包含指定属性的对象以方便使用
SysInfo | 系统信息对象。用于采集系统硬件、软件信息
TcpServer | 创建一个 TCP 服务器，可以方便地创建高性能的多线程服务器


基本对象参考

对象 | 说 明
Arguments | 命令行分析工具，用于将命令行分解成为一组命令参数
Console | 缺省控制台对象，提供基于命令行的程序控制台输入输出功能
Encoding | 提供一组常用的编码与解码功能
FileInfo | 查询文件的属性
FileSystem | 文件系统操作对象，可操作文件夹、文件等文件系统对象
FolderInfo | 查询文件夹的属性
NetBox | NetBox 对象是 NetBox 的基本对象，在主运行程序、asp 程序和 wsc 对象中均可直接使用，用于访问系统通用对象。可以使用 NetBox 对象在整个 NetBox 应用中共享数据。NetBox 对象可以多个用户同时操作，所以可以使用 Lock 和 Unlock 对 NetBox 对象进行加锁和解锁。
Service | 提供用于创建服务程序的一组工具
Shell | Shell 对象是 NetBox 主程序的内建对象，用于提供基本运行平台所需要的外部设备
SysInfo | 系统信息对象。用于采集系统硬件、软件信息


Arguments 对象

命令行分析工具，用于将命令行分解成为一组命令参数

语法

Set Args = CreateObject("NetBox.Arguments")

属性

CommandLine | 初始化新命令行到 Arguments 对象中
Items | 以数组方式返回对象中的全部项目

方法

Count 取得 Arguments 对象中参数的总个数

注释

在主程序 main.box 中可以使用 Shell.Arguments 直接访问系统运行的命令行参数。Shell.Arguments 即为一个已经预定义并初始化的 Arguments 实例。

通过访问 Shell.Arguments 可以取得全部的参数，包含运行程序的名称。

示例

下面的代码创建一个新的 Arguments 并初始化，然后读取并显示全部的参数。

Set Args = CreateObject("NetBox.Arguments")

Args.CommandLine = "Test.box -i -n -d"

For i = 1 To Args.Count
    Shell.Console.WriteLine Args(i)
Next

程序运行结果为：

Test.box
-i
-n
-d

应用于

Shell 对象


Arguments.CommandLine 属性

CommandLine 属性

初始化新命令行到 Arguments 对象中

语法

object.CommandLine = cmdLine

参数

object
Arguments 对象

注释

object.CommandLine 以空格为分割符，同时如果命令行中出现引号(")，则将两个引号(")中的字符作为一个完整的参数。

例如：
Test.box -i -n -d
将被分割为 "Test.box", "-i", "-n", "-d"
而 Test.box "-i -n" -d
则被分割为 "Test.box", "-i -n", "-d"

应用于

Arguments 对象


Collection.Items 属性

Items 属性

以数组方式返回对象中的全部项目

语法

obj.Items()

参数

obj
一个实例化的对象

应用于

Arguments 对象 | Dictionary 对象 | Identity 对象 | List 对象 | Queue 对象


Arguments.Count 方法

Count 方法

取得 Arguments 对象中参数的总个数

语法

object.Count

参数

object
Arguments 对象

应用于

Arguments 对象


Console 对象

缺省控制台对象，提供基于命令行的程序控制台输入输出功能

语法

Shell.Console[.property|method]

属性

Caption | 取得和设定控制台窗口的标题
CodePage | 查询或者设定流对象的代码页

方法

ReadLine | 从流对象中读取行字符串
ReadRawLine | 从流中读取一个行字符串，然后直接以二进制方式返回
ReadText | 从流对象中读取给定数量的字符，以字符串方式返回
WriteBlankLines | 输出指定数量的空行到流对象中
WriteLine | 向当前流对象中写入一个字符串，然后写入换行字符
WriteText | 向当前流对象写入一个字符串

注释

Console 包含在主程序 main.box 预设对象 Shell 中，提供对控制台的访问。程序开始运行时控制台将处于隐藏状态，当程序首次访问 Shell.Console 时将自动显示。

应用于

Shell 对象


Console.Caption 属性

Caption 属性

取得和设定控制台窗口的标题

语法

Shell.Console.Caption = strText

参数

strText
要设定为标题的字符串

示例

下面的代码将控制台的标题设定为软件的版本信息：

Shell.Console.Caption = NetBox.Version

应用于

Console 对象


Stream.CodePage 属性

CodePage 属性

查询或者设定流对象的代码页

语法

stream.CodePage[ = cp]

参数

stream
一个实例化的流对象

cp
要设定的代码页

注释

通过修改流对象的代码页，可以以不同语种读取和写入流对象，受影响的方法有：ReadLine、WriteLine、 ReadText、WriteText 四个方法。缺省的代码页为 0，即使用系统缺省的代码页。

示例

下面的例子从一个国标汉字(GB2312)的流中读取字符，并转写到另外一个 UTF8 的流中：

stm1.CodePage = 936
stm2.CodePage = 65001
Do While Not stm1.EOS
    stm2.WriteText stm1.ReadLine & vbCrLf
Loop

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.ReadLine 方法

ReadLine 方法

从流对象中读取行字符串

语法

string = stream.ReadLine

参数

string
返回读取的字符串

stream
一个实例化的流对象

注释

此方法将以行为单位从流中读取字符串，对象将根据 CodePage 所指定的代码页来转换语种。由于此方法属于缓冲操作，实际从流中读取的数据可能会多于返回的数据，剩余的数据将保存在对象中，以便于后面的操作读取。

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.ReadRawLine 方法

ReadRawLine 方法

从流中读取一个行字符串，然后直接以二进制方式返回

语法

str = stream.ReadRawLine

参数

str
返回二进制字符串

stream
一个实例化的 Stream 对象

注释

ReadRawLine 用于从流对象中直接读取一行二进制字符串，输出数据未进行 unicode 转换，需要自行进行处理。

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.ReadText 方法

ReadText 方法

从流对象中读取给定数量的字符，以字符串方式返回

语法

string = stream.ReadText

参数

string
返回读取的字符串

stream
一个实例化的流对象

注释

此方法从流中读取指定数量的字符，以字符串方式返回，对象将根据 CodePage 所指定的代码页来转换语种。由于此方法属于缓冲操作，实际从流中读取的数据可能会多于返回的数据，剩余的数据将保存在对象中，以便于后面的操作读取。

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.WriteBlankLines 方法

WriteBlankLines 方法

输出指定数量的空行到流对象中

语法

stream.WriteBlankLines nLines

参数

stream
一个实例化的流对象

nLines
输出的行数，缺省为 1

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.WriteLine 方法

WriteLine 方法

向当前流对象中写入一个字符串，然后写入换行字符

语法

stream.WriteLine[ string]

参数

stream
一个实例化的流对象

string
给定的要写入的字符串，如果不指定，则写入一个空行

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.WriteText 方法

WriteText 方法

向当前流对象写入一个字符串

语法

stream.WriteText string

参数

stream
一个实例化的流对象

string
给定的要写入的字符串

应用于

Console 对象 | Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Encoding 对象

提供一组常用的编码与解码功能

语法

NetBox.Encoding[.method]

方法

Base32Decode | 将输入的一个以 BASE32 方式编码的字符串解码为一个二进制数据块
Base32Encode | 将输入的二进制数据块以 BASE32 方式编码成为一个字符串
Base64Decode | 将输入的一个以 BASE64 方式编码的字符串解码为一个二进制数据块
Base64Encode | 将输入的二进制数据块以 BASE64 方式编码成为一个字符串
BinToStr | 将以指定的代码页编码的给定的字符串(以二进制方式存储)转换成统一码(UNICODE)字符串
CsvDecode | 将输入的一个以 CSV 格式编码的一行字符串解码为一个一维数组
CsvEncode | 以 CSV 格式编码一个一维数组为一个字符串
Deflate | 使用 deflate 标准压缩算法压缩一个数据块
HexDecode | 将输入的一个以 16 进制方式编码的字符串解码为一个二进制数据块
HexEncode | 将输入的二进制数据块以 16 进制方式编码成为一个字符串
HtmlEncode | 此方法以 HTML 格式编码一个给定的字符串
HtmlFormat | 格式化一个 HTML 文本为“安全”文本
Inflate | 使用标准的 deflate 算法解压缩一个数据块
JSEncode | 将给定的字符串以 Javascript 字符串格式编码
SQLEncode | 按照 SQL 语法字符串格式加码给定的字符串
StrToBin | 将给定的统一码(UNICODE)字符串以指定的代码页(CodePage)编码成本地码，以二进制方式存储结果
UrlDecode | 将给定的以 URL 格式编码的字符串解码成普通字符串
UrlEncode | 将给定的字符串以 URL 格式进行编码
xmlEncode | 此方法以 xml 编码方式编码一个给定的字符串

应用于

NetBox 对象


Encoding.Base32Decode 方法

Base32Decode 方法

将输入的一个以 BASE32 方式编码的字符串解码为一个二进制数据块

语法

variant = NetBox.Encoding.Base32Decode(base32String)

参数

variant
二进制数据块，数据类型为 VT_ARRAY | VT_UI1。

base32String
以 BASE32 方式编码的字符串

应用于

Encoding 对象


Encoding.Base32Encode 方法

Base32Encode 方法

将输入的二进制数据块以 BASE32 方式编码成为一个字符串

语法

base32String = NetBox.Encoding.Base32Encode(variant[, varLineBreak])

参数

base64String
以 BASE32 方式编码的字符串

variant
二进制数据块，数据类型为 VT_ARRAY | VT_UI1。

varLineBreak
指定编码后字符串每行的字符数，最大 76 字符，缺省为不换行

应用于

Encoding 对象


Encoding.Base64Decode 方法

Base64Decode 方法

将输入的一个以 BASE64 方式编码的字符串解码为一个二进制数据块

语法

variant = NetBox.Encoding.Base64Decode(base64String)

参数

variant
二进制数据块，数据类型为 VT_ARRAY | VT_UI1。

base64String
以 BASE64 方式编码的字符串

应用于

Encoding 对象


Encoding.Base64Encode 方法

Base64Encode 方法

将输入的二进制数据块以 BASE64 方式编码成为一个字符串

语法

base64String = NetBox.Encoding.Base64Encode(variant[, varLineBreak])

参数

base64String
以 BASE64 方式编码的字符串

variant
二进制数据块，数据类型为 VT_ARRAY | VT_UI1。

varLineBreak
指定编码后字符串每行的字符数，最大 76 字符，缺省为不换行

应用于

Encoding 对象


Encoding.BinToStr 方法

BinToStr 方法

将以指定的代码页编码的给定的字符串(以二进制方式存储)转换成统一码(UNICODE)字符串

语法

string = NetBox.Encoding.BinToStr(variant[, varCP])

参数

string
返回的 UNICODE 字符串

variant
以指定的代码页编码的字符串，以二进制方式存储，数据类型为 VT_ARRAY | VT_UI1

varCP
指定的代码页，缺省为系统缺省代码页

应用于

Encoding 对象


Encoding.CsvDecode 方法

CsvDecode 方法

将输入的一个以 CSV 格式编码的一行字符串解码为一个一维数组

语法

array = NetBox.Encoding.CsvDecode(CsvString)

参数

array
解码所得的一维数组

CsvString
以 CSV 格式编码的字符串

应用于

Encoding 对象


Encoding.CsvEncode 方法

CsvEncode 方法

以 CSV 格式编码一个一维数组为一个字符串

语法

CsvString = NetBox.Encoding.CsvEncode(array)

参数

CsvString
以 CSV 格式编码的字符串

array
给定的一维数组

应用于

Encoding 对象


Encoding.Deflate 方法

Deflate 方法

使用 deflate 标准压缩算法压缩一个数据块

语法

varRet = NetBox.Encoding.Deflate(varData)

参数

varRet
返回已经压缩的数据块

varData
给定要压缩的数据块

应用于

Encoding 对象


Encoding.HexDecode 方法

HexDecode 方法

将输入的一个以 16 进制方式编码的字符串解码为一个二进制数据块

语法

variant = NetBox.Encoding.HexDecode(HexString)

参数

variant
二进制数据块，数据类型为 VT_ARRAY | VT_UI1。

HexString
以 16 进制方式编码的字符串

应用于

Encoding 对象


Encoding.HexEncode 方法

HexEncode 方法

将输入的二进制数据块以 16 进制方式编码成为一个字符串

语法

HexString = NetBox.Encoding.HexEncode(variant[, varLineBreak])

参数

HecString
以 16 进制方式编码的字符串

variant
二进制数据块，数据类型为 VT_ARRAY | VT_UI1。

varLineBreak
指定编码后字符串每行的字符数，最大 76 字符，缺省为不换行

应用于

Encoding 对象


Encoding.HtmlEncode 方法

HtmlEncode 方法

此方法以 HTML 格式编码一个给定的字符串

语法

HtmlString = NetBox.Encoding.HtmlEncode(string)

参数

HtmlString
经过编码的字符串

string
给定的需要编码的字符串

示例

下面的脚本程序

<%= NetBox.Encoding.HTMLEncode("The paragraph tag: <P>")%>

将输出下面的文字

The paragraph tag: &lt;P&gt;

经过浏览器自动解码，将现实下面的现实内容

The paragraph tag: <P>

如果你使用 View Source 察看页面的代码，将看到经过编码的文本。

应用于

Encoding 对象


Encoding.HtmlFormat 方法

HtmlFormat 方法

格式化一个 HTML 文本为“安全”文本

语法

HtmlString = NetBox.Encoding.HtmlFormat(string)

参数

HtmlString
经过格式化的 HTML 字符串

string
给定的需要格式化的 HTML 字符串

注释

此方法格式化指定的 HTML 文本，修补不完整的 HTML，删除不“安全”的 HTML 项目，如 script 等，最终返回一个可以直接使用的 HTML。此方法通常用于处理用户输入的 HTML 文本，以防止用户输入的 HTML 在显示时产生有意无意的攻击性或破坏性行为。

应用于

Encoding 对象


Encoding.Inflate 方法

Inflate 方法

使用标准的 deflate 算法解压缩一个数据块

语法

varRet = NetBox.Encoding.Inflate(varData)

参数

varRet
返回解压缩的数据块

varData
给定的已经压缩的数据块

应用于

Encoding 对象


Encoding.JSEncode 方法

JSEncode 方法

将给定的字符串以 Javascript 字符串格式编码

语法

JSString = NetBox.Encoding.JSEncode(string)

参数

JSString
已经经过编码的字符串

string
给定的需要编码的字符串

注释

以 Javascript 字符串方式编码将方便地在服务器端生成客户端 Javascript 代码中的字符串。通过将字符串中非安全的字符转换成使用转义符 "\" 表示的合法 Javascript 字符，可以直接在 Javascript 程序中使用。

示例

下面的脚本程序

<script>
    document.write("<%=NetBox.Encoding.JSEncode("c:\Windows\System32")%>");
</script>

将输出下面的文字

<script>
    document.write("c:\\Windows\\System32");
</script>

经过浏览器执行，将现实下面的现实内容

c:\\Windows\\System32

如果你使用 View Source 察看页面的代码，将看到未运行的 Javascript 中的字符串已经经过编码成为合法字符串。

应用于

Encoding 对象


Encoding.SQLEncode 方法

SQLEncode 方法

按照 SQL 语法字符串格式加码给定的字符串

语法

string = NetBox.Encoding.SQLEncode(variant)

注释

如果输入参数是字符串，则返回结果中替换 ' 为 ''，如果输入参数为日期类型，则返回 'YYYY-MM-DD HH-MM-SS' 格式的字符串。

应用于

Encoding 对象


Encoding.StrToBin 方法

StrToBin 方法

将给定的统一码(UNICODE)字符串以指定的代码页(CodePage)编码成本地码，以二进制方式存储结果

语法

variant = NetBox.Encoding.StrToBin(string[, varCP])

参数

variant
以指定的代码页编码的字符串，以二进制方式存储，数据类型为 VT_ARRAY | VT_UI1

string
返回的 UNICODE 字符串

varCP
指定的代码页，缺省为系统缺省代码页

应用于

Encoding 对象


Encoding.UrlDecode 方法

UrlDecode 方法

将给定的以 URL 格式编码的字符串解码成普通字符串

语法

string = NetBox.Encoding.UrlDecode(UrlString)

参数

string
经过解码的普通字符串

UrlString
经过编码的字符串

应用于

Encoding 对象


Encoding.UrlEncode 方法

UrlEncode 方法

将给定的字符串以 URL 格式进行编码

语法

UrlString = NetBox.Encoding.UrlEncode(string)

参数

UrlString
已经经过编码的字符串

string
给定的需要编码的字符串

示例

下面的脚本代码：

<%=NetBox.Encoding.URLEncode("[test]")%>

运行结果为：

%5Btest%5D

应用于

Encoding 对象


Encoding.xmlEncode 方法

xmlEncode 方法

此方法以 xml 编码方式编码一个给定的字符串

语法

xmlString = NetBox.Encoding.xmlEncode(string)

参数

xmlString
经过编码的字符串

string
给定的需要编码的字符串

应用于

Encoding 对象


FileInfo 对象

查询文件的属性

语法

Set fi = NetBox.FileSystem.GetFile(FilePath)

属性

AbsolutePath | 查询文件或者文件夹的绝对路径
Attributes | 查询文件或者文件夹的文件属性
ContentType | 查询文件或者文件夹的 Internet 文件类型
DateCreated | 查询文件或者文件夹的创建日期
DateLastAccessed | 查询文件或者文件夹的最后访问日期
DateLastModified | 查询文件或者文件夹的最后修改日期
Name | 查询文件或者文件夹的文件名，不包含路径
Path | 查询文件或者文件夹的路径
Size | 查询文件或者文件夹的尺寸，文件夹返回 0
Type | 查询文件或者文件夹的文件类型，为操作系统显示类型

参数

fi
文件或者文件夹对象

FilePath
文件路径


FileInfo.AbsolutePath 属性

AbsolutePath 属性

查询文件或者文件夹的绝对路径

语法

path = fi.AbsolutePath

参数

path
返回绝对路径

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.Attributes 属性

Attributes 属性

查询文件或者文件夹的文件属性

语法

attr = fi.Attributes

参数

attr
返回文件属性

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.ContentType 属性

ContentType 属性

查询文件或者文件夹的 Internet 文件类型

语法

type = fi.ContentType

参数

type
返回文件类型

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.DateCreated 属性

DateCreated 属性

查询文件或者文件夹的创建日期

语法

date = fi.DateCreated

参数

date
返回日期

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.DateLastAccessed 属性

DateLastAccessed 属性

查询文件或者文件夹的最后访问日期

语法

date = fi.DateLastAccessed

参数

date
返回日期

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.DateLastModified 属性

DateLastModified 属性

查询文件或者文件夹的最后修改日期

语法

date = fi.DateLastModified

参数

date
返回日期

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.Name 属性

Name 属性

查询文件或者文件夹的文件名，不包含路径

语法

name = fi.Name

参数

name
返回文件名

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.Path 属性

Path 属性

查询文件或者文件夹的路径

语法

path = fi.Path

参数

path
返回路径

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.Size 属性

Size 属性

查询文件或者文件夹的尺寸，文件夹返回 0

语法

size = fi.Size

参数

size
返回尺寸

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileInfo.Type 属性

Type 属性

查询文件或者文件夹的文件类型，为操作系统显示类型

语法

type = fi.Type

参数

type
返回类型

fi
文件或者文件夹对象

应用于

FileInfo 对象 | FolderInfo 对象


FileSystem 对象

文件系统操作对象，可操作文件夹、文件等文件系统对象

语法

NetBox.FileSystem[.method](variable)

方法

BuildPath | 在已存在路径后追加名称，如果需要，会在已有路径和名称之间另外再插入一个路径分隔符
CopyFile | 从一个位置向另一个位置复制一个文件
CreateFolder | 创建文件夹
DeleteFile | 删除指定文件
DeleteFolder | 删除指定的文件夹
FileExists | 如果指定文件存在返回 True ;否则返回 False
GetBaseName | 返回路径中文件名中的基本名称，不包含文件扩展名
GetExtensionName | 返回包含路径中文件名的扩展名
GetFile | 查询指定文件的文件信息
GetFileName | 返回包含路径中文件名
GetFolder | 查询指定文件夹的文件信息
GetFullPathName | 根据给定的路径返回其完整路径
GetParentFolderName | 根据指定路径中的最后成分返回包含其父文件夹名称的字符串
GetTempName | 返回一个随机产生的临时文件或文件夹名，有助于执行那些需要临时文件或文件夹的操作
IsFolder | 如果指定的文件名是路径则返回 True ；否则返回 False
MapPath | 根据虚拟路径影射系统路径
MoveFile | 从一个位置向另一个位置移动一个文件或文件夹，或者将一个文件或文件夹改名
SetFileAttributes | 设定给定文件或者文件夹的属性

应用于

NetBox 对象


FileSystem.BuildPath 方法

BuildPath 方法

在已存在路径后追加名称，如果需要，会在已有路径和名称之间另外再插入一个路径分隔符

语法

newpath = NetBox.FileSystem.BuildPath(path[, name])

参数

newpath
返回添加后的结果

path
将被追加 name 的路径

name
被追加到已存在的 path 后的名称

应用于

FileSystem 对象


FileSystem.CopyFile 方法

CopyFile 方法

从一个位置向另一个位置复制一个文件

语法

NetBox.FileSystem.CopyFile source, destination[, overwrite]

参数

source
指定源文件字符串

destination
指定目的文件字符串

overwrite
可选项。Boolean 值，指明是否覆盖已有文件。如果为 true ，则文件将被覆盖；如果为 false ，则文件不会被覆盖。默认的是 true

应用于

FileSystem 对象


FileSystem.CreateFolder 方法

CreateFolder 方法

创建文件夹

语法

NetBox.FileSystem.CreateFolder foldername

参数

foldername
字符串表达式，标识所要创建的文件夹

应用于

FileSystem 对象


FileSystem.DeleteFile 方法

DeleteFile 方法

删除指定文件

语法

NetBox.FileSystem.DeleteFile filespec[, bForce]

参数

filespec
删除的文件的名称

bForce
强制删除只读文件，为 True 则强制，缺省为 False

应用于

FileSystem 对象


FileSystem.DeleteFolder 方法

DeleteFolder 方法

删除指定的文件夹

语法

NetBox.FileSystem.DeleteFolder foldername

参数

foldername
要删除的文件夹的名称

应用于

FileSystem 对象


FileSystem.FileExists 方法

FileExists 方法

如果指定文件存在返回 True ;否则返回 False

语法

NetBox.FileSystem.FileExists(filespec)

参数

filespec
需要判定是否存在的文件的名称

应用于

FileSystem 对象


FileSystem.GetBaseName 方法

GetBaseName 方法

返回路径中文件名中的基本名称，不包含文件扩展名

语法

name = NetBox.FileSystem.GetBaseName(path)

参数

name
返回基本名称

path
给定的文件名

应用于

FileSystem 对象


FileSystem.GetExtensionName 方法

GetExtensionName 方法

返回包含路径中文件名的扩展名

语法

ext = NetBox.FileSystem.GetExtensionName(path)

参数

ext
返回取得的扩展名

path
给定的文件名

应用于

FileSystem 对象


FileSystem.GetFile 方法

GetFile 方法

查询指定文件的文件信息

语法

Set fi = NetBox.FileSystem.GetFile(FilePath)

参数

fi
文件对象，参见 FileInfo 对象

FilePath
文件路径

应用于

FileSystem 对象


FileSystem.GetFileName 方法

GetFileName 方法

返回包含路径中文件名

语法

name = NetBox.FileSystem.GetFileName(path)

参数

name
返回查询的文件名

path
给定的文件名

应用于

FileSystem 对象


FileSystem.GetFolder 方法

GetFolder 方法

查询指定文件夹的文件信息

语法

Set fi = NetBox.FileSystem.GetFolder(FilePath)

参数

fi
文件夹对象，参见 FolderInfo 对象

FilePath
文件路径

应用于

FileSystem 对象


FileSystem.GetFullPathName 方法

GetFullPathName 方法

根据给定的路径返回其完整路径

语法

fullPath = NetBox.FileSystem.GetFullPathName(path)

参数

fullPath
返回完整的路径名称

path
给定的文件名

应用于

FileSystem 对象


FileSystem.GetParentFolderName 方法

GetParentFolderName 方法

根据指定路径中的最后成分返回包含其父文件夹名称的字符串

语法

folder = NetBox.FileSystem.GetParentFolderName(path)

参数

folder
返回上级目录的名称

path
给定的文件名

应用于

FileSystem 对象


FileSystem.GetTempName 方法

GetTempName 方法

返回一个随机产生的临时文件或文件夹名，有助于执行那些需要临时文件或文件夹的操作

语法

name = NetBox.FileSystem.GetTempName[(path)]

参数

name
返回临时文件名称

path
指定临时文件的目录，如省略则使用系统临时目录

应用于

FileSystem 对象


FileSystem.IsFolder 方法

IsFolder 方法

如果指定的文件名是路径则返回 True ；否则返回 False

语法

NetBox.FileSystem.IsFolder(path)

参数

path
给定的文件名

应用于

FileSystem 对象


FileSystem.MapPath 方法

MapPath 方法

根据虚拟路径影射系统路径

语法

newPath = NetBox.FileSystem.MapPath(path)

参数

newPath
返回影射过的系统路径

path
指定的虚拟路径

应用于

FileSystem 对象


FileSystem.MoveFile 方法

MoveFile 方法

从一个位置向另一个位置移动一个文件或文件夹，或者将一个文件或文件夹改名

语法

NetBox.FileSystem.MoveFile source, destination

参数

source
指定源文件字符串

destination
指定目的文件字符串

应用于

FileSystem 对象


FileSystem.SetFileAttributes 方法

SetFileAttributes 方法

设定给定文件或者文件夹的属性

语法

NetBox.FileSystem.SetFileAttributes path, attr

参数

path
指定的要修改属性的文件名

attr
指定新的属性

注释

attr 可以为下面一个或者多个属性相加的结果

数值 | 属性
0 | 普通文件。不设置属性
1 | 只读文件
2 | 隐藏文件
4 | 系统文件

应用于

FileSystem 对象


FolderInfo 对象

查询文件夹的属性

语法

Set fi = NetBox.FileSystem.GetFolder(FilePath)

集合

Files | 返回文件夹当前目录下的全部文件列表
SubFolders | 返回文件夹当前目录下的全部子文件夹列表

属性

AbsolutePath | 查询文件或者文件夹的绝对路径
Attributes | 查询文件或者文件夹的文件属性
ContentType | 查询文件或者文件夹的 Internet 文件类型
DateCreated | 查询文件或者文件夹的创建日期
DateLastAccessed | 查询文件或者文件夹的最后访问日期
DateLastModified | 查询文件或者文件夹的最后修改日期
IsModified | 查询文件夹中是否创建新文件，或者其中文件被修改
Name | 查询文件或者文件夹的文件名，不包含路径
Path | 查询文件或者文件夹的路径
Size | 查询文件或者文件夹的尺寸，文件夹返回 0
Type | 查询文件或者文件夹的文件类型，为操作系统显示类型

参数

fi
文件或者文件夹对象

FilePath
文件路径


FolderInfo.Files 集合

Files 集合

返回文件夹当前目录下的全部文件列表

语法

Set fs = fi.Files

参数

fs
返回文件列表

fi
指定的文件夹对象

注释

此属性所返回的集合对象为一列表对象，使用 Count 属性返回其包含内容数量，使用 fs(n) 访问其中的内容。其内容为一 FileInfo 对象。

应用于

FolderInfo 对象


FolderInfo.SubFolders 集合

SubFolders 集合

返回文件夹当前目录下的全部子文件夹列表

语法

Set fs = fi.SubFolders

参数

fs
返回子文件夹列表

fi
指定的文件夹对象

注释

此属性所返回的集合对象为一列表对象，使用 Count 属性返回其包含内容数量，使用 fs(n) 访问其中的内容。其内容为一 FolderInfo 对象。

应用于

FolderInfo 对象


FolderInfo.IsModified 属性

IsModified 属性

查询文件夹中是否创建新文件，或者其中文件被修改

语法

bModify = fi.IsModified

参数

bModify
返回是否修改，为 True 则修改过

fi
文件或者文件夹对象

注释

一旦文件夹内容被修改过，则此属性一直为 True。如果需要继续监控内容是否修改，可以重新调用 GetFilder 得到新的对象。

应用于

FolderInfo 对象


NetBox 对象

NetBox 对象是 NetBox 的基本对象，在主运行程序、asp 程序和 wsc 对象中均可直接使用，用于访问系统通用对象。可以使用 NetBox 对象在整个 NetBox 应用中共享数据。NetBox 对象可以多个用户同时操作，所以可以使用 Lock 和 Unlock 对 NetBox 对象进行加锁和解锁。

语法

NetBox[.collection|property|method](variable)

对象

Encoding | 提供一组常用的编码与解码功能
FileSystem | 文件系统操作对象，可操作文件夹、文件等文件系统对象
SysInfo | 系统信息对象。用于采集系统硬件、软件信息

集合

Contents | 基本集合，使用标准内部对象 Dictionary 存放数据
Scripts | 查询当前正在运行的脚本列表

属性

ApplicationName | 只读属性，取当前执行程序的绝对路径字符串，包括路径和程序名称
ApplicationPath | 只读属性，取当前执行程序的执行路径字符串
Config | 访问 NetBox 配置文件，缺省文件名称为与执行文件同名的 .ini 文件。可以使用 ConfigFile 属性修改文件名
ConfigFile | 取得和设定 NetBox 缺省配置文件的名称
ScriptName | 只读属性，取当前执行的脚本程序路径字符串
Version | 只读属性，读取 NetBox 的版本信息

方法

AppActivate | 激活指定标题的窗口成为活动窗口
CreateObject | 创建一个新对象实例，可以创建系统注册对象，NetBox 内部对象，可注册 wsc 内部对象
Lock | 阻止其他用户对关键的 NetBox 进行操作，同一之间只允许一个用户进行操作。对于 asp 程序，程序退出的时候会自动释放对于 NetBox 的锁
LoadLibrary | 将一个代码库装载进入运行系统
LoadObject | 装载一个脚本部件，返回经过初始化的脚本部件
MapPath | 根据虚拟路径影射系统路径
RegisterClass | 在 NetBox 中注册一个 wsc 文件或者是一个简单对象
Sleep | 程序运行暂停给定的时间
Unlock | 阻止其他用户对关键的 NetBox 进行操作，同一之间只允许一个用户进行操作。对于 asp 程序，程序退出的时候会自动释放对于 NetBox 的锁

注释

你可以在 NetBox 的集合中存储数据，存放在 NetBox 集合中的数据在整个 NetBox 应用中都是可以直接访问的，下面的例子演示存储两种类型的数据：

<%
NetBox("greeting") = "Welcome to My Web World!"
NetBox("num") = 25
%>

你也可以在 NetBox 集合中存储创建的对象， 比如：

<% Set NetBox("Obj1") = CreateObject("MyComponent") %>

然后在整个 NetBox 应用中你均可以直接使用这个对象，使用的方法如下：

<% NetBox("Obj1").MyObjMethod %>

或者将对象赋值给一个局部变量以提高访问速度：

<%
Set MyLocalObj1 = NetBox("Obj1")
MyLocalObj1.MyObjMethod
%>

在很多方面 NetBox 对象很类似于 ASP 中的 Application 对象，而却不同于 Application 对象，Application 对象只限于在一个限定的 WEB 应用中有效，并且不同的 WEB 应用中的 Application 对象相互独立，不能相互操作。所以一般来说 Application 对象用于在某个具体的 WEB 应用中共享数据，而 Netbox 则用于在整个应用中保存和共享状态、对象、数据。

NetBox 对象可以在主运行程序、asp 程序和 wsc 对象中直接引用，在 HTML 对话框等不能直接访问内建对象的环境中，可以使用下面的 VBScript 语句自行创建：

Set NetBox = CreateObject("NetBox")

或者下面的 Javascript 语句：

var NetBox = new ActiveXObject("NetBox");


SysInfo 对象

系统信息对象。用于采集系统硬件、软件信息

语法

NetBox.SysInfo[.collection|method](variable)

属性

Count | 返回一个对象中的项目数，只读属性
Key | 根据下标取得关键字的键值，只读属性

方法

Add | 向系统信息中添加自己的信息
Exists | 如果对象中存在所指定的关键字则返回 true，否则返回 false
Save | 转储对象中的内容到指定的目标
Update | 更新 SysInfo 中的系统信息

注释

可是使用 NetBox.SysInfo 查询当前运行系统的硬件、软件信息，NetBox 版本信息，软件发布指纹等信息。

示例

下面的代码将全部的系统信息输出到控制台。

Set si = NetBox.SysInfo

For each strKey In si
Shell.Console.WriteLine strKey & ": " & si(strKey)
Next

此程序运行结果如下：

OS_Family: Windows NT
OS_Platform: Windows Server 2003, Datacenter Edition
OS_Version: 5.2
OS_BuildNumber: 3790
IE_Version: 6.0.3790.0
IE_UserAgent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)
ADO_Version: 2.80.1022.0
Module_0: D:\share\netbox.exe
Module_1: C:\Program Files\Common Files\System\Ole DB\oledb32.dll
Module_2: C:\Program Files\Common Files\System\Ole DB\OLEDB32R.DLL
Module_3: C:\WINDOWS\system32\rsaenh.dll
Module_4: C:\WINDOWS\system32\SAMLIB.dll
Module_5: C:\WINDOWS\system32\LPK.DLL
Module_6: C:\WINDOWS\WinSxS\X86_Microsoft.Windows.Common-Controls_6595b64144ccf1
df_6.0.100.0_x-ww_8417450B\COMCTL32.dll
Module_7: C:\WINDOWS\system32\uxtheme.dll
Module_8: C:\WINDOWS\system32\WS2HELP.dll
Module_9: C:\WINDOWS\system32\WS2_32.dll
Module_10: C:\WINDOWS\system32\NETAPI32.dll
Module_11: C:\WINDOWS\system32\USP10.dll
Module_12: C:\WINDOWS\system32\vbscript.dll
Module_13: C:\WINDOWS\system32\MFC42.DLL
Module_14: C:\WINDOWS\system32\MSCTF.dll
Module_15: C:\WINDOWS\system32\MSDART.DLL
Module_16: C:\WINDOWS\system32\USERENV.dll
Module_17: C:\WINDOWS\system32\jscript.dll
Module_18: C:\WINDOWS\system32\urlmon.dll
Module_19: C:\WINDOWS\system32\WININET.dll
Module_20: C:\WINDOWS\system32\MSASN1.dll
Module_21: C:\WINDOWS\system32\CRYPT32.dll
Module_22: C:\WINDOWS\system32\IMM32.DLL
Module_23: C:\WINDOWS\system32\comdlg32.dll
Module_24: C:\WINDOWS\system32\SETUPAPI.dll
Module_25: C:\WINDOWS\system32\ATL.DLL
Module_26: C:\WINDOWS\system32\PSAPI.DLL
Module_27: C:\WINDOWS\system32\credui.dll
Module_28: C:\WINDOWS\system32\MPRAPI.dll
Module_29: C:\WINDOWS\system32\iphlpapi.dll
Module_30: C:\WINDOWS\system32\adsldpc.dll
Module_31: C:\WINDOWS\system32\ACTIVEDS.dll
Module_32: C:\WINDOWS\system32\rtutils.dll
Module_33: C:\WINDOWS\system32\WLDAP32.dll
Module_34: C:\WINDOWS\system32\Secur32.dll
Module_35: C:\WINDOWS\system32\CLBCatQ.DLL
Module_36: C:\WINDOWS\system32\COMRes.dll
Module_37: C:\WINDOWS\system32\OLEAUT32.dll
Module_38: C:\WINDOWS\system32\ole32.dll
Module_39: C:\WINDOWS\system32\SHLWAPI.dll
Module_40: C:\WINDOWS\system32\SHELL32.dll
Module_41: C:\WINDOWS\system32\VERSION.dll
Module_42: C:\WINDOWS\system32\msvcrt.dll
Module_43: C:\WINDOWS\system32\GDI32.dll
Module_44: C:\WINDOWS\system32\RPCRT4.dll
Module_45: C:\WINDOWS\system32\USER32.dll
Module_46: C:\WINDOWS\system32\ADVAPI32.dll
Module_47: C:\WINDOWS\system32\kernel32.dll
Module_48: C:\WINDOWS\system32\ntdll.dll
System_LanguageID: 2052
System_Language: Chinese (PRC)
System_Name: LION-PC
System_User: lion
Folder_Windows: C:\WINDOWS
Folder_System: C:\WINDOWS\system32
Folder_Desktop: C:\Documents and Settings\lion\Desktop
Folder_Favorites: \\server\Resource\Favorites
Folder_ProgramFiles: C:\Program Files
Folder_ProgramFilesCommon: C:\Program Files\Common Files
Folder_Programs: C:\Documents and Settings\lion\Start Menu\Programs
Folder_StartMenu: C:\Documents and Settings\lion\Start Menu
Folder_MyDocuments: D:\My Documents
TimeZone_Name: China Standard Time
TimeZone: 8
IP_0: 192.168.65.5
Screen_Width: 1024
Screen_Height: 768
Screen_Color: 32 bit
XPThemeActive: 1
CPU_Family: AuthenticAMD
CPU_Name: AMD Athlon(tm) XP 2500+
CPU_Serial: 000006A0-00000000-00000000
CPU_Number: 1
RAM: 512M
NIC_0: 00:0D:61:44:88:84
IDE_0: 3HR2PNS6
Volume_0: F428-808B
Volume_1: 1862-0948
Volume_2: 0934-0C0C
APP_Version: NetBox Version 2.7 Build 4126
APP_Created: Jun 27 02:43:17 2004
APP_Info: 7C7F3C7E59-EF61-7B0E-59F7-61F065E031

应用于

NetBox 对象


Contents 集合

基本集合，使用标准内部对象 Dictionary 存放数据

语法

obj.Contents

应用于

NetBox 对象 | Application 对象 | Session 对象 | HttpServer 对象 | HttpServerHost 对象 | JobServer 对象 | TcpServer 对象


NetBox.Scripts 集合

Scripts 集合

查询当前正在运行的脚本列表

语法

Set scripts = NetBox.Scripts

注释

Scripts 返回当前正在运行的脚本列表，可以用于查询所有脚本运行的文件名称和错误状态。

应用于

NetBox 对象


NetBox.ApplicationName 属性

ApplicationName 属性

只读属性，取当前执行程序的绝对路径字符串，包括路径和程序名称

语法

appname = NetBox.ApplicationName

参数

appname
返回当前执行程序的完整路径

示例

使用下面的代码可以取得当前运行目录：

apppath = NetBox.ApplicationName
apppath = Left(apppath, InStrRev(apppath, "\"))

应用于

NetBox 对象


NetBox.ApplicationPath 属性

ApplicationPath 属性

只读属性，取当前执行程序的执行路径字符串

语法

path = NetBox.ApplicationPath

参数

path
返回当前执行程序的完整路径

示例

使用下面的代码可以取得当前运行目录：

path = NetBox.ApplicationPath

应用于

NetBox 对象


NetBox.Config 属性

Config 属性

访问 NetBox 配置文件，缺省文件名称为与执行文件同名的 .ini 文件。可以使用 ConfigFile 属性修改文件名

语法

NetBox.Config[(varSection[, varKey)[ = newValue]]]

参数

varSection
指定分类名称的字符串值

varKey
指定项目名称的字符串值

newValue
给定要设定的新值，为空字符串时将删除指定的项目

注释

NetBox.Config 用于对应用的配置文件进行访问，如果需要设定 test 下的 item1 为 100 可以使用下面的代码。

NetBox.Config("test", "item1") = 100

读取配置文件也同样简单，下面的代码取得 test 下的 item1 的内容：

a = NetBox.Config("test", "item1")

如果需要删除项目，可以将指定的项目设定为空字符串：

NetBox.Config("test", "item1") = ""

使用 NetBox.Config 可以取得全部分类的名称，结果以数组方式返回：

SectionList = NetBox.Config

使用 NetBox.Config(varSection) 可以取得指定分类中全部项目的名称，结果以数组方式返回：

KeyList = NetBox.Config("test")

应用于

NetBox 对象


NetBox.ConfigFile 属性

ConfigFile 属性

取得和设定 NetBox 缺省配置文件的名称

语法

NetBox.ConfigFile[= newFileName]

参数

newFileName
给定的新的配置文件的文件名

应用于

NetBox 对象


NetBox.ScriptName 集合

ScriptName 集合

只读属性，取当前执行的脚本程序路径字符串

语法

scriptname = NetBox.ScriptName

参数

scriptname
返回当前脚本程序的路径和文件名

注释

在 .asp 文件和 .box 文件中，此方法返回当前的文件本身；如果是使用 include 包含的文件，此方法返回最顶层的文件名称，而不是被包含文件的文件名；如果是脚本部件 .wsc 程序，则在初始化代码中返回的是脚本部件的文件名，而在脚本部件的方法和属性中返回的是调用者的文件名。

应用于

NetBox 对象


NetBox.Version 属性

Version 属性

只读属性，读取 NetBox 的版本信息

语法

ver = NetBox.Version

参数

ver
返回当前 NetBox 的版本信息

示例

下面的代码将控制台的标题设定为软件的版本信息：

Shell.Console.Caption = NetBox.Version

应用于

NetBox 对象


NetBox.AppActivate 方法

AppActivate 方法

激活指定标题的窗口成为活动窗口

语法

NetBox.AppActivate strTitle

参数

strTitle
指定的窗口标题

应用于

NetBox 对象


NetBox.CreateObject 方法

CreateObject 方法

创建一个新对象实例，可以创建系统注册对象，NetBox 内部对象，可注册 wsc 内部对象

语法

Set obj = NetBox.CreateObject(ProgID)

参数

obj
实例化的对象

ProgID
指定要创建的对象的 ProgID。

注释

可以使用 NetBox.CreateObject 创建一个新的对象实例， NetBox.CreateObject 可以创建的对象分为三种，第一种是已经在系统注册过的标准 COM 对象，作用等同于 VBScript 本身的 CreateObject，比如：

Set rs = NetBox.CreateObject("ADODB.RecordSet")

第二种是 NetBox 内部提供给 Script 使用的标准对象，具体的对象 ProgID 及其使用方法可以参考手册，比如：

Set socket = NetBox.CreateObject("NetBox.Socket")

第三种是以 wsc 格式书写并在 NetBox 内部注册成功的脚本部件，比如：

NetBox.RegisterClass "\wsc\MyClass.wsc"
Set o = NetBox.CreateObject("myclass")

其中 "\wsc\MyClass.wsc" 是以 wsc 格式书写的脚本部件，其 ProgID 为 ''myclass"。

以上三类对象的查找顺序为：

1.wsc 对象
2.NetBox 标准内部对象
3.系统注册的标准 COM 对象

应用于

NetBox 对象


NetBox.Lock 方法

Lock 方法

阻止其他用户对关键的 NetBox 进行操作，同一之间只允许一个用户进行操作。对于 asp 程序，程序退出的时候会自动释放对于 NetBox 的锁

语法

NetBox.Lock([strName])

参数

strName
锁的名称，只有名称相同的锁才会互相锁定，缺省为 ""。

示例

NetBox.Lock
GID = NetBox("Global ID")
NetBox("Global ID") = GID + 1
NetBox.Unlock

这个例子演示了如何在 NetBox 应用中取得一个唯一自增长的数字。如果需要更加具体范围的锁定，可以使用下面的代码：

NetBox.Lock("Global ID")
GID = NetBox("Global ID")
NetBox("Global ID") = GID + 1
NetBox.Unlock("Global ID")

应用于

NetBox 对象


NetBox.LoadLibrary 方法

LoadLibrary 方法

将一个代码库装载进入运行系统

语法

NetBox.LoadLibrary(strPackFileName[, varRoot])

参数

strPackFileName
字符串，经bsc.exe打包后的文件名，一般为*.nbl，如NetBox.nbl，参见 NetBox 的路径系统

varRoot
加载的根路径，缺省为加载至根

应用于

NetBox 对象


NetBox.LoadObject 方法

LoadObject 方法

装载一个脚本部件，返回经过初始化的脚本部件

语法

Set Object = NetBox.LoadObject(strFile[, varGlobal])

参数

Object
取得 ScriptObject 对象所装载的脚本部件

strFile
给定的程序文件名称，参见 NetBox 的路径系统

varGlobal
指定是否在全局线程装载对象，缺省为 False，为私有对象

注释

LoadObject 方法装载一个脚本部件，并返回对象，使用此方法可以装载私有脚本部件，而不需要经过注册创建等过程。其功能与 ScriptObject 对象的 LoadObject 方法相似。

在装载脚本部件时，可以指定部件运行的线程方式，缺省时为当前线程，此时装载进来的对象则不能被其他线程中的脚本正常访问。如果需要装载一个所有脚本都能够直接访问的对象，则需要以全局模式装载脚本部件，通常的方法是以全局模式装载脚本部件，然后将对象保存在 Application 或者其他全局对象中，在其他脚本中则直接取得并使用此对象。

由于全局对象是独立运行的，所以对于全局对象的访问则较私有对象慢一些，但是通常比重新装载一个新对象要快，同时因为全局对象可以在整个运行过程中被保存起来，其中的变量也可以保持，从而被其他访问所使用。

应用于

NetBox 对象


NetBox.MapPath 方法

MapPath 方法

根据虚拟路径影射系统路径

语法

newPath = NetBox.MapPath(path)

参数

newPath
返回影射过的系统路径

path
指定的虚拟路径

注释

有些情况下，需要查询某个文件的系统路径名，比如需要向 ADO 提供数据库的路径，需要在虚拟路径下创建一个文件，等等此类操作。此时可以使用此方法进行影射。

应用于

NetBox 对象


NetBox.RegisterClass 方法

RegisterClass 方法

在 NetBox 中注册一个 wsc 文件或者是一个简单对象

语法

NetBox.RegisterClass strName[, strMembers]

参数

strName
字符串，指定的WSC文件的文件名或者对象的 progid，当为文件名时参见 NetBox 的路径系统

strMembers
简单对象的成员变量名称列表，名称之间以“,”分割

注释

使用 NetBox.RegisterClass 支持直接将 wsc 注册成为 NetBox 内部对象，经过注册，可以在整个 NetBox 对象内部创建使用。当注册 wsc 时，strName 为给定注册的文件名，而 strMembers 则必须忽略。

同时，也可以使用 NetBox.RegisterClass 注册一个简单对象，并指定对象所定义的成员变量。当注册简单对象时，strName 为给定注册对象的 progid，而 strMembers 则为此对象的成员变量名称列表。

关于简单对象的其他用法请参阅 Struct

示例

NetBox.RegisterClass "\wsc\MyClass.wsc"
Set o = CreateObject("myclass")

其中 "\wsc\MyClass.wsc" 是以 wsc 格式书写的脚本部件，其 ProgID 为 "'myclass"。

如果需要注册一个简单变量，可以使用下面的程序：

NetBox.RegisterClass "mySimpleClass", "id,name,age,sex"

Set o = CreateObject("mySimpleClass")
o.id=100
o.Name="张三"
o.age=102
o.sex=true

程序中首先注册一个简单对象 "mySimpleClass"，其成员属性为：id,name,age,sex 共四个，在创建对象后，便可以直接访问这些属性。

应用于

NetBox 对象


NetBox.Sleep 方法

Sleep 方法

程序运行暂停给定的时间

语法

Netbox.Sleep nSleepTime

参数

nSleepTime
指定暂停的时间，以毫秒为单位

示例

下面的例子每 1 秒发声一次，共发 10 次：

For i = 1 To 10
    NetBox.Sleep 1000
    Shell.Beep
Next

应用于

NetBox 对象


NetBox.Unlock 方法

Unlock 方法

阻止其他用户对关键的 NetBox 进行操作，同一之间只允许一个用户进行操作。对于 asp 程序，程序退出的时候会自动释放对于 NetBox 的锁

语法

NetBox.Unlock([strName])

参数

strName
锁的名称，只有名称相同的锁才会互相锁定，缺省为 ""。

示例

NetBox.Lock
GID = NetBox("Global ID")
NetBox("Global ID") = GID + 1
NetBox.Unlock

这个例子演示了如何在 NetBox 应用中取得一个唯一自增长的数字。如果需要更加具体范围的锁定，可以使用下面的代码：

NetBox.Lock("Global ID")
GID = NetBox("Global ID")
NetBox("Global ID") = GID + 1
NetBox.Unlock("Global ID")

应用于

NetBox 对象


Service 对象

提供用于创建服务程序的一组工具

语法

Shell.Service[.property|method]

属性

Description | 服务描述，仅限于 Windows 2000 及以上版本
Desktop | 指定服务时候允许与桌面交互，缺省为 false
DisplayName | 服务显示名称，服务在服务列表中显示的名称
Icon | 加载图标到对象中，支持的图标格式为：BMP (bitmap), JPEG, WMF (metafile), ICO (icon), GIF
Installed | 查询当前服务是否已经安装
Name | 服务名，服务在服务列表中的名称
Running | 查询当前服务是否正在运行
TrayIcon | 查询与设置是否在系统托盘中显示本服务的图标，缺省为显示
Type | 设置和查询服务类型，指定应用安装为服务还是安装为自动运行

方法

AppendCommand | 为服务菜单添加命令
DoEvents | 进入服务事件等待
Install | 将当前的程序安装成为服务
LogEvent | 向系统日志中记录信息，仅 Windows NT 及以上系统支持
Remove | 从系统中删除指定的服务
RunService | 标准的服务支持方法，提供通常的服务安装、卸载、运行的封装
Restart | 重新启动系统中已安装的指定服务
SendCommand | 向指定的服务发送命令
SetTimer | 设定服务的定时器
Start | 启动系统中已安装的指定服务
Stop | 停止系统中以安装的指定服务

事件

OnServiceCommand | 服务命令响应事件
OnServicePause | 服务暂停事件
OnServiceResume | 服务恢复事件
OnServiceStart | 服务初始化事件，仅在使用 RunService 方法建立服务时有效
OnServiceStop | 服务停止事件
OnServiceTimer | 服务定时器事件

注释

Service 作为 Shell 对象的内容，为主程序提供了服务编程的能力，通过使用 Service，可以在系统中安装、卸载服务，记录服务日志，设定定时器等。

Service 对象为不同的系统提供了不同的实现，所以无论在 Windows NT、Windows 2000 上面，还是在 Windows 98、Windows ME 上面都能够很好的运行，Windows 98、Windows ME 除了不支持记录日志以外，其他功能都有相应的实现，在所有的平台上面实现服务所需要的代码是完全相同的，实现了一套代码在不同平台上的移植。

在 Windows NT、Windows 2000 系统上面安装、运行服务时，NetBox 程序将被安装成为系统服务程序，在系统开始运行时自动运行，不需要登录系统。而如果服务程序在桌面被直接执行，则将被以 98 方式执行。关于 98 方式执行的 NetBox 服务，见下面的说明。

当在 Windows 98、Windows ME 系统上面安装、运行服务时，NetBox 程序将被安装成为 98 系统的服务，同样在每次启动系统时自动执行，不需要登录系统。同时，一旦用户登录系统，将在系统 Taskbar 上面建立一个管理图标，用户可以在其上面点鼠标右键进行管理。如果用户退出登录，程序将继续执行，不受影响。

如果需要自行安装一个 NetBox 应用为系统服务程序，比如使用通用安装程序部署应用，需要将服务以下面的命令方式安装成为服务：

path -Dispatch SrvName

其中 path 为应用程序的完整路径，SrvName 为应用的服务名称。

示例

下面的例子是一个完整的服务的例程，例子安装了一个服务，名称为“MySrv”，显示名称为“My Service Application”，如果在 Windows 2000 及以上系统，则详细描述设定为“This is my NetBox Service”。程序通过判断命令行参数来安装或卸载服务，并提供完整的服务事件的实现：

Set service = Shell.Service
Set Arg = Shell.Arguments

service.Name = "MySrv"
service.DisplayName = "My Service Application"
service.Description = "This is my NetBox Service"

If LCase(Arg(1)) = "-install" Then
    service.Install
    Shell.Quit 0
ElseIf LCase(Arg(1)) = "-remove" Then
    service.Remove
    Shell.Quit 0
End If

service.SetTimer 1000
service.DoEvents

'---------------------- Service Event ---------------------

Sub OnServiceStop
End Sub

Sub OnServicePause
End Sub

Sub OnServiceResume
End Sub

Sub OnServiceTimer
    Shell.Beep
End Sub

也可以直接使用 RunService 方法实现服务，其代码更加简单。

Shell.Service.RunService "MySrv", "My Service Application", "This is my NetBox Service"

'---------------------- Service Event ---------------------

Sub OnServiceStart
    Shell.Service.SetTimer 1000
End Sub

Sub OnServiceStop
End Sub

Sub OnServicePause
End Sub

Sub OnServiceResume
End Sub

Sub OnServiceTimer
    Shell.Beep
End Sub

应用于

Shell 对象


Service.Description 属性

Description 属性

服务描述，仅限于 Windows 2000 及以上版本

语法

Shell.Service.Description[ = strDescription]

参数

strDescription
给定的服务描述字符串

注释

从 Windows 2000 开始，可以为服务程序设定详细的描述信息，以便向用户提供更加详细的信息。

应用于

Service 对象


Service.Desktop 属性

Desktop 属性

指定服务时候允许与桌面交互，缺省为 false

语法

Shell.Service.Desktop[ = boolDesktop]

参数

boolDesktop
指定是否与桌面交互

注释

当服务允许与用户交互时，将可以进行程序调试，也可在用户界面上显示提示信息等内容。

应用于

Service 对象


Service.DisplayName 属性

DisplayName 属性

服务显示名称，服务在服务列表中显示的名称

语法

Shell.Service.DisplayName[ = strDisplayName]

参数

strDisplayName
给定的服务显示名

注释

Service.DisplayName 指定在服务列表中显示的服务的名称，此名称用于显示更加友好的服务名称。

应用于

Service 对象


Window.Icon 属性

Icon 属性

加载图标到对象中，支持的图标格式为：BMP (bitmap), JPEG, WMF (metafile), ICO (icon), GIF

语法

obj.Icon[= path]

参数

obj
一个实例化的对象

path
指定图标文件的路径

应用于

Service 对象 | HtmlWindow 对象


Service.Installed 属性

Installed 属性

查询当前服务是否已经安装

语法

Shell.Service.Installed

应用于

Service 对象


Service.Name 属性

Name 属性

服务名，服务在服务列表中的名称

语法

Shell.Service.Name[ = strName]

参数

strName
给定的服务名

注释

Service.Name 用于指定服务在服务列表中的名称，此名称被服务管理程序用于对服务进行启动、暂停、停止、删除等管理操作。

应用于

Service 对象


Service.Running 属性

Running 属性

查询当前服务是否正在运行

语法

Shell.Service.Running

应用于

Service 对象


Service.TrayIcon 属性

TrayIcon 属性

查询与设置是否在系统托盘中显示本服务的图标，缺省为显示

语法

Shell.Service.TrayIcon[ = boolIcon]

参数

boolIcon
指定是否显示图标

注释

显示图标同时受到 Desktop 属性的制约，如果在 NT 体系系统中，设定 Desktop 为 False 时，因为不与桌面交互，即使设定显示图标也不会显示。

应用于

Service 对象


Service.Type 属性

Type 属性

设置和查询服务类型，指定应用安装为服务还是安装为自动运行

语法

type = Shell.Service.Type

参数

type
服务类型，缺省为 1

注释

当 Type 为 1 时，应用安装为服务，系统启动即自动运行；设置为 0 时应用将安装为自动运行，只有当用户登录系统时才会自动运行。

应用于

Service 对象


Service.AppendCommand 方法

AppendCommand 方法

为服务菜单添加命令

语法

Shell.Service.AppendCommand(uCtrl[, varCommand])

参数

uCtrl
整数，命令参数

varCommand
字符串，菜单命令名称

注释

uCtrl 为用于指定命令的通知消息。当用户选中菜单中某个命令时，服务将触发 OnServiceCommand 事件，并传递与命令相对应的消息给事件。

当 uCtrl 为 0 时，添加的命令为菜单的缺省命令；当 uCtrl 为 -1 时，添加一个菜单分隔线。

应用于

Service 对象


Service.DoEvents 方法

DoEvents 方法

进入服务事件等待

语法

Shell.Service.DoEvents

注释

对于服务程序，在完成初始化操作以后，必须尽快进入服务事件等待，以便响应服务管理程序对服务的管理操作，进入服务事件等待的程序在服务管理器中才是可操作的。在程序进入服务事件等待前必须设定 Service.Name，如果需要显示更加友好的服务名称，需要设定 Service.DisplayName。

示例

下面演示了进行服务的初始化以后进入服务事件等待的代码：

Set service = Shell.Service

service.Name = "MySrv"
service.DisplayName = "My Service Application"

' Init ......
service.DoEvents

应用于

Service 对象


Service.Install 方法

Install 方法

将当前的程序安装成为服务

语法

Shell.Service.Install

注释

在安装之前，必须设定 Service.Name，如果需要显示更加友好的服务名称，需要设定 Service.DisplayName，在 Windows 2000 及以上版本，也可以设定 Service.Description 以提供友好的提示。

示例

下面的代码安装一个服务到系统，服务的名称为“MySrv”，显示名称为“My Service Application”，如果在 Windows 2000 及以上系统，则详细描述设定为“This is my NetBox Service”。

Set service = Shell.Service

service.Name = "MySrv"
service.DisplayName = "My Service Application"
service.Description = "This is my NetBox Service"

service.Install

应用于

Service 对象


Service.LogEvent 方法

LogEvent 方法

向系统日志中记录信息，仅 Windows NT 及以上系统支持

语法

Shell.Service.LogEvent nType, strMessage

参数

nType
事件类型

strMessage
事件信息描述

功能

nType 用于描述事件的类型，可以是下面的值：

0 | SUCCESS
1 | ERROR
2 | WARNING
4 | INFORMATION
8 | AUDIT_SUCCESS
16 | AUDIT_FAILURE

注释

LogEvent 使用 Service.Name 作为记录日志的源，所以在记录日志前需要设定 Service.Name 为相应的值。

应用于

Service 对象


Service.Remove 方法

Remove 方法

从系统中删除指定的服务

语法

Shell.Service.Remove

注释

删除指定名称的服务。在删除操作前必须指定 Service.Name。

示例

下面的代码删除服务“MySrv”：

Set service = Shell.Service

service.Name = "MySrv"

service.Remove

应用于

Service 对象


Service.RunService 方法

RunService 方法

标准的服务支持方法，提供通常的服务安装、卸载、运行的封装

语法

Shell.Service.RunService strName[, strDisplayName, strDescription]

参数

strName
给定的服务名

strDisplayName
给定的服务显示名

strDescription
给定的服务描述字符串

注释

RunService 不是基本功能，是由服务的基本功能组合而成的常用实现，使用 RunService，可以更加方便的实现绝大多数的服务应用。RunService 所实现的功能，等同于下面的代码：

Set service = Shell.Service
Set Arg = Shell.Arguments

service.Name = strName
service.DisplayName = strDisplayName
service.Description = strDescription

If LCase(Arg(1)) = "-install" Then
    service.Install
    Shell.Quit 0
ElseIf LCase(Arg(1)) = "-remove" Then
    service.Remove
    Shell.Quit 0
End If

OnScriptStart
service.DoEvents

示例

使用 RunService 可以大大简化服务应用编程的复杂程度，下面给出的例子就是一个完整的服务应用，其功能完全等同于 Service 文档中的例子：

Shell.Service.RunService "MySrv", "My Service Application", "This is my NetBox Service"

'---------------------- Service Event ---------------------

Sub OnServiceStart
    Shell.Service.SetTimer 1000
End Sub

Sub OnServiceStop
End Sub

Sub OnServicePause
End Sub

Sub OnServiceResume
End Sub

Sub OnServiceTimer
    Shell.Beep
End Sub

应用于

Service 对象


Service.Restart 方法

Restart 方法

重新启动系统中已安装的指定服务

语法

Shell.Service.Restart

参数

重新启动指定名称的服务。在启动操作前必须指定 Service.Name。如果当前服务正在运行，则停止再启动，否则将直接启动服务。

应用于

Service 对象


Service.SendCommand 方法

SendCommand 方法

向指定的服务发送命令

语法

Shell.Service.SendCommand(uCtrl)

参数

uCtrl
整数，命令参数

注释

发送命令前，需要指定服务名称。对于安装为系统服务的应用，发送命令参数范围为 128-255，对于自动运行服务或者 Windows 98 上的服务，命令可以是任何数值。

应用于

Service 对象


Service.SetTimer 方法

SetTimer 方法

设定服务的定时器

语法

Shell.Service.SetTimer nElapse

参数

nElapse
定时器的定时间隔，以毫秒为单位，-1 为关闭定时器

注释

对于需要定时进行一些处理的程序，可以使用服务的定时器进行处理。通过设定定时器的定时时间，可以在服务等待时定时触发 OnServiceTimer 事件。当服务管理程序向服务提出暂停请求时，定时器也将暂停工作，直至服务管理程序恢复服务的运行为止。

由于系统原因，SetTimer 不是精确定时器，不能依赖 SetTimer 实现精确时钟，如果需要精确的定时操作(比如每天上午 7 点做一次数据同步)，需要在 OnServiceTimer 事件中自行实现时间判断。

示例

下面的每秒系统发出一次声音：

Set service = Shell.Service

service.Name = "MySrv"
service.DisplayName = "My Service Application"

service.SetTimer 1000
service.DoEvents

'---------------------- Service Event ---------------------

Sub OnServiceTimer
    Shell.Beep
End Sub

应用于

Service 对象


Service.Start 方法

Start 方法

启动系统中已安装的指定服务

语法

Shell.Service.Start

注释

启动指定名称的服务。在启动操作前必须指定 Service.Name。

示例

下面的代码启动服务“MySrv”：

Set service = Shell.Service

service.Name = "MySrv"

service.Start

应用于

Service 对象


Service.Stop 方法

Stop 方法

停止系统中以安装的指定服务

语法

Shell.Service.Stop

注释

停止指定名称的服务。在停止操作前必须指定 Service.Name。

示例

下面的代码停止服务“MySrv”：

Set service = Shell.Service

service.Name = "MySrv"

service.Stop

应用于

Service 对象


Service.OnServiceCommand 事件

OnServiceCommand 事件

服务命令响应事件

语法

Sub OnServicePause(uCtrl)
...
End Sub

参数

uCtrl
整数，命令参数

注释

当用户选择服务菜单，或者本进程和别的进程使用 SendCommand 向此服务发送命令时触发此事件。

应用于

Service 对象


Service.OnServicePause 事件

OnServicePause 事件

服务暂停事件

语法

Sub OnServicePause
...
End Sub

注释

当服务管理程序向服务提出暂停请求时出发 OnServicePause 事件，服务程序需要在 OnServicePause 事件中暂停自己创建的应用，比如 HttpServer 等。

应用于

Service 对象


Service.OnServiceResume 事件

OnServiceResume 事件

服务恢复事件

语法

Sub OnServiceResume
...
End Sub

注释

当服务管理程序向服务提出恢复请求时出发 OnServiceResume 事件，服务程序需要在 OnServiceResume 事件中恢复已经暂停的应用，比如 HttpServer 等。

应用于

Service 对象


Service.OnServiceStart 事件

OnServiceStart 事件

服务初始化事件，仅在使用 RunService 方法建立服务时有效

语法

Sub OnServiceStart
...
End Sub

注释

服务初始化事件在启动服务应用，进入服务事件等待前被触发，用于程序在进入服务前进行初始化。服务程序需要在此事件中创建必须的服务，比如 HttpServer 等。

OnServiceStart 事件并非任何方式服务都会触发，仅当使用 RunService 方法实现服务时才会在启动服务时触发，而如果服务程序是直接使用基本方法自行实现，则可以有机会在进入 DoEvents 之前进行初始化，所以并不需要出发此事件。

在 OnServiceStart 事件中创建服务时需要注意一点，一定要用全局变量保存创建的对象，否则在事件结束时服务对象将自动清除，失去了初始化的意义。

应用于

Service 对象


Service.OnServiceStop 事件

OnServiceStop 事件

服务停止事件

语法

Sub OnServiceStop
...
End Sub

注释

当服务管理程序向服务提出停止请求时出发 OnServiceStop 事件，服务程序需要在 OnServiceStop 事件中停止自己创建的应用，比如 HttpServer 等。停止后服务系统将退出 Service.DoEvents，返回到用户的主程序中，此时程序应尽快退出，如果结束需要大量数据处理，应在 OnServiceStop 事件中处理。

应用于

Service 对象


Service.OnServiceTimer 事件

OnServiceTimer 事件

服务定时器事件

语法

Sub OnServiceTimer
...
End Sub

注释

当满足下面三个条件时，将触发 OnServiceTimer 事件：

1. 使用 Service.SetTimer 方法设定了定时器，且 nElapse 不为 -1
2. 进入服务等待，且服务没有被暂停
3. 从上次触发开始已经间隔了 nElapse 设定的毫秒数

示例

下面的例子使用 OnServiceTimer 事件在每天上午 7 点做一次数据同步操作。由于系统原因，SetTimer 不是精确定时器，不能依赖 SetTimer 实现精确时钟，所以需要自行实现时间判断。

Set service = Shell.Service

service.Name = "MySrv"
service.DisplayName = "My Service Application"

NextSynch = DateAdd("h", 7, Date)
If Now > NextSynch Then NextSynch = DateAdd("d", 1, NextSynch)

service.SetTimer 1000
service.DoEvents

'---------------------- Service Event ---------------------

Sub OnServiceTimer
    If Now > NextSynch Then
        ' Do Synch
        '......
        DateAdd("d", 1, NextSynch)
    End If
End Sub

上面的例子中，在初始化的时候先设定下次同步的时间，然后在每次定时器事件中判断当前时间是不是已经超过这个时间，如果超过，则进行同步操作，最后将下次同步时间更新为第二天的 7 点。

应用于

Service 对象


Shell 对象

Shell 对象是 NetBox 主程序的内建对象，用于提供基本运行平台所需要的外部设备

语法

Shell[.property|method]

对象

Arguments | 命令行分析工具，用于将命令行分解成为一组命令参数
Console | 缺省控制台对象，提供基于命令行的程序控制台输入输出功能
Service | 提供用于创建服务程序的一组工具

方法

Beep | 使系统发声
BrowseForFolder | 显示对话框由用户选择目录，可根据需求设定允许用户建立目录
Command | 执行 NetBox 内置的命令行解释器
DoEvents | 执行排队的事件
Execute | 以指定的方式执行一个外部程序
Halt | 强行中止当前应用程序
LoadPrivateKey | 装载系统基本证书和私钥
MsgBox | 在对话框中显示消息
OpenFileDialog | 显示打开文件的对话框，并返回用户的选择结果
Quit | 退出当前脚本程序
RegisterServer | 注册一个自注册的 COM DLL 到系统，通常 VC 或者 VB 所创建的 COM DLL 均能使用
SaveFileDialog | 显示保存文件的对话框，并返回用户的选择结果
SendMessage | 向给定的计算机或者地址发送标准 Windows 消息
Shutdown | 关闭或者重新启动当前计算机
UnregisterServer | 从系统中卸载一个自注册的 COM DLL，通常 VC 或者 VB 所创建的 COM DLL 均能使用

注释

Shell 提供了对 NetBox 系统运行时的外部功能的访问，通过使用 Shell，可以访问标准控制台，安装、卸载服务，以服务方式运行应用，运行外部程序，显示功能强大的 HTML 对话框等。

Shell 对象可以在主运行程序中直接引用，在 HTML 对话框、asp 程序和 wsc 对象等不能直接访问内建对象的环境中，可以使用下面的 VBScript 语句自行创建：

Set Shell = CreateObject("Shell")

或者下面的 Javascript 语句：

var Shell = new ActiveXObject("Shell");


Shell.Beep 方法

Beep 方法

使系统发声

语法

Shell.Beep

示例

下面的例子每 1 秒发声一次，共发 10 次：

For i = 1 To 10
    Shell.Sleep 1000
    Shell.Beep
Next

应用于

Shell 对象


Shell.BrowseForFolder 方法

BrowseForFolder 方法

显示对话框由用户选择目录，可根据需求设定允许用户建立目录

语法

strDir = Shell.BrowseForFolder([varinitDir], [varTitle], [varDescription], [varNew])

参数

strDir
返回用户选择的目录名称，取消操作时为空

varinitDir
初始化目录，显示对话框时将自动定位到给定的目录

varTitle
对话框标题

varDescription
对话框描述

varNew
是否允许用户创建目录

注释

BrowseForFolder 显示一个系统磁盘目录对话框，然后用户选择其中的一个目录，并返回给调用者。如果用户取消了对话框，则返回一个空字符串给调用者。

应用于

Shell 对象


Shell.Command 方法

Command 方法

执行 NetBox 内置的命令行解释器

语法

Shell.Command

注释

Shell.Commane 将执行 NetBox 内置的命令行解释器。在 NetBox 执行时，如果没有发现 main.box 和 main.nbl，则将自动进入 Shell.Command 执行命令行解释器。

NetBox 内置的命令行解释器的执行流程与下面的代码相同：

Set Console = Shell.Console
Set SubArgs = CreateObject("NetBox.Arguments")

Do While True
    Console.Write "#"
    strCommand = Console.ReadLine
    If LCase(strCommand) = "exit" Then Exit Do
    SubArgs.CommandLine = strCommand

    If SubArgs.Count > 0 Then
        strExecFile = SubArgs(0)
        If LCase(Right(strExecFile, 4)) <> ".box" Then
            strExecFile = strExecFile + ".box"
        End If

        Set Script = CreateObject("NetBox.Script")

        e = Script.Load(strExecFile)
        If e = 0 Then
            Script.SetGlobalObjects
            Script.AddNameItem "Arguments", SubArgs

            e = Script.Run
        End If

        If e = 404 Then
            Console.WriteLine "Bad Command"
        ElseIf e <> 0 Then
            Set error = Script.GetLastError
            Console.WriteLine error.Category
            Console.WriteLine "Error Number: " & Hex(error.Number)
            Console.WriteLine "File: " & error.File
            Console.WriteLine "Line: " & error.Line
            Console.WriteLine error.Description & vbCRLF
            Set error = Nothing
        End If

        Set Script = Nothing
    End If
Loop

应用于

Shell 对象


Shell.DoEvents 方法

DoEvents 方法

执行排队的事件

语法

Shell.DoEvents

注释

一般情况下脚本程序是不需要处理异步事件的，也不需要调用 Shell.DoEvents。在脚本程序运行时，对象的异步事件将排队等候，为了让事件能够有时间被处理，需要在适当的时候调用 Shell.DoEvents。调用 Shell.DoEvents 会将控制权传给操作系统。当操作系统处理完队列中的事件，返回控制权。

应用于

Shell 对象


Shell.Execute 方法

Execute 方法

以指定的方式执行一个外部程序

语法

ret = Shell.Execute(strCommand[, varCmdShow])

参数

ret
返回外部程序退出代码

strCommand
外部程序的完整命令行

varCmdShow
程序运行时窗口状态，缺省值为 1

注释

Shell.Execute 将启动一个指定的外部程序，程序由 strCommand 的内容确定，strCommand 是一个以空格作为分割的命令行，第一个空格为分割，前面的部分是程序名称，后面的命令行参数。比如：

Shell.Execute "c:\Window\notepad.exe c:\test.txt"

如果外部程序名称中必须包含空格，则需要用引号将程序名称括起来：

Shell.Execute """C:\Program Files\Internet Explorer\IEXPLORE.EXE"" http://www.zydsoft.com"

启动程序时，varCmdShow 用于指定程序启动时的窗口现实方式，常用的 varCmdShow 值如下：

varCmdShow | 含义及表现形式
1 | 正常：显示并且激活主窗口
2 | 最小化：显示并最小化主窗口
3 | 最大化：显示并最大化主窗口
4 | 显示：显示但是不激活主窗口
+16 | 等待应用程序结束

应用于

Shell 对象


Shell.Halt 方法

Halt 方法

强行中止当前应用程序

语法

Shell.Halt exitCode

参数

exitCode
退出代码

注释

通常情况下，应用程序应该从 main.box 中正常退出，按照正常顺序退出应用将保证所有逻辑的严密和数据的完整。而在有些情况下，比如程序检查到严重错误，此时可能需要立即退出当前程序的所有逻辑，此时可以调用此方法。调用此方法将中止当前应用所有程序，调用后将不再执行任何逻辑。

应用于

Shell 对象


Shell.LoadPrivateKey 方法

LoadPrivateKey 方法

装载系统基本证书和私钥

语法

ret = Shell.LoadPrivateKey(PrivateKey, Certificate)

参数

ret
返回装载结果，成功装载时返回 0

PrivateKey
私钥文件名

Certificate
证书文件名

注释

Shell.LoadPrivateKey 装载私钥和证书，并验证证书的合法性。Shell.LoadPrivateKey 支持的证书格式为 PEM 格式。

应用于

Shell 对象


Shell.MsgBox 方法

MsgBox 方法

在对话框中显示消息

语法

retVal = Shell.MsgBox prompt, title[, buttons]

参数

retVal
返回用户操作

prompt
作为消息显示在对话框中的字符串

title
显示在对话框标题栏中的字符串

buttons
指定显示按钮的数目和类型、使用的图标样式，默认按钮的标识以及消息框样式的数值的总和

功能

buttons 参数可以有以下值：

常数 | 值 | 描述
vbOKOnly | 0 | 只显示确定按钮。
vbOKCancel | 1 | 显示确定和取消按钮。
vbAbortRetryIgnore | 2 | 显示放弃、重试和忽略按钮。
vbYesNoCancel | 3 | 显示是、否和取消按钮。
vbYesNo | 4 | 显示是和否按钮。
vbRetryCancel | 5 | 显示重试和取消按钮。
vbCritical | 16 | 显示临界信息图标。
vbQuestion | 32 | 显示警告查询图标。
vbExclamation | 48 | 显示警告消息图标。
vbInformation | 64 | 显示信息消息图标。
vbDefaultButton1 | 0 | 第一个按钮为默认按钮。
vbDefaultButton2 | 256 | 第二个按钮为默认按钮。
vbDefaultButton3 | 512 | 第三个按钮为默认按钮。
vbDefaultButton4 | 768 | 第四个按钮为默认按钮。
vbApplicationModal | 0 | 应用程序模式：用户必须响应消息框才能继续在当前应用程序中工作。
vbSystemModal | 4096 | 系统模式：在用户响应消息框前，所有应用程序都被挂起。

MsgBox 函数有以下返回值：

常数 | 值 | 按钮
vbOK | 1 | 确定
vbCancel | 2 | 取消
vbAbort | 3 | 放弃
vbRetry | 4 | 重试
vbIgnore | 5 | 忽略
vbYes | 6 | 是
vbNo | 7 | 否

应用于

Shell 对象


Shell.OpenFileDialog 方法

OpenFileDialog 方法

显示打开文件的对话框，并返回用户的选择结果

语法

strFile = Shell.OpenFileDialog([varinitFile], [varinitDir], [varfilter], [vartitle])

参数

strFile
返回用户选择的文件，取消操作时返回空字符串

varinitFile
显示对话框时缺省文件

varinitDir
显示对话框时的初始化目录

varfilter
文件过滤，格式见注释

vartitle
对话框标题

注释

OpenFileDialog 方法显示打开文件对话框，并返回用户操作的结果，如果用户取消操作，则返回空字符串。

在调用此方法时，可以提供一组过滤字符串，用于显示指定类型的文件，过滤字符串的格式是以字符 chr(0) 为分割符的名称、描述对。比如下面的字符串描述两组文件：

"All File(*.*)" & chr(0) & "*.*" & chr(0) & "NetBox File(*.box)" & chr(0) & "*.box" & chr(0)

应用于

Shell 对象


Shell.Quit 方法

Quit 方法

退出当前脚本程序

语法

Shell.Quit ExitCode

参数

ExitCode
脚本程序退出代码

注释

Shell.Quit 仅退出调用其的当前运行的脚本程序，当多层脚本程序嵌套执行，则只退出最靠近 Shell.Quit 调用的脚本程序。

应用于

Shell 对象


Shell.RegisterServer 方法

RegisterServer 方法

注册一个自注册的 COM DLL 到系统，通常 VC 或者 VB 所创建的 COM DLL 均能使用

语法

Shell.RegisterServer strPath

参数

strPath
指定要注册的文件名

应用于

Shell 对象


Shell.SaveFileDialog 方法

SaveFileDialog 方法

显示保存文件的对话框，并返回用户的选择结果

语法

strFile = Shell.SaveFileDialog([varinitFile], [varinitDir], [varfilter], [vartitle])

参数

strFile
返回用户选择的文件，取消操作时返回空字符串

varinitFile
显示对话框时缺省文件

varinitDir
显示对话框时的初始化目录

varfilter
文件过滤，格式见注释

vartitle
对话框标题

注释

SaveFileDialog 方法显示保存文件对话框，并返回用户操作的结果，如果用户取消操作，则返回空字符串。

在调用此方法时，可以提供一组过滤字符串，用于显示指定类型的文件，过滤字符串的格式是以字符 chr(0) 为分割符的名称、描述对。比如下面的字符串描述两组文件：

"All File(*.*)" & chr(0) & "*.*" & chr(0) & "NetBox File(*.box)" & chr(0) & "*.box" & chr(0)

应用于

Shell 对象


Shell.SendMessage 方法

SendMessage 方法

向给定的计算机或者地址发送标准 Windows 消息

语法

Shell.SendMessage strSendTo, strMessage

参数

strSendTo
指定消息的目标机器或者地址

strMessage
要发送的消息文本

应用于

Shell 对象


Shell.Shutdown 方法

Shutdown 方法

关闭或者重新启动当前计算机

语法

Shell.Shutdown bReboot

参数

bReboot
是否重新启动，为 True 则重起，否则关机

应用于

Shell 对象


Shell.UnregisterServer 方法

UnregisterServer 方法

从系统中卸载一个自注册的 COM DLL，通常 VC 或者 VB 所创建的 COM DLL 均能使用

语法

Shell.UnregisterServer strPath

注册

strPath
指定要注册的文件名

应用于

Shell 对象


Collection.Count 属性

Count 属性

返回一个对象中的项目数，只读属性

语法

num = obj.Count

参数

num
返回对象中的项目数

obj
一个实例化的对象

应用于

SysInfo 对象 | Dictionary 对象 | List 对象 | Queue 对象


Collection.Key 属性

Key 属性

根据下标取得关键字的键值，只读属性

语法

strKey = dict.Key(keyIndex)

参数

strKey
返回指定下标的关键字的键值

dict
一个实例化的对象

keyIndex
按照插入顺序的下标

注释

给定的下标表示按照插入顺序的下标，顺序从 0 开始，如果其中某个数据键被删除，则其后插入的数据键的下标依次前移。

示例

下面的例子中插入一些关键字项目对，然后读取第二个插入的关键字，结果将为"b"。

Set dict = CreateObject("NetBox.Dictionary")
dict.Add "a", "Athens"
dict.Add "b", "Belgrade"
dict.Add "c", "Cairo"
......
strKey = dict.Key(1)

应用于

SysInfo 对象 | Dictionary 对象


SysInfo.Add 方法

Add 方法

向系统信息中添加自己的信息

语法

NetBox.SysInfo.Add strKey, strValue

参数

strKey
添加的数据的键值

strValue
添加的数据

注释

通过使用此方法可以向 SysInfo 集合添加一个属于自己的信息，以便于自己在其他模块中使用。SysInfo 集合只允许添加新的内容，如果试图添加已经存在的数据对，则会返回错误。

应用于

SysInfo 对象


Collection.Exists 方法

Exists 方法

如果对象中存在所指定的关键字则返回 true，否则返回 false

语法

isExists = dict.Exists(key)

参数

isExists
返回查询结果

dict
一个实例化的对象

key
需要在对象中搜索的 key 值

注释

由于 Dictionary 本身忽略关键字大小写的特性，对于关键字的查询也是忽略大小写的。

示例

下面的例子中两次查询关键字是否存在的调用都将返回 true

Set dict = CreateObject("NetBox.Dictionary")
dict.Add "a", "Athens"
dict.Add "b", "Belgrade"
dict.Add "c", "Cairo"
isExists = dict.Exists("c")
isExists1 = dict.Exists("C")

应用于

SysInfo 对象 | Dictionary 对象 | Identity 对象


SysInfo.Save 方法

Save 方法

转储对象中的内容到指定的目标

语法

obj.Save(varDest)

参数

obj
一个实例化的对象

varDest
指定转储的目标，可以为文件名或者 Stream 对象

功能

参数 varDest 用于指定转储的方式。如果给定一个字符串，则将以此字符串为文件名转储，如果给定一个 Stream 对象，则直接将内容转储至流对象中。

注释

使用 Save 可以快速方便的一次将对象中的内容全部转储到给定的存储设备上，与 Load 方法配合可以灵活的在内存与永久存储设备和网络设备之间交换数据。

应用于

SysInfo 对象


SysInfo.Update 方法

Update 方法

更新 SysInfo 中的系统信息

语法

NetBox.SysInfo.Update

注释

调用 Update 方法将重新获取系统信息，以便于应用程序跟踪系统的变化。Update 方法将不会影响 SysInfo 中用户添加的信息。

应用于

SysInfo 对象


asp 对象参考

对象 | 说 明
Application | 可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟目录及其子目录中定义。因为多个用户可以共享 Application 对象，所以必须要有 Lock 和 Unlock 方法以确保多个用户无法同时改变某一属性。
Browser | 查询访问者的浏览器类型及其特性
ObjectContext | ObjectContext 对象用于中止或者提交当前的事务，只有使用 #transaction 或 @TRANSACTION 成功创建或者加入事务后才能够访问
Request | Request 对象在 HTTP 请求期间，检索客户端浏览器传递给服务器的值
Response | 使用 Response 对象可以将输出发送到客户端
ScriptError | ScriptError 用于传递 Script 对象的错误信息
Server | Server 对象提供对服务器上的方法和属性的访问，其中大多数方法和属性是作为实用程序的功能服务的
Session | 存储特定用户会话所需的信息，当用户在应用程序的 Web 页之间跳转时，存储在 Session 对象中的变量将不会丢失，而是在整个用户会话中一直存在下去


Application 对象

可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟目录及其子目录中定义。因为多个用户可以共享 Application 对象，所以必须要有 Lock 和 Unlock 方法以确保多个用户无法同时改变某一属性。

语法

Application[.collection|method](variable)

集合

Contents 基本集合，使用标准内部对象 Dictionary 存放数据

属性

ApplicationID ApplicationID 属性返回当前应用的标识

方法

Lock | 阻止其他用户对关键的 Application 进行操作，同一之间只允许一个用户进行操作。程序退出的时候会自动释放对于 Application 的锁
Unlock | 阻止其他用户对关键的 Application 进行操作，同一之间只允许一个用户进行操作。程序退出的时候会自动释放对于 Application 的锁

注释

您可以将值存储在 Application 集合中。存储在 Application 集合中的信息在整个应用程序中有效且具有应用程序作用域。下列脚本演示两种类型的变量的存储。

<%
Application("greeting") = "Welcome to My Web World!"
Application("num") = 25
%>

每一个变量都是 Contents 集合的成员。

也可以为具有应用程序作用域的变量分配组件实例。若使用 Server.CreateObject 方法为变量分配组件实例，则该变量将成为 Application.Contents 集合的成员。

在为具有应用程序作用域的变量分配组件实例时一定要小心从事，因为某些组件不是为给定的应用程序作用域设计的。详细信息。

如果为 Contents 中的变量分配组件实例，且使用 Visual Basic® Scripting Edition 作为主脚本语言，则必须使用 Set 关键字。在下列脚本中对此进行解释。

<% Set Application("Obj1") = Server.CreateObject("MyComponent") %>

可以引用并发 Web 页上的 MyComponent 的属性和方法，具体做法是使用脚本

<% Application("Obj1").MyObjMethod %>

或展开该对象的一个本地副本并使用脚本

<%
Set MyLocalObj1 = Application("Obj1")
MyLocalObj1.MyObjMethod
%>

您应该清楚您给定应用程序作用域的组件所使用的线程模型。用于开发组件的线程模型将对是否将组件实例分配给 Application 集合中的变量产生很大影响。

若您将一个数组存储在 Application 对象中，请不要直接更改存储在数组中的元素。例如，下列的脚本无法运行。

<% Application("StoredArray")(3) = "new value" %>

这是因为 Application 对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中，并将覆盖此位置以前存储的任何信息。

我们极力建议您在将数组存储在 Application 对象中时，在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时，您应再将数组全部存储在 Application 对象中，这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。

---file1.asp---
<%
'Creating and initializing the array
dim MyArray()
Redim MyArray(5)
MyArray(0) = "hello"
MyArray(1) = "some other string"

'Storing the array in the Application object
Application.Lock
Application("StoredArray") = MyArray
Application.Unlock

Response.Redirect("file2.asp")
%>

---file2.asp---
<%
'Retrieving the array from the Application Object
'and modifying its second element
LocalArray = Application("StoredArray")
LocalArray(1) = " there"

'printing out the string "hello there"
Response.Write(LocalArray(0)&LocalArray(1))

'Re-storing the array in the Application object
'This overwrites the values in StoredArray with the new values
Application.Lock
Application("StoredArray") = LocalArray
Application.Unlock
%>

示例

下列示例使用应用程序变量 NumVisits 存储某特定页被访问的次数。调用 Lock 方法是为了保证只有当前客户才能访问和更改 NumVisits。调用 Unlock 方法之后，即可允许其他用户访问 Application 对象。

<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>

This application page has been visited
<%= Application("NumVisits") %> times!

应用于

HttpServerHost 对象


Application.ApplicationID 属性

ApplicationID 属性

ApplicationID 属性返回当前应用的标识

语法

Application.ApplicationID

注释

ApplicationID 属性用于取得当前应用的标识，每个虚拟主机都拥有自己的标识，并使用以标识为名称的 Cookie 与浏览器维护会话状态。此属性与 HttpServerHost 对象的 ApplicationID 属性返回结果是相同的，不同的是在 HttpServerHost 对象中是可以修改 ApplicationID 属性，而在 Application 对象中此属性为只读。

示例

由于虚拟主机将以 ApplicationID 为名称传送 Cookie 给客户浏览器，所以可以通过在浏览器端判断是否存在相同名称的 Cookie 来判断浏览器是否能够继续维持会话。

<html>
<body>
<Script language="javascript">
if(document.cookie.search("<%=Application.ApplicationID%>=") == -1)document.write("Not ");
</Script>Allow.
</body>
</html>

应用于

Application 对象


Application.Lock 方法

Lock 方法

阻止其他用户对关键的 Application 进行操作，同一之间只允许一个用户进行操作。程序退出的时候会自动释放对于 Application 的锁

语法

Application.Lock

示例

<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>

This application page has been visited
<%= Application("NumVisits") %>  times!

在前面的示例中，Lock 方法保护变量 NumVisits 在同一时刻不被多个客户所访问。如果应用程序未被锁定，则两个客户就可以同时增加变量 NumVisits 的值。

应用于

Application 对象


Application.Unlock 方法

Unlock 方法

阻止其他用户对关键的 Application 进行操作，同一之间只允许一个用户进行操作。程序退出的时候会自动释放对于 Application 的锁

语法

Application.Unlock

示例

<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>

This application page has been visited
<%= Application("NumVisits") %>  times!

上述例子中，Unlock 方法解除对象的锁定，使得下一个客户端能够增加 NumVisits。

应用于

Application 对象


Browser 对象

查询访问者的浏览器类型及其特性

语法

Request.Browser

属性

ActiveXControls | 查询浏览器是否支持 ActiveX 控件，支持则返回 True
BackgroundSounds | 查询浏览器是否支持背景音乐，支持则返回 True
Beta | 查询浏览器是否是测试版本，如果是则返回 True
CDF | 查询浏览器是否支持用于网络广播的频道定义格式(CDF)文件，支持则返回 True
Cookies | 查询浏览器是否支持 Cookies，支持则返回 True
Crawler | 查询浏览器是否是搜索引擎的网站爬行机器人，如果是则返回 True
CSSVersion | 返回浏览器所支持的层叠样式表(CSS)的版本，不支持则返回 0
Frames | 查询浏览器是否支持 Frame，支持则返回 True
IFrames | 查询浏览器是否支持 IFrame，支持则返回 True
JavaApplets | 查询浏览器是否支持 Java 小程序，支持则返回 True
JavaScript | 查询浏览器是否支持 JavaScript 脚本，支持则返回 True
MajorVersion | 查询浏览器的主版本号
MinorVersion | 查询浏览器的副版本号
Name | 查询浏览器名称
NetCLR | 查询浏览器是否支持 NetCLR，支持则返回 True
Platform | 返回浏览器运行的操作系统
Tables | 查询浏览器是否支持表格，支持则返回 True
Type | 返回浏览器的类型，一般由名称和主版本号组成
VBScript | 查询浏览器是否支持 VBScript 脚本，支持则返回 True
Version | 返回浏览器的版本号
WAP | 查询浏览器是否是 WAP 浏览器，如果是则返回 True
Win16 | 查询浏览器是否运行在 Win16 操作系统上，如果是则返回 True
UserAgent | 返回浏览器的特征字符串

注释

Browser 使用标准的 browscap.ini 文件提供浏览器类型模版，应用运行时，NetBox 将在应用程序的当前目录寻找并装载 browscap.ini 文件，如果无 browscap.ini 文件，则 Browser 对象返回缺省类型和属性。

browscap.ini 文件可以使用 iis 所提供的文件，也可以使用其他类似的文件。目前更新比较快，信息比较全的 browscap.ini 可以在下面的地址得到：

http://www.GaryKeith.com

示例

下面的代码将当前浏览器的类型和属性输出给用户：

<%Response.Cookies("UserName") = ""
Set bc = Request.Browser%>

<table border="0" cellpadding="0" cellspacing="6">
<tr><td><b>Agent Name</b></td><td><%=bc.UserAgent%></td></tr>
<tr><td><b>Type</b></td><td><%=bc.Type%></td></tr>
<tr><td><b>Name</b></td><td><%=bc.Name%></td></tr>
<tr><td><b>Version</b></td><td><%=bc.Version%></td></tr>
<tr><td><b>Major Version</b></td><td><%=bc.MajorVersion%></td></tr>
<tr><td><b>Minor Version</b></td><td><%=bc.MinorVersion%></td></tr>
<tr><td><b>Beta Version</b></td><td><%=bc.Beta%></td></tr>
<tr><td><b>Platform</b></td><td><%=bc.Platform%></td></tr>
<tr><td><b>AOL</b></td><td><%=bc.AOL%></td></tr>
<tr><td><b>Frames</b></td><td><%=bc.Frames%></td></tr>
<tr><td><b>IFrames</b></td><td><%=bc.IFrames%></td></tr>
<tr><td><b>Tables</b></td><td><%=bc.Tables%></td></tr>
<tr><td><b>Cookies</b></td><td><%=bc.Cookies%></td></tr>
<tr><td><b>VBScript</b></td><td><%=bc.VBScript%></td></tr>
<tr><td><b>JavaScript</b></td><td><%=bc.Javascript%></td></tr>
<tr><td><b>ActiveX Controls</b></td><td><%=bc.ActiveXControls%></td></tr>
<tr><td><b>Java Applets</b></td><td><%=bc.JavaApplets%></td></tr>
<tr><td><b>Background Sounds</b></td><td><%=bc.BackgroundSounds%></td></tr>
<tr><td><b>CDF</b></td><td><%=bc.CDF%></td></tr>
<tr><td><b>Crawler</b></td><td><%=bc.Crawler%></td></tr>
<tr><td><b>WAP</b></td><td><%=bc.WAP%></td></tr>
<tr><td><b>.NET CLR</b></td><td><%=bc.NetClr%></td></tr>
<tr><td><b>CSS</b></td><td><%=bc.CSSVersion%></td></tr>
<tr><td><b>Win16</b></td><td><%=bc.Win16%></td></tr>
</table>

应用于

Request 对象


Browser.ActiveXControls 属性

ActiveXControls 属性

查询浏览器是否支持 ActiveX 控件，支持则返回 True

语法

Request.Browser.ActiveXControls

应用于

Browser 对象


Browser.BackgroundSounds 属性

BackgroundSounds 属性

查询浏览器是否支持背景音乐，支持则返回 True

语法

Request.Browser.BackgroundSounds

应用于

Browser 对象


Browser.Beta 属性

Beta 属性

查询浏览器是否是测试版本，如果是则返回 True

语法

Request.Browser.Beta

应用于

Browser 对象


Browser.CDF 属性

CDF 属性

查询浏览器是否支持用于网络广播的频道定义格式(CDF)文件，支持则返回 True

语法

Request.Browser.CDF

应用于

Browser 对象


Browser.Cookies 属性

Cookies 属性

查询浏览器是否支持 Cookies，支持则返回 True

语法

Request.Browser.Cookies

应用于

Browser 对象


Browser.Crawler 属性

Crawler 属性

查询浏览器是否是搜索引擎的网站爬行机器人，如果是则返回 True

语法

Request.Browser.Crawler

应用于

Browser 对象


Browser.CSSVersion 属性

CSSVersion 属性

返回浏览器所支持的层叠样式表(CSS)的版本，不支持则返回 0

语法

Request.Browser.CSSVersion

应用于

Browser 对象


Browser.Frames 属性

Frames 属性

查询浏览器是否支持 Frame，支持则返回 True

语法

Request.Browser.Frames

应用于

Browser 对象


Browser.IFrames 属性

IFrames 属性

查询浏览器是否支持 IFrame，支持则返回 True

语法

Request.Browser.IFrames

应用于

Browser 对象


Browser.JavaApplets 属性

JavaApplets 属性

查询浏览器是否支持 Java 小程序，支持则返回 True

语法

Request.Browser.JavaApplets

应用于

Browser 对象


Browser.JavaScript 属性

JavaScript 属性

查询浏览器是否支持 JavaScript 脚本，支持则返回 True

语法

Request.Browser.JavaScript

应用于

Browser 对象


Browser.MajorVersion 属性

MajorVersion 属性

查询浏览器的主版本号

语法

Request.Browser.MajorVersion

应用于

Browser 对象


Browser.MinorVersion 属性

MinorVersion 属性

查询浏览器的副版本号

语法

Request.Browser.MinorVersion

应用于

Browser 对象


Browser.Name 属性

Name 属性

查询浏览器名称

语法

Request.Browser.Name

应用于

Browser 对象


Browser.NetCLR 属性

NetCLR 属性

查询浏览器是否支持 NetCLR，支持则返回 True

语法

Request.Browser.NetCLR

应用于

Browser 对象


Browser.Platform 属性

Platform 属性

返回浏览器运行的操作系统

语法

Request.Browser.Platform

应用于

Browser 对象


Browser.Tables 属性

Tables 属性

查询浏览器是否支持表格，支持则返回 True

语法

Request.Browser.Tables

应用于

Browser 对象


Browser.Type 属性

Type 属性

返回浏览器的类型，一般由名称和主版本号组成

语法

Request.Browser.Type

应用于

Browser 对象


Browser.VBScript 属性

VBScript 属性

查询浏览器是否支持 VBScript 脚本，支持则返回 True

语法

Request.Browser.VBScript

应用于

Browser 对象


Browser.Version 属性

Version 属性

返回浏览器的版本号

语法

Request.Browser.Version

应用于

Browser 对象


Browser.WAP 属性

WAP 属性

查询浏览器是否是 WAP 浏览器，如果是则返回 True

语法

Request.Browser.WAP

应用于

Browser 对象


Browser.Win16 属性

Win16 属性

查询浏览器是否运行在 Win16 操作系统上，如果是则返回 True

语法

Request.Browser.Win16

应用于

Browser 对象


Browser.UserAgent 属性

UserAgent 属性

返回浏览器的特征字符串

语法

Request.Browser.UserAgent

应用于

Browser 对象


ObjectContext 对象

ObjectContext 对象用于中止或者提交当前的事务，只有使用 #transaction 或 @TRANSACTION 成功创建或者加入事务后才能够访问

语法

ObjectContext.method

方法

SetAbort | 将当前的事务标记为中止，当脚本结束时将取消参与此事物的全部操作
SetCommit | 将当前事务标记为提交，在脚本结束时如果没有其他的 COM+ 对象中止事务，参与事务的操作将全部提交

事件

OnTransactionAbort | 当脚本创建的事务中止后，将触发 OnTransactionAbort 事件
OnTransactionCommit | 当脚本所创建的事务成功提交后，将触发 OnTransactionCommit 事件

注释

ObjectContext 对象支持两个方法：SetAbort 和 SetCommit，用于中止和提交当前事务。通过调用 SetAbort，可以标记当前事务为中止，参与此事务的全部操作都将取消。当事务中止时，脚本程序的 OnTransactionAbort 事件将被触发。

SetCommit 方法用于标记当前事务为提交，一般情况下，脚本无须调用 SetCommit 提交事务，如果未在脚本中调用过 SetAbort，则当脚本正常运行结束时，事务将自动提交。当事务成功提交时，脚本程序的 OnTransactionCommit 事件将被触发。

当脚本在一个事务中需要创建一个新的对象并加入此事务时，需要使用 NetBox 对象的 CreateObject 方法或者在服务器脚本中使用 Server 对象的 CreateObject 方法进行对象的创建，直接使用 VBScript 语言自身提供的 CreateObject 方法将创建出独立于事务的对象来，不能加入事务。

限制

创建一个事务需要操作系统对 COM+ 的支持，所以你只能在 Windows 2000 以上的操作系统使用事务处理，目前包括的操作系统为：Windows 2000、Windows XP、Windows .NET Server。


ObjectContext.SetAbort 方法

SetAbort 方法

将当前的事务标记为中止，当脚本结束时将取消参与此事物的全部操作

语法

ObjectContext.SetAbort

应用于

ObjectContext 对象


ObjectContext.SetCommit 方法

SetCommit 方法

将当前事务标记为提交，在脚本结束时如果没有其他的 COM+ 对象中止事务，参与事务的操作将全部提交

语法

ObjectContext.SetCommit

应用于

ObjectContext 对象


ObjectContext.OnTransactionAbort 事件

OnTransactionAbort 事件

当脚本创建的事务中止后，将触发 OnTransactionAbort 事件

语法

Sub OnTransactionAbort
    ...
End Sub

示例

下面的例子创建一个事务，并在事务中止后发送信息到客户浏览器：

<%@ TRANSACTION=Required LANGUAGE="VBScript" %>
<%  ObjectContext.SetAbort
Sub OnTransactionAbort
    Response.Write "<p><b>The Transaction just aborted</b>."
    Response.Write "This message came from the "
    Response.Write "OnTransactionAbort() event handler."
End Sub
%>

应用于

ObjectContext 对象


ObjectContext.OnTransactionCommit 方法

OnTransactionCommit 方法

当脚本所创建的事务成功提交后，将触发 OnTransactionCommit 事件

语法

Sub OnTransactionCommit
    ...
End Sub

示例

下面的例子创建一个事务，并在事务提交成功后发送信息到浏览器：

<%@ TRANSACTION=Required LANGUAGE="VBScript" %>
<%
Sub OnTransactionCommit
    Response.Write "<p><b>The Transaction just committed</b>."
    Response.Write "This message came from the "
    Response.Write "OnTransactionCommit() event handler."
End Sub
%>

应用于

ObjectContext 对象


Request 对象

Request 对象在 HTTP 请求期间，检索客户端浏览器传递给服务器的值

语法

Request[.collection|property|method](variable)

对象

Browser 查询访问者的浏览器类型及其特性

集合

ClientCertificate | ClientCertificate 集合从 Web 浏览器发布请求中获取验证字段（由 X.509 标准指定），如果没有发送验证，ClientCertificate 集合将返回 EMPTY
Cookies | Cookies 集合允许用户检索在 HTTP 请求中发送的 cookie 的值
Form | Form 集合通过使用 POST 方法的表格检索 HTTP 请求正文中的表格元素的值，支持 application/x-www-form-urlencoded 和 multipart/form-data 两种格式
QueryString | QueryString 集合检索 HTTP 查询字符串中变量的值，HTTP 查询字符串由问号 (?) 后的值指定
ServerVariables | ServerVariables 集合检索预定的环境变量

属性

TotalBytes | TotalBytes 属性指定客户端在请求正文中发送的总字节数。该属性只允许读
ContentType | ContentType 属性读取请求的 FORM 内容类型

方法

BinaryRead BinaryRead 方法获取作为 POST 请求的一部分而从客户端传送到服务器的数据

注释

如果指定的变量不是上述的五个集合中的一个，Request 对象返回 EMPTY。

可以通过调用 Request(variable) 直接使用所有的变量，而不需要集合的名称。正因为这样，Web 服务器可以按照下面的顺序搜索集合。

  1. QueryString

  2. Form

  3. Cookies

  4. ClientCertificate

  5. ServerVariables

如果同名的变量出现在多个集合中，Request 对象返回遇到的第一个实例。

我们建议在涉及 ServerVariables 集合的成员时使用全名。例如，不用 Request.(AUTH_USER) 而用Request.ServerVariables(AUTH_USER)。


Request.ClientCertificate 集合

ClientCertificate 集合

ClientCertificate 集合从 Web 浏览器发布请求中获取验证字段（由 X.509 标准指定），如果没有发送验证，ClientCertificate 集合将返回 EMPTY

语法

Request.ClientCertificate(Key[SubField])

注释

此集合只用于兼容，NetBox 目前不支持

应用于

Request 对象


Request.Cookies 集合

Cookies 集合

Cookies 集合允许用户检索在 HTTP 请求中发送的 cookie 的值

语法

Request.Cookies(cookie)[(key)|HasKeys]

参数

cookie
指定要检索其值的 cookie

key
可选参数，用于从 cookie 字典中检索子关键字的值

注释

可以通过包含一个 key 值来访问 cookie 字典的子关键字。如果访问 cookie 字典时未指定 key，则所有关键字都会作为单个查询字符串返回。例如，如果 MyCookie有两个关键字, First 和 Second ，而在调用 Request.Cookies时并未指定其中任何一个关键字，那么将返回下列字符串。

First=firstkeyvalue&Second=secondkeyvalue

如果客户端浏览器发送了两个同名的 cookie，那么 Request.Cookie 将返回其中路径结构较深的一个。例如，如果有两个同名的的 cookie，但其中一个的路径属性为 /www/ 而另一个为 /www/home/，客户端浏览器同时将两个 cookie 都发送到 /www/home/ 目录中，那么 Request.Cookie 将只返回第二个 cookie。

要确定某个 cookie 是不是 cookie 字典（cookie 有否有关键字），可使用下列脚本。

<%= Request.Cookies("myCookie").HasKeys %>

如果 myCookie 是一个 cookie 字典，则前面的赋值为 TRUE。否则，为 FALSE。

可以通过循环遍历 Cookies 集合中的所有 cookie 或 cookie 中的所有关键字。但是，通过关键字在没有关键字的 cookie 上遍历将不产生任何输出。使用 HasKeys 语法先检查一下 cookie 是否有关键字，可以避免这种情况。下面的例子对此进行演示。

<%
'Print out the entire cookie collection.
For Each cookie in Request.Cookies
  If Not cookie.HasKeys Then
    'Print out the cookie string
%>
    <%= cookie %> = <%= Request.Cookies(cookie)%>
<%
Else
  'Print out the cookie collection
  For Each key in Request.Cookies(cookie)
%>
  <%= cookie %> (<%= key %>) = <%= Request.Cookies(cookie)(key)%>
<%
  Next
End If
Next
%>

示例

下面的例子打印 Web 页中的 myCookie 的值。

这是名为 myCookie 的 cookie 值:
<%= Request.Cookies("myCookie") %>

应用于

Request 对象


Request.Form 集合

Form 集合

Form 集合通过使用 POST 方法的表格检索 HTTP 请求正文中的表格元素的值，支持 application/x-www-form-urlencoded 和 multipart/form-data 两种格式

语法

Request.Form(element)[(index)[.FileName|.Size]|.Count]

参数

element
指定集合要检索的表格元素的名称

index
可选参数，使用该参数可以访问某参数中多个值中的一个。它可以是 1 到 Request.Form(parameter).Count 之间的任意整数。

注释

Form 集合按请求正文中参数的名称来索引，普通字段数据类型为字符串，以 multipart/form-data 格式提交的正文中的上传文件数据类型为二进制 VT_ARRAY | VT_UI1。Request.Form(element) 的值是请求正文中所有 element 值的数组。通过调用 Request.Form(element).Count 来确定参数中值的个数。如果参数未关联多个值，则计数为 1。如果找不到参数，计数为 0 。

当 Form 为 multipart/form-data 格式时，可以使用 Request.Form(element).FileName 取得上传文件的文件名，使用 Request.Form(element).Size 取得上传文件的字节数，如果有多个重名参数，则可以使用 Request.Form(element)(i).FileName 和 Request.Form(element)(i).Size 分别取得每个参数的文件名和字节数。

要引用有多个值的表格元素中的单个值，必须指定 index 值。index 参数可以是从 1 到 Request.Form(element).Count 中的任意数字。如果引用多个表格参数中的一个，而未指定 index 值，返回的数据将是以逗号分隔的字符串。

在使用 Request.Form 参数时，Web 服务器将分析 HTTP 请求正文并返回指定的数据。如果应用程序需要未分析的表格数据，可以通过调用不带参数的 Request.Form 访问该数据。multipart/form-data 格式的 Form 不支持直接查询未分析的数据。

使用重述符可以遍历表格请求中的所有数据值。例如，用户通过指定两个值填写表格，Chocolate 和 Butterscotch。对于 FavoriteFlavor 参数，您可以使用下面的脚本检索这些值。

<%
For Each item In Request.Form("FavoriteFlavor")
  Response.Write item & "<BR>"
Next
%>

上述脚本显示如下。

Chocolate
Butterscotch

使用 For...Next 循环可以生成同样的输出，如下列脚本所示。

<%
For i = 1 To Request.Form("FavoriteFlavor").Count
  Response.Write Request.Form("FavoriteFlavor")(i) & "<BR>"
Next
%>

使用该复述符可以显示参数名。如下列脚本所示。

<% For Each x In Request.Form %>
Request.Form( <%= x %> ) = <%= Request.Form(x) %> <BR>
<% Next %>

该脚本在浏览器上显示下列信息。

FavoriteFlavor = Chocolate
FavoriteFlavor = Butterscotch

示例

Form 集合按请求正文中参数的名称来索引，普通字段结果数据类型为字符串，以 multipart/form-data 格式提交的正文中的上传文件结果数据类型为二进制数据块 VT_ARRAY | VT_UI1。Request.Form(element) 的值是请求正文中所有 element 值的数组。通过调用 Request.Form(element).Count 来确定参数中值的个数。如果参数未关联多个值，则计数为 1。如果找不到参数，计数为 0 。

要引用有多个值的表格元素中的单个值，必须指定 index 值。index 参数可以是从 1 到 Request.Form(element).Count 中的任意数字。如果引用多个表格参数中的一个，而未指定 index 值，返回的数据将是以逗号分隔的字符串。

在使用 Request.Form 参数时，Web 服务器将分析 HTTP 请求正文并返回指定的数据。如果应用程序需要未分析的表格数据，可以通过调用不带参数的 Request.Form 访问该数据。

使用重述符可以遍历表格请求中的所有数据值。例如，用户通过指定两个值填写表格，Chocolate 和 Butterscotch。对于 FavoriteFlavor 参数，您可以使用下面的脚本检索这些值。

<%
For Each item In Request.Form("FavoriteFlavor")
  Response.Write item & "<BR>"
Next
%>

上述脚本显示如下。

Chocolate
Butterscotch

使用 For...Next 循环可以生成同样的输出，如下列脚本所示。

<%
For i = 1 To Request.Form("FavoriteFlavor").Count
  Response.Write Request.Form("FavoriteFlavor")(i) & "<BR>"
Next
%>

使用该复述符可以显示参数名。如下列脚本所示。

<% For Each x In Request.Form %>
Request.Form( <%= x %> ) = <%= Request.Form(x) %> <BR>
<% Next %>

该脚本在浏览器上显示下列信息。

FavoriteFlavor = Chocolate
FavoriteFlavor = Butterscotch

应用于

Request 对象


Request.QueryString 集合

QueryString 集合

QueryString 集合检索 HTTP 查询字符串中变量的值，HTTP 查询字符串由问号 (?) 后的值指定

语法

Request.QueryString(variable)[(index)|.Count]

参数

variable
在 HTTP 查询字符串中指定要检索的变量名

index
这是一个可选参数，可以用来检索 variable 的多个值中的某一个值。这可以是从 1 到 Request.QueryString(variable).Count 之间的任何整数

注释

QueryString 集合是在 ServerVariables 集合中 QUERY_STRING 变量的分析版本 。它可以让您以名称检索 QUERY_STRING 变量。Request.QueryString (参数) 的值是出现在 QUERY_STRING 中所有参数 的值的数组。通过调用 Request.QueryString(parameter).Count 可以确定参数有多少个值。如果变量未关联多个数据集，则计数为 1。如果找不到变量，计数为 0。

要在多个数据集合的一个中引用 QueryString 变量，请指定 index 的值。index 参数可以是 1 到 Request.QueryString(variable).Count 中任意值。如果没有指定 index 的值，引用多个 QueryString 变量中的某个变量时，返回的数据是逗号分隔的字符串。

在 Request.QueryString 中使用参数时，服务器分析发送给请求的参数，并返回指定的数据。如果应用程序需要未分析的 QueryString 数据，可以通过调用不带参数的 Request.QueryString 检索到这个数据。

可以使用复述符在查询字符串中循环遍历所有的数据值。例如，如果发送以下的请求

http://NAMES.ASP?Q=Fred&Q=Sally

而且 Names.asp 包含下面的脚本，

---NAMES.ASP---
<%
For Each item In Request.QueryString("Q")
  Response.Write item & "<BR>"
Next
%>

Names.asp 将显示如下。

Fred
Sally

上述脚本也可以用 Count 来写。

<%
For I = 1 To Request.QueryString("Q").Count
  Response.Write Request.QueryString("Q")(I) & "<BR>"
Next
%>

示例

客户端请求

/scripts/directory-lookup.asp?name=fred&age=22

results in the following QUERY_STRING value.

name=fred&age=22.

QueryString 集合将包含 name 和 age 两个成员。那么，您就可以使用下面的脚本。

Welcome,  <%= Request.QueryString("name") %>.
Your age is  <%= Request.QueryString("age") %>.

将输出

Welcome, Fred. Your age is 22.

如果使用下面的脚本

The unparsed query string is:  <%=Request.QueryString %>

将输出

The unparsed query string is: name=fred&age=22

应用于

Request 对象


Request.ServerVariables 集合

ServerVariables 集合

ServerVariables 集合检索预定的环境变量

语法

Request.ServerVariables (server environment variable)

参数

server environment variable
指定要检索的服务器环境变量名

功能

server environment variable 表示要检索的服务器环境变量名，可以是下面的内容：

ALL_HTTP | 客户端发送的所有 HTTP 标题文件。
ALL_RAW | 检索未处理表格中所有的标题。ALL_RAW 和 ALL_HTTP 不同，ALL_HTTP 在标题文件名前面放置 HTTP_ prefix，并且标题名称总是大写的。使用 ALL_RAW 时，标题名称和值只在客户端发送时才出现。
APPL_MD_PATH | 检索 ISAPI DLL 的 (WAM) Application 的元数据库路径。
APPL_PHYSICAL_PATH | 检索与元数据库路径相应的物理路径。IIS 通过将 APPL_MD_PATH 转换为物理（目录）路径以返回值。
AUTH_PASSWORD | 该值输入到客户端的鉴定对话中。只有使用基本鉴定时，该变量才可用。
AUTH_TYPE | 这是用户访问受保护的脚本时，服务器用于检验用户的验证方法。
AUTH_USER | 未被鉴定的用户名。
CERT_COOKIE | 客户端验证的唯一 ID，以字符串方式返回。可作为整个客户端验证的签字。
CERT_FLAGS | 如有客户端验证，则 bit0 为 1。 如果客户端验证的验证人无效（不在服务器承认的 CA 列表中），bit1 被设置为 1。
CERT_ISSUER | 用户验证中的颁布者字段（O=MS，OU=IAS，CN=user name，C=USA）。
CERT_KEYSIZE | 安全套接字层连接关键字的位数，如 128。
CERT_SECRETKEYSIZE | 服务器验证私人关键字的位数。如 1024。
CERT_SERIALNUMBER | 用户验证的序列号字段。
CERT_SERVER_ISSUER | 服务器验证的颁发者字段。
CERT_SERVER_SUBJECT | 服务器验证的主字段。
CERT_SUBJECT | 客户端验证的主字段。
CONTENT_LENGTH | 客户端发出内容的长度。
CONTENT_TYPE | 内容的数据类型。同附加信息的查询一起使用，如 HTTP 查询 GET、 POST 和 PUT。
GATEWAY_INTERFACE | 服务器使用的 CGI 规格的修订。格式为 CGI/revision。
HTTP_<HeaderName> | HeaderName 存储在标题文件中的值。未列入该表的标题文件必须以 HTTP_ 作为前缀，以使 ServerVariables 集合检索其值。 注意 服务器将 HeaderName 中的下划线（_）解释为实际标题中的破折号。例如，如果您指定 HTTP_MY_HEADER，服务器将搜索以 MY-HEADER 为名发送的标题文件。
HTTPS | 如果请求穿过安全通道（SSL），则返回 ON。如果请求来自非安全通道，则返回 OFF。
HTTPS_KEYSIZE | 安全套接字层连接关键字的位数，如 128。
HTTPS_SECRETKEYSIZE | 服务器验证私人关键字的位数。如 1024。
HTTPS_SERVER_ISSUER | 服务器验证的颁发者字段。
HTTPS_SERVER_SUBJECT | 服务器验证的主字段。
INSTANCE_ID | 文本格式 IIS 实例的 ID。如果实例 ID 为 1，则以字符形式出现。使用该变量可以检索请求所属的（元数据库中）Web 服务器实例的 ID。
INSTANCE_META_PATH | 响应请求的 IIS 实例的元数据库路径。
LOCAL_ADDR | 返回接受请求的服务器地址。如果在绑定多个 IP 地址的多宿主机器上查找请求所使用的地址时，这条变量非常重要。
LOGON_USER | 用户登录 Windows NT® 的帐号。
PATH_INFO | 客户端提供的额外路径信息。可以使用这些虚拟路径和 PATH_INFO 服务器变量访问脚本。如果该信息来自 URL，在到达 CGI 脚本前就已经由服务器解码了。
PATH_TRANSLATED | PATH_INFO 转换后的版本，该变量获取路径并进行必要的由虚拟至物理的映射。
QUERY_STRING | 查询 HTTP 请求中问号（?）后的信息。
REMOTE_ADDR | 发出请求的远程主机的 IP 地址。
REMOTE_HOST | 发出请求的主机名称。如果服务器无此信息，它将设置为空的 MOTE_ADDR 变量。
REMOTE_USER | 用户发送的未映射的用户名字符串。该名称是用户实际发送的名称，与服务器上验证过滤器修改过后的名称相对。
REQUEST_METHOD | 该方法用于提出请求。相当于用于 HTTP 的 GET、HEAD、POST 等等。
SCRIPT_NAME | 执行脚本的虚拟路径。用于自引用的 URL。
SERVER_NAME | 出现在自引用 UAL 中的服务器主机名、DNS 化名或 IP 地址。
SERVER_PORT | 发送请求的端口号。
SERVER_PORT_SECURE | 包含 0 或 1 的字符串。如果安全端口处理了请求，则为 1，否则为 0。
SERVER_PROTOCOL | 请求信息协议的名称和修订。格式为 protocol/revision 。
SERVER_SOFTWARE | 应答请求并运行网关的服务器软件的名称和版本。格式为 name/version 。
URL | 提供 URL 的基本部分。

注释

如果客户端发送的标题文件在上述表格中找不到，可以在调用 Request.ServerVariables 中给标题文件名加上 HTTP_ 的前缀以检索其值。例如，如果客户端发送标题文件

SomeNewHeader:SomeNewValue

您可以通过使用下面的语法检索 SomeNewValue

<% Request.ServerVariables("HTTP_SomeNewHeader") %>

您可使用重述符以循环遍历所有的服务器变量名。例如，使用下面的脚本打印出所有的服务器名。

<TABLE>
<TR><TD><B>Server Variable</B></TD><TD><B>Value</B></TD></TR>
<% For Each name In Request.ServerVariables %>
<TR><TD> <%= name %> </TD><TD>  <%= Request.ServerVariables(name) %> </TD></TR>
</TABLE>
<% Next %>

示例

下面的例子使用 Request 对象显示一些服务器变量。

<HTML>
<!-- This example displays the content of several ServerVariables. -->
ALL_HTTP server variable =
<%= Request.ServerVariables("ALL_HTTP") %> <BR>
CONTENT_LENGTH server variable =
<%= Request.ServerVariables("CONTENT_LENGTH") %> <BR>
CONTENT_TYPE server variable =
<%= Request.ServerVariables("CONTENT_TYPE") %> <BR>
QUERY_STRING server variable =
<%= Request.ServerVariables("QUERY_STRING") %> <BR>
SERVER_SOFTWARE server variable =
<%= Request.ServerVariables("SERVER_SOFTWARE") %> <BR>
</HTML>

下一个示例使用 ServerVariables 集合将服务器名插入一个超文本链接。

<A HREF = "http://<%= Request.ServerVariables("SERVER_NAME") %>
/scripts/MyPage.asp">Link to MyPage.asp</A>

应用于

Request 对象


Request.TotalBytes 属性

TotalBytes 属性

TotalBytes 属性指定客户端在请求正文中发送的总字节数。该属性只允许读

语法

Counter = Request.TotalBytes

参数

Counter
指定一个变量来接收客户端在请求中发送的总字节数。

示例

以下脚本设置一个等于请求对象中包括的总字节数的变量。

<%
Dim bytecount
bytecount = Request.TotalBytes
%>

应用于

Request 对象


Request.ContentType 属性

ContentType 属性

ContentType 属性读取请求的 FORM 内容类型

语法

type = Request.ContentType

参数

type
返回请求的 FORM 内容类型

应用于

Request 对象


Request.BinaryRead 方法

BinaryRead 方法

BinaryRead 方法获取作为 POST 请求的一部分而从客户端传送到服务器的数据

语法

variant = Request.BinaryRead(count)

参数

variant
包含由该方法返回的无符号数的数组。该参数的类型为 VT_ARRAY | VT_UI1。

count
在执行前，指定要从客户端读取的字节数。

示例

下列示例使用 BinaryRead 方法将请求的内容放入一个安全的数组中。

<%
Dim binread
Dim bytecount
bytecount = Request.TotalBytes
binread = Request.BinaryRead(bytecount)
%>

应用于

Request 对象


Response 对象

使用 Response 对象可以将输出发送到客户端

语法

Response.collection|property|method

对象

Socket 提供 TCP 的控制与读写操作，同时支持底层的二进制读写和高级的字符流处理

集合

Cookies Cookies 集合设置 cookie 的值。若指定的 cookie 不存在，则创建它。若存在，则设置新的值并且将旧值删去

属性

Buffer | Buffer 属性指示是否缓冲页输出。当缓冲页输出时，只有当前页的所有服务器脚本处理完毕或者调用了 End 方法后，服务器才将响应发送给客户端
CacheControl | CacheControl 属性忽略 Private 默认值。当你设置其属性为 Public 时, 代理服务器可以缓冲由 ASP 产生的输出
ContentEncoding | ContentEncoding 属性指定响应的 HTTP 内容编码类型，未设定时为不进行编码
ContentType | ContentType 属性指定响应的 HTTP 内容类型。如果未指定 ContentType，默认为 text/HTML
Expires | Expires 属性指定了在浏览器上缓冲存储的页距过期还有多少时间。如果用户在某个页过期之前又回到此页，就会显示缓冲区中的版本
ExpiresAbsolute | ExpiresAbsolute 属性指定缓存于浏览器中的页的到期日期和时间
Pics | PICS 属性向响应标题的 pics 标签字段添加值
Status | Status 属性指定服务器返回的状态行的值。HTTP 规格中定义了 Status 值

方法

AddHeader | AddHeader 方法用指定的值添加 HTML 标题。该方法常常向响应添加新的 HTTP 标题
AppendToLog | AppendToLog 方法将字符串添加到 Web 服务器日志条目的末尾，目前忽略其调用
BinaryWrite | BinaryWrite 方法不经任何字符转换就将指定的信息写到 HTTP 输出
Clear | Clear 方法删除缓冲区中的所有 HTML 输出。Clear 方法只删除响应正文而不删除响应标题
End | End 方法使 Web 服务器停止处理脚本并返回当前结果。文件中剩余的内容将不被处理
Flush | Flush 方法立即发送缓冲区中的输出，NetBox 忽略此操作
IsClientConnected | 检测客户连接是否仍然有效
MapToFile | 直接向浏览器返回指定的文件
Redirect | Redirect 方法使浏览器尝试连接到其他 URL
Write | Write 方法将指定的字符串写到当前的 HTTP 输出


Socket 对象

提供 TCP 的控制与读写操作，同时支持底层的二进制读写和高级的字符流处理

语法

Set socket = CreateObject("NetBox.Socket")

属性

dataAvailable | 返回 Socket 对象中当前可以读取的数据尺寸
Echo | 指定是否回送所有的输入数据，缺省为 false
Eof | 查询当前 Socket 对象是否仍有数据可以读取
Handle | 返回 Socket 对象的 socket 句柄
LocalAddress | 返回 Socket 对象本地 IP 地址
LocalPort | 返回 Socket 对象的本地端口
RemoteAddress | 返回 Socket 对象远端 IP 地址
RemotePort | 返回 Socket 对象的远端端口
Timeout | 设定 Socket 对象的读写超时时间

方法

Accept | 从已经建立 TCP 侦听的 Socket 对象接受一个新的 TCP 连接
BinaryRead | 从 TCP 连接中读取指定大小的数据块，结果类型为 VT_ARRAY | VT_UI1
BinaryWrite | 将给定的二进制数据块写入到 TCP 连接中
Close | 关闭当前的连接
Connect | 使用 Socket 对象连接到 strAddr:port
Listen | 使用 Socket 对象在指定的地址、端口上面建立侦听端口
ReadLine | 从 TCP 连接中读取一行文本，不包含回车
ReadPassword | 从 TCP 连接输入一行字符串，无论 Socket.Echo 设定如何均不回送输入的字符
Resolve | 查询给定的主机的 IP 地址
SSLAccept | 在已经建立的 TCP 连接上面接受一个新的已经建立了 SSL 通道的 Socket 对象
SSLConnect | 在已经建立的 TCP 连接上面建立 SSL 通道
SSLClose | 在 Socket 对象上面关闭 SSL 连接
Write | 将给定的字符串输出到 TCP 连接
WriteBlankLines | 输出指定数量的空行到 TCP 连接
WriteLine | 将给定的字符串输出到 TCP 连接并换行

注释

使用 Socket 对象，可以直接对 TCP Socket 进行操作，建立 TCP 连接，读写二进制数据块，读写字符流，在指定的端口建立侦听，所有这些操作又可以方便地提升为 SSL 连接以提高数据传输的安全性。

应用于

Response 对象


Response.Cookies 集合

Cookies 集合

Cookies 集合设置 cookie 的值。若指定的 cookie 不存在，则创建它。若存在，则设置新的值并且将旧值删去

语法

Response.Cookies(cookie)[(key)|.attribute] = value

参数

cookie
cookie 的名称

key
可选参数。如果指定了 key，则 cookie 就是一个字典，而 key 将被设置为 value

attribute
指定 cookie 自身的有关信息

Value
指定分配给 key 或 attribute 的值

功能

attribute 表示 cookie 自身的有关信息。attribute 参数可以是下列之一：

Domain | 只允许写。若被指定，则 cookie 将被发送到对该域的请求中去。
Expires | 只允许写。cookie 的过期日期。为了在会话结束后将 cookie 存储在客户端磁盘上，必须设置该日期。若此项属性的设置未超过当前日期，则在任务结束后 cookie 将到期。
HasKeys | 只允许读。指定 cookie 是否包含关键字。
Path | 只允许写。若被指定，则 cookie 将只发送到对该路径的请求中。如果未设置该属性，则使用应用程序的路径。
Secure | 只允许写。指定 cookie 是否安全。

注释

如果创建了一个带有关键字的 cookie，如下列脚本所示，

<%
Response.Cookies("mycookie")("type1") = "sugar"
Response.Cookies("mycookie")("type2") = "ginger snap"
%>

则此标题将被发送出去。

Set-Cookie:MYCOOKIE=TYPE1=sugar&TYPE2=ginger+snap

如果在指定 myCookie 时不指定关键字，将破坏 type1 和 type2。如下面示例所示。

<% Response.Cookies("myCookie") = "chocolate chip" %>

在前面的示例中，关键字 type1 和 type2 被破坏且其值也被删除。myCookie cookie 只有 chocolate chip 的值。

反之，如果您用一个关键字调用 cookie，就会毁坏 cookie 包含的任何无关键字的值。例如，如果在上述代码后，用下面的语句调用 Response.Cookies，

<% Response.Cookies("myCookie")("newType") = "peanut butter" %>

则 chocolate chip 的值将被删除且 newType 会被设置为 peanut butter。

要确定 cookie 是否有关键字，可使用下面的语法。

<%= Response.Cookies("myCookie").HasKeys %>

如果 myCookie 是一个 cookie 字典，则前面的值为 TRUE。否则，为 FALSE。

可以通过循环来设置 cookie 的属性。例如，要将所有的 cookie 设置为在一个特定的日期到期，可使用下面的语法。

<%
For Each cookie in Response.Cookies
  Response.Cookie(cookie).Expires = #July 4, 1997#
Next
%>

您可以使用一个循环设置一个集合中的所有 cookie 或一个 cookie 中的所有关键字。然而，循环在 cookie 没有关键字时若被引用将不会执行。为避免这种情况，你可以先使用 .HasKeys 语法检查一个 cookie 是否有关键字。下面的示例对此进行说明。

<%
If Not cookie.HasKeys Then
  'Set the value of the cookie
  Response.Cookies(cookie) = ""
Else
  'Set the value for each key in the cookie collection
  For Each key in Response.Cookies(cookie)
    Response.Cookies(cookie)(key) = ""
  Next key
%>

示例

下面的示例说明如何设置 cookie 的值以及如何为其属性赋值。

<%
Response.Cookies("Type") = "Chocolate Chip"
Response.Cookies("Type").Expires = "July 31, 1997"
Response.Cookies("Type").Domain = "msn.com"
Response.Cookies("Type").Path = "/www/home/"
Response.Cookies("Type").Secure = FALSE
%>

应用于

Response 对象


Response.Buffer 属性

Buffer 属性

Buffer 属性指示是否缓冲页输出。当缓冲页输出时，只有当前页的所有服务器脚本处理完毕或者调用了 End 方法后，服务器才将响应发送给客户端

语法

Response.Buffer [= flag]

参数

flag
指定是否缓冲页输出

注释

服务器将输出发送给客户端后就不能再设置 Buffer 属性。因此，应该在 .asp 文件的第一行调用 Response.Buffer。

应用于

Response 对象


Response.CacheControl 属性

CacheControl 属性

CacheControl 属性忽略 Private 默认值。当你设置其属性为 Public 时, 代理服务器可以缓冲由 ASP 产生的输出

语法

Response.CacheControl [= Cache Control Header ]

参数

Cache control Header
缓冲存储器控制标题可以是 Public 或 Private

应用于

Response 对象


Response.ContentEncoding 属性

ContentEncoding 属性

ContentEncoding 属性指定响应的 HTTP 内容编码类型，未设定时为不进行编码

语法

Response.ContentEncoding [= ContentEncoding]

参数

ContentEncoding
描述内容类型的字符串，用于说明内容希望的编码方式。可为“GZIP”或“deflate”。

注释

Response.ContentEncoding 用于设定当前页面送至用户端时的编码方式，目前支持 GZIP 和 deflate 两种方式编码，不设定则为直接传送。通过设定编码方式，可以将内容压缩传送，大大减少数据传输量，提高应用的可用性。

使用 Response.ContentEncoding 设定编码方式，Response.Buffer 必须设定为 true(确省模式)，同时在设定前不允许有任何数据输出，如果需要在输出部分数据后设定 Response.ContentEncoding，可以先使用 Response.Clear 清除输出数据后再进行设定。如果需要清除编码模式，也可以使用 Response.Clear 进行清除，这样，以前输出的数据也将丢失。

在设定 Response.ContentEncoding 时，系统将查看客户浏览器是否支持编码压缩，如果不支持，则设定将被忽略，数据仍直接传送到客户端。

示例

下面的例子先将 Response.ContentEncoding 设定为 “GZIP”，然后输出大量数据：

<%Response.ContentEncoding = "GZIP"
For i = 0 To 1000
    Response.Write "<br>" & i
Next%>

这段程序在传输数据为 6898 个字节，而经过编码压缩处理，实际只传输了 1987 个字节。

应用于

Response 对象


Response.ContentType 属性

ContentType 属性

ContentType 属性指定响应的 HTTP 内容类型。如果未指定 ContentType，默认为 text/HTML

语法

Response.ContentType [= ContentType]

参数

ContentType
描述内容类型的字符串。该字符串通常被格式化为类型/子类型，其中类型是常规内容范畴而子类为特定内容类型。有关支持内容类型的完整列表，请参阅 Web 浏览器文档或当前的 HTTP 规格说明。

示例

下面的示例将内容类型设置为 Channel Definition Format（CDF）。

<% Response.ContentType = "application/x-cdf" %>

下面的示例将 ContentType 属性设置为其他的常见值。

<% Response.ContentType = "text/HTML" %>
<% Response.ContentType = "image/GIF" %>
<% Response.ContentType = "image/JPEG" %>

应用于

Response 对象


Response.Expires 属性

Expires 属性

Expires 属性指定了在浏览器上缓冲存储的页距过期还有多少时间。如果用户在某个页过期之前又回到此页，就会显示缓冲区中的版本

语法

Response.Expires [= number]

参数

number
距过期还有多少分钟。将此参数设置为 0 可使缓存的页立即过期。

注释

若此属性在一页上设置了多次，则使用最短的时间。

应用于

Response 对象


Response.ExpiresAbsolute 属性

ExpiresAbsolute 属性

ExpiresAbsolute 属性指定缓存于浏览器中的页的到期日期和时间

语法

Response.ExpiresAbsolute [= [date] [time]]

参数

date
指定页的到期日期。该值在符合 RFC-1123 日期格式的到期标题中发送。

time
指定页的到期时间。该值在到期标题发送之前转化为 GMT 时间。

注释

如果该属性在页中被多次设置，则以最早到期的日期和时间为准。

示例

以下示例指定页在 1996 年 5 月 31 日下午 1:30 分 15 秒到期。

<% Response.ExpiresAbsolute=#May 31,1996 13:30:15# %>

应用于

Response 对象


Response.Pics 属性

Pics 属性

PICS 属性向响应标题的 pics 标签字段添加值

语法

Response.PICS(PICSLabel)

参数

PICSLabel
经适当格式化的 PICS 标签字符串。由 PICSLabel 指定的值将被添加到响应标题中的 PICS 标签字段之后

注释

PICS 属性在标题中插入任何字符串，不管它是否表示有效的 PICS 标签。

若一个单页包含多个包含 Response.PICS 的标记，则每个实例代替上一个 PICS 标签设置的 PICS 标签。结果是，PICS 将被设置为页中上一个 Response.PICS 实例所指定的值。

由于 PICS 标签包含引号，所以必须用 " & chr(34) & " 替换每个引号。

示例

对于包含

<%
Response.PICS("(PICS-1.1 <http://www.rsac.org/ratingv01.html> labels on " & chr(34) & "1997.01.05T08:15-0500" & chr(34) & " until" & chr(34) & "1999.12.31T23:59-0000" & chr(34) & " ratings (v 0 s 0 l 0 n 0))")
%>

的 .asp 文件，将添加以下标题：

PICS-label:(PICS-1.1 <http://www.rsac.org/ratingv01.html> labels on "1997.01.05T08:15-0500" until "1999.12.31T23:59-0000" ratings (v 0 s 0 l 0 n 0))

应用于

Response 对象


Response.Status 属性

Status 属性

Status 属性指定服务器返回的状态行的值。HTTP 规格中定义了 Status 值

语法

Response.Status = StatusDescription

参数

StatusDescription
包含表示状态码的三位数和该代码简短说明的字符串。例如，310 Move Permanently

注释

使用该属性修改服务器返回的状态行。

示例

下面示例设置响应状态。

<% Response.Status = "401 Unauthorized" %>

应用于

Response 对象


Response.AddHeader 方法

AddHeader 方法

AddHeader 方法用指定的值添加 HTML 标题。该方法常常向响应添加新的 HTTP 标题

语法

Response.AddHeader name, value

参数

name
新的标题变量的名称

value
存储在新的标题变量中的初始值

注释

为避免命名不明确，name 中不能包含任何下划线字符 (_)。ServerVariables 集合将标题中的下划线字符解释为反斜杠。例如，下面的脚本使服务器查找一个名为 MY-HEADER 的标题名。

<% Request.ServerVariables("HTTP_MY_HEADER") %>

示例

下面这个示例使用 AddHeader 方法要求客户端使用 BASIC 验证。

<% Response.Addheader "WWW-Authenticate", "BASIC" %>

注意 前面的脚本仅通知客户端浏览器使用哪个验证。若您在 Web 应用程序中使用该脚本，则一定要启用 Web 服务器的 BASIC 验证。

应用于

Response 对象


Response.AppendToLog 方法

AppendToLog 方法

AppendToLog 方法将字符串添加到 Web 服务器日志条目的末尾，目前忽略其调用

语法

Response.AppendToLog string

参数

string
要添加到日志文件中的文本。由于 IIS 日志中的字段由逗号分隔，所以该字符串中不能包含逗号 (,)。字符串最大长度为 80 个字符

应用于

Response 对象


Response.BinaryWrite 方法

BinaryWrite 方法

BinaryWrite 方法不经任何字符转换就将指定的信息写到 HTTP 输出

语法

Response.BinaryWrite data

参数

data
写到 HTTP 输出的数据

示例

如果有一个产生字节数组的对象，就如下调用 BinaryWrite 将这些生成的字节发送给客户端应用程序。

<%
Set BinGen = Server.CreateObject(MY.BinaryGenerator)
Pict = BinGen.MakePicture
Response.BinaryWrite Pict
%>

应用于

Response 对象


Response.Clear 方法

Clear 方法

Clear 方法删除缓冲区中的所有 HTML 输出。Clear 方法只删除响应正文而不删除响应标题

语法

Response.Clear

注释

调用 Response.Clear 将清楚本页面前面部分所输出的数据，同时，如果程序设定了 Response.ContentEncoding，Response.Clear 将同时将编码方式设定为直接传送。

应用于

Response 对象


Response.End 方法

End 方法

End 方法使 Web 服务器停止处理脚本并返回当前结果。文件中剩余的内容将不被处理

语法

Response.End

注释

如果 Response.Buffer 已设置为 TRUE，则调用 Response.End 将缓冲输出。如果不希望将输出返回给用户，应调用

<%
Response.Clear
Response.End
%>

应用于

Response 对象


Response.Flush 方法

Flush 方法

Flush 方法立即发送缓冲区中的输出，NetBox 忽略此操作

语法

Response.Flush

应用于

Response 对象


Response.IsClientConnected 方法

IsClientConnected 方法

检测客户连接是否仍然有效

语法

IsConnected = Response.IsClientConnected

参数

IsConnected
返回当前客户连接的状态，如果客户仍然连接在服务器上，则返回 true

应用于

Response 对象


Response.MapToFile 方法

MapToFile 方法

直接向浏览器返回指定的文件

语法

Response.MapToFile path

参数

file
给定要传送的文件，参见 NetBox 的路径系统

注释

此方法直接将指定的文件传送给客户浏览器，从而避免了使用 Redirect 时需要再次访问服务器带来的网络流量和服务器负载。调用此方法将清除 asp 的输出，仅返回给定文件的内容。

此方法将输出内容定向为一个给定的静态文件，所以将可以支持如断点续传等特性。同样的原因，浏览器将对此文件进行缓存。所以一般不要在同一个 url 请求中 map 不同的静态文件，因为断点续传可能失败，同时在浏览器中也不会去请求服务器来得到新文件，只是使用缓存中的文件。

示例

下面的例子根据用户的请求下载不同的文件，下载的文件全部存放在 "\files" 目录下面。

<%Response.MapToFile "\files\" & Request.QueryString("file")%>

上面的代码只是演示代码，可能存在安全隐患，用户可以通过输入 "..\dd" 之类的文件名下载其他文件。

应用于

Response 对象


Response.Redirect 方法

Redirect 方法

Redirect 方法使浏览器尝试连接到其他 URL

语法

Response.Redirect URL

参数

URL
浏览器重定向到的统一资源定位符 (URL)

注释

任何在页中显式设置的响应正文内容都将被忽略。然而，此方法不向客户端发送该页设置的其他 HTTP 标题。将产生一个将重定向 URL 作为链接包含的自动响应正文。Redirect 方法发送下列显式标题，其中 URL 是传递给该方法的值。

HTTP/1.0 302 Object Moved
Location: URL

应用于

Response 对象


Response.Write 方法

Write 方法

Write 方法将指定的字符串写到当前的 HTTP 输出

语法

Response.Write variant

参数

variant
需要写的数据。该参数可以是任何 Visual Basic Scripting Edition 的 VARIANT 数据类型，包括字符、字符串和整数。该值不能包括字符组合 %>，如果需要，可用转义序列 %\> 代替。Web 服务器在处理脚本时，将转换这一转义序列

示例

以下示例用 Response.Write 方法将输出发送到客户端。

I just want to say <% Response.Write "Hello World." %>
Your name is: <% Response.Write Request.Form("name") %>

以下示例将 HTML 标记添加到 Web 页输出。由于 Write 方法返回的字符串不包含字符组合 %>，代之的是 %\>。以下脚本

<% Response.Write "<TABLE WIDTH = 100%\>" %>

输出

<TABLE WIDTH = 100%>

应用于

Response 对象


ScriptError 对象

ScriptError 用于传递 Script 对象的错误信息

语法

Set ScriptError = Script.GetLastError

属性

Category | 返回错误产生的种类，通常是产生错误的模块
Column | 返回错误产生的具体行内的列数
Description | 返回错误信息的详细描述
File | 返回错误产生所在的文件名
Line | 返回错误信息在文件中的行号
Number | 返回错误信息的代码
Source | 返回错误所在行的代码

参数

ScriptError
返回 Script 对象的错误信息对象

Script
一个实例化的 Script 对象

注释

ScriptError 对象用于存储 Script 对象的错误信息，使用 Script.GetLastError 取得，使用 ScriptError 对象可以取得包括错误行号、错误码、错误提示、错误类型等详细的错误信息。

示例

下面的代码执行 err.box，如果执行过程中出现错误，则输出错误结果：

Set Script = CreateObject("NetBox.Script")
e = Script.Load("Err.box")
If e = 0 Then
    Script.SetGlobalObjects

    e = Script.Run
End If

If e = 404 Then
    Shell.Console.WriteLine "Bad Command"
ElseIf e <> 0 Then
    Set error = Script.GetLastError
    Shell.Console.WriteLine error.Category
    Shell.Console.WriteLine "Error Number: " & Hex(error.Number)
    Shell.Console.WriteLine "File: " & error.File
    Shell.Console.WriteLine "Line: " & error.Line
    Shell.Console.WriteLine error.Description & vbCRLF
    Set error = Nothing
End If

Set Script = nothing

err.box 的代码如下：

a = "asd" + 100

Sub OnScriptError
    Shell.Console.WriteLine "OnScriptError"
End Sub

Sub OnScriptEnd
    Shell.Console.WriteLine "OnScriptEnd"
End Sub

运行结果在控制台输出下面的信息：

OnScriptError
Microsoft VBScript runtime error
Error Number: 800A000D
File: \err.box
Line: 1
Type mismatch: '[string: "asd"]'


ScriptError.Category 属性

Category 属性

返回错误产生的种类，通常是产生错误的模块

语法

category = ScriptError.Category

参数

category
返回错误种类

ScriptError
从 Script 对象取得的错误信息对象

注释

以 VBScript 为例，常见的错误种类包括三种：

Microsoft VBScript compilation error

如果 VBScript 语句结构违反了一个或多个 VBScript 脚本语言语法规则，就会产生 VBScript 语法错误。VBScript 语法错误通常在执行程序前，编译程序时产生。

Microsoft VBScript runtime error

如果 VBScript 脚本执行系统无法实施的操作，则会产生 VBScript 运行时错误。只有在运行脚本、为变量表达式赋值或分配内存时，才会产生 VBScript 运行时错误。

NetBox script parser error

如果 NetBox 在分析脚本格式时发现无法理解的或者格式错误的预处理命令，则会产生这类错误。

应用于

ScriptError 对象


ScriptError.Column 属性

Column 属性

返回错误产生的具体行内的列数

语法

column = ScriptError.Column

参数

column
返回错误产生的具体行内的列数

ScriptError
从 Script 对象取得的错误信息对象

应用于

ScriptError 对象


ScriptError.Description 属性

Description 属性

返回错误信息的详细描述

语法

description = ScriptError.Description

参数

description
返回错误信息的详细描述

ScriptError
从 Script 对象取得的错误信息对象

应用于

ScriptError 对象


ScriptError.File 属性

File 属性

返回错误产生所在的文件名

语法

filename = ScriptError.File

参数

filename
返回错误产生所在的文件名

ScriptError
从 Script 对象取得的错误信息对象

注释

ScriptError.File 明确指明错误产生所在的实际文件的文件名，而不是运行程序的文件名，如果错误出现在运行程序包含的文件中，则返回的文件名是包含文件的名称。

应用于

ScriptError 对象


ScriptError.Line 属性

Line 属性

返回错误信息在文件中的行号

语法

line = ScriptError.Line

参数

line
返回错误行号

ScriptError
从 Script 对象取得的错误信息对象

应用于

ScriptError 对象


ScriptError.Number 属性

Number 属性

返回错误信息的代码

语法

number = ScriptError.Number

参数

number
返回错误信息的代码

ScriptError
从 Script 对象取得的错误信息对象

应用于

ScriptError 对象


ScriptError.Source 属性

Source 属性

返回错误所在行的代码

语法

source = ScriptError.Source

参数

source
返回错误所在行的代码

ScriptError
从 Script 对象取得的错误信息对象

应用于

ScriptError 对象


Server 对象

Server 对象提供对服务器上的方法和属性的访问，其中大多数方法和属性是作为实用程序的功能服务的

语法

Server.property|method

属性

ScriptTimeout ScriptTimeout 属性指定脚本在结束前最大可运行多长时间，目前版本的 NetBox 不支持超时

方法

CreateObject | CreateObject 方法创建服务器组件的实例
Execute | Execute 方法执行一个 .asp 文件然后返回调用者
GetLastError | GetLastError 方法返回一个 ScriptError 对象用于描述当前 asp 程序的运行错误
HTMLEncode | HTMLEncode 方法对指定的字符串应用 HTML 编码
MapPath | MapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上
Transfer | Transfer 方法执行一个 .asp 文件然后结束处理
UrlEncode | UrlEncode 方法将 URL 编码规则，包括转义字符，应用到指定的字符串


Server.ScriptTimeout 属性

ScriptTimeout 属性

ScriptTimeout 属性指定脚本在结束前最大可运行多长时间，目前版本的 NetBox 不支持超时

语法

Server.ScriptTimeout = NumSeconds

参数

NumSeconds
指定脚本在被服务器结束前最大可运行的秒数

示例

以下示例中，如果服务器处理脚本超过 100 秒，将使之超时。

<% Server.ScriptTimeout = 100 %>

以下示例获取 ScriptTimeout 属性当前值，并将其存储在变量 TimeOut 中。

<% TimeOut = Server.ScriptTimeout %>

应用于

Server 对象


Server.CreateObject 方法

CreateObject 方法

CreateObject 方法创建服务器组件的实例

语法

Server.CreateObject(progID)

参数

progID
指定要创建的对象的类型

注释

可以使用 Server.CreateObject 创建一个新的对象实例， Server.CreateObject 可以创建的对象分为三种，第一种是已经在系统注册过的标准 COM 对象，作用等同于 VBScript 本身的 CreateObject，比如：

Set rs = Server.CreateObject("ADODB.RecordSet")

第二种是 NetBox 内部提供给 Script 使用的标准对象，具体的对象 ProgID 及其使用方法可以参考手册，比如：

Set socket = Server.CreateObject("NetBox.Socket")

第三种是以 wsc 格式书写并在 NetBox 内部注册成功的脚本部件，比如：

NetBox.RegisterClass "\wsc\MyClass.wsc"
Set o = Server.CreateObject("myclass")

其中 "\wsc\MyClass.wsc" 是以 wsc 格式书写的脚本部件，其 ProgID 为 ''myclass"。

以上三类对象的查找顺序为：

1.wsc 对象
2.NetBox 标准内部对象
3.系统注册的标准 COM 对象

默认情况下，由 Server.CreateObject 方法创建的对象具有页作用域。这就是说，再当前 ASP 页处理完成之后，服务器将自动破坏这些对象。

应用于

Server 对象


Server.Execute 方法

Execute 方法

Execute 方法执行一个 .asp 文件然后返回调用者

语法

Server.Execute(Path)

参数

Path
给定的 .asp 文件名

应用于

Server 对象


Server.GetLastError 方法

GetLastError 方法

GetLastError 方法返回一个 ScriptError 对象用于描述当前 asp 程序的运行错误

语法

Server.GetLastError()

注释

使用 Script.GetLastError 可以取得 Script 对象最后的错误信息，包括语法错误、运行错误等。返回信息存放在一个 ScriptError 对象中。

应用于

Server 对象


Server.HTMLEncode 方法

HTMLEncode 方法

HTMLEncode 方法对指定的字符串应用 HTML 编码

语法

Server.HTMLEncode(string )

参数

string
指定要编码的字符串

示例

下面的脚本程序

<%= Server.HTMLEncode("The paragraph tag: <P>")%>

将输出下面的文字

The paragraph tag: &lt;P&gt;

经过浏览器自动解码，将现实下面的现实内容

The paragraph tag: <P>

如果你使用 View Source 察看页面的代码，将看到经过编码的文本。

应用于

Server 对象


Server.MapPath 方法

MapPath 方法

MapPath 方法将指定的相对或虚拟路径映射到服务器上相应的物理目录上

语法

Server.MapPath(Path)

参数

Path
指定要映射物理目录的相对或虚拟路径。若 Path 以一个正斜杠 (/) 或反斜杠 (\) 开始，则 MapPath 方法返回路径时将 Path 视为完整的虚拟路径。若 Path 不是以斜杠开始，则 MapPath 方法返回同 .asp 文件中已有的路径相对的路径。

注释

MapPath 方法不支持相对路径语法 (.) 或 (..)。例如，下列相对路径 ../MyDir/MyFile.txt 返回一个错误。

MapPath 方法不检查返回的路径是否正确或在服务器上是否存在。

因为 MapPath 方法只映射路径而不管指定的目录是否存在，所以，您可以先用 MapPath 方法映射物理目录结构的路径，然后将其传递给在服务器上创建指定目录或文件的组件。

示例

对于下列示例，文件 data.txt 和包含下列脚本的 test.asp 文件都位于目录 C:\NetBox\Wwwroot\Script 下。C:\NetBox\Wwwroot 目录被设置为服务器的宿主目录。

下列示例使用服务器变量 PATH_INFO 映射当前文件的物理路径。脚本

<%= server.mappath(Request.ServerVariables("PATH_INFO"))%><BR>

输出

c:\NetBox\wwwroot\script\test.asp<BR>

由于下列示例中的路径参数不是以斜杠字符开始的，所以它们被相对映射到当前目录，此处是 C:\NetBox\Wwwroot\Script。脚本

<%= server.mappath("data.txt")%><BR>
<%= server.mappath("script/data.txt")%><BR>

输出

c:\NetBox\wwwroot\script\data.txt<BR>
c:\NetBox\wwwroot\script\script\data.txt<BR>

接下来的两个示例使用斜杠字符指定返回的路径应被视为在服务器的完整虚拟路径。脚本

<%= server.mappath("/script/data.txt")%><BR>
<%= server.mappath("\script")%><BR>

输出

c:\NetBox\wwwroot\script\data.txt<BR>
c:\NetBox\wwwroot\script<BR>

下列示例演示如何使用正斜杠 (/) 或反斜杠 (\) 返回宿主目录的物理路径。脚本

<%= server.mappath("/")%><BR>
<%= server.mappath("\")%><BR>

输出

c:\NetBox\wwwroot<BR>
c:\NetBox\wwwroot<BR>

应用于

Server 对象


Server.Transfer 方法

Transfer 方法

Transfer 方法执行一个 .asp 文件然后结束处理

语法

Server.Transfer(Path)

参数

Path
给定的 .asp 文件名

应用于

Server 对象


Server.UrlEncode 方法

UrlEncode 方法

UrlEncode 方法将 URL 编码规则，包括转义字符，应用到指定的字符串

语法

Server.UrlEncode(string )

参数

String
指定要编码的字符串

示例

下面的脚本代码：

<%=Server.UrlEncode("[test]")%>

运行结果为：

%5Btest%5D

应用于

Server 对象


Session 对象

存储特定用户会话所需的信息，当用户在应用程序的 Web 页之间跳转时，存储在 Session 对象中的变量将不会丢失，而是在整个用户会话中一直存在下去

语法

Session.collection|property|method

集合

Contents 基本集合，使用标准内部对象 Dictionary 存放数据

属性

LastAccessTime | 查询回话最后访问时间，返回的时间为最后一次 asp 请求接受时间
SessionID | SessionID 属性返回用户的会话标识
SessionKey | 查询当前会话的标识字符串
Timeout | Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限

方法

Abandon | Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 Abandon 方法，一旦会话超时，服务器将删除这些对象
Reset | 清除 Session 中的全部数据和对象，并与浏览器重新建立会话

注释

当用户请求来自应用程序的 Web 页时，如果该用户还没有会话，则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后，服务器将终止该会话。

Session 对象最常见的一个用法就是存储用户的首选项。例如，如果用户指明不喜欢查看图形，就可以将该信息存储在 Session 对象中。

您可以在 Session 对象中存储值。存储在 Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。

<%
Session("username") = "Janine"
Session("age") = 24
%>

但是，如果您将对象存储在 Session对象中，而且您使用 VBScript 作为主脚本语言。则必须使用关键字 Set。如下列脚本所示。

<% Set Session("Obj1") = Server.CreateObject("MyComponent.class1") %>

然后，您就可以在后面的 Web 页上调用 MyComponent.class1 揭示的方法和属性，其调用方法如下：

<% Session("Obj1").MyMethod %>

也可以通过展开该对象的本地副本并使用下列脚本来调用：

<%
Set MyLocalObj1 = Session("Obj1")
MyLocalObj1.MyObjMethod
%>

在将对象存储到 Session 对象之前，必须了解它使用的是哪一种线程模型。只有那些标记为“Both”的对象才能存储在没有锁定单线程会话的 Session 对象中。详细信息, 请参阅“创建 ASP 组件”中的“选择线程模型”。

若您将一个数组存储在 Session对象中，请不要直接更改存储在数组中的元素。例如，下列的脚本无法运行。

<% Session("StoredArray")(3) = "new value" %>

这是因为 Session对象是作为集合被实现的。数组元素 StoredArray(3) 未获得新的赋值。而此值将包含在 Application 对象集合中，并将覆盖此位置以前存储的任何信息。

我们极力建议您在将数组存储在 Session对象中时，在检索或改变数组中的对象前获取数组的一个副本。在对数组操作时，您应再将数组全部存储在 Session 对象中，这样您所做的任何改动将被存储下来。下列的脚本对此进行演示。

---file1.asp---
<%
'Creating and initializing the array
Dim MyArray()
Redim MyArray(5)
MyArray(0) = "hello"
MyArray(1) = "some other string"

'Storing the array in the Session object
Session("StoredArray") = MyArray

Response.Redirect("file2.asp")
%>

---file2.asp---
<%
'Retrieving the array from the Session Object
'and modifying its second element
LocalArray = Session("StoredArray")
LocalArray(1) = " there"

'printing out the string "hello there"
Response.Write(LocalArray(0)&LocalArray(1))

'Re-storing the array in the Session object
'This overwrites the values in StoredArray with the new values
Session("StoredArray") = LocalArray
%>

示例

下列代码将字符串 MyName 分配给名为 name 的会话变量，并给名为 year 的会话变量指定一个值，而且为 some.Obj 组件的实例指定一个名为 myObj 的变量。

<%
Session("name") = "MyName"
Session("year") = 96
Set Session("myObj") = Server.CreateObject("someObj")
%>


Session.LastAccessTime 属性

LastAccessTime 属性

查询回话最后访问时间，返回的时间为最后一次 asp 请求接受时间

语法

Session.LastAccessTime

注释

使用 LastAccessTime 属性可以在 Session 中止事件中查询用户最后离开的精确时间，因为服务器停止服务，或者调用了 Session.Abandon 或者 Session.Reset，或者其他内部原因，Session 可能不是在经过指定的超时时间以后被释放，此时使用当前时间减超时时间得到的并不是用户的最后访问时间。

应用于

Session 对象


Session.SessionID 属性

SessionID 属性

SessionID 属性返回用户的会话标识

语法

Session.SessionID

注释

不要用 SessionID 属性为数据库应用程序创建主关键字。这是因为，如果 Web 服务器重新启动，则部分 SessionID 的值可能同服务器终止前产生的值相同。可以使用自动增加的列数据类型来代替，如 Microsoft® SQL Server 中的 IDENTITY，或 Microsoft® Access 中的 COUNTER。

应用于

Session 对象


Session.SessionKey 属性

SessionKey 属性

查询当前会话的标识字符串

语法

Session.SessionKey

注释

在服务器应用与客户端浏览器创建一个新的会话后，浏览器将依靠 Cookie 来传递一个标识，服务器将使用此标识识别会话，使用此方法查询的就是这个标识。

应用于

Session 对象


Session.Timeout 属性

Timeout 属性

Timeout 属性以分钟为单位为该应用程序的 Session 对象指定超时时限

语法

Session.Timeout[ = nMinutes]

参数

注释

NetBox 目前不支持单独修改某个具体的 Session 的超时时间。

应用于

Session 对象


Session.Abandon 方法

Abandon 方法

Abandon 方法删除所有存储在 Session 对象中的对象并释放这些对象的源。如果您未明确地调用 Abandon 方法，一旦会话超时，服务器将删除这些对象

语法

Session.Abandon

注释

Abandon 方法被调用时，将按序删除当前的 Session 对象，不过在当前页中所有脚本命令都处理完后，对象才会被真正删除。这就是说，在调用 Abandon 时，可以在当前页上访问存储在 Session 对象中的变量，但在随后的 Web 页上不行。

例如，在下列脚本中，第三行打印出 Mary 值。这是因为在服务器处理完脚本前没有删除 Session 对象。

<%
Session.Abandon
Session("MyName") = "Mary"
Reponse.Write(Session("MyName"))
%>

如果在随后 Web 页上访问 MyName 变量，您将发现它是空的。这是因为当包含上一个例子的页面结束处理时，MyName 同前面的 Session 对象一起被删除了。

放弃会话并打开后面的 Web 页时，服务器会创建新的 Session 对象。您可以在新的 Session 对象中存储变量和对象。

示例

当服务器处理完当前页时，下面示例将释放会话状态。

<% Session.Abandon %>

应用于

Session 对象


Session.Reset 方法

Reset 方法

清除 Session 中的全部数据和对象，并与浏览器重新建立会话

语法

Session.Reset

注释

不同于直接调用 Session.Contents.RemoveAll，Reset 方法在清除数据的同时，也将废除当前的会话，并与浏览器建立一个全新的会话。同样，此方法也不同于 Abandon 方法，Abandon 方法只是废除当前会话，只有在用户下次访问服务器时才会建立一个新的会话，而 Reset 方法是在一次请求中直接建立新的会话，并且重用当前的会话对象，速度更快，也更加符合 Session 的使用习惯。

示例

下面的例子是一个常见的用户注销程序 logout.asp：

Session.Abandon
Response.Redirect "/main.asp"

上面的程序将废除当前会话，在用户再次访问 main.asp 时则自动再建立一个新的会话。而使用 Reset 方法则可以更加灵活：

Session.Reset
Session("username") = "guest"
Response.Redirect "/main.asp"

在上面的代码中，先废除当前会话，然后立即便可以建立新的会话数据，不需要用户再次访问其他页面即可拥有新的会话。使用起来更加方便。

Reset 方法在跨越服务器的用户迁移时也起着重要的作用，详情请参阅 NetBox 参考手册中的相关文档。

应用于

Session 对象


容器对象参考

对象 | 说 明
Dictionary | 存储数据键和项目对的对象，数据键为一个字符串，项目可以是任何数据类型
Identity | 数据标识生成对象，用于统一管理、生成唯一的数据标识
List | 可随机访问的动态数组对象，可以任意增大和缩小数组尺寸
Queue | 可双向存取的队列，通过不同的存取方式，可以构造出队列和堆栈等数据模型
Struct | 自定义简单对象，可以自行注册一个包含指定属性的对象以方便使用


Dictionary 对象

存储数据键和项目对的对象，数据键为一个字符串，项目可以是任何数据类型

语法

Set dict = CreateObject("NetBox.Dictionary")

属性

ArrayMode | 数组访问模式，允许以下标方式访问，缺省为 true
Count | 返回一个对象中的项目数，只读属性
Item | 在一个 Dictionary 对象中设置或者返回所指定 key 的 item
Items | 以数组方式返回对象中的全部项目
Key | 根据下标取得关键字的键值，只读属性
Keys | 以数组方式返回对象中的全部键值

方法

Add | 向对象中添加一个关键字项目对
Exists | 如果对象中存在所指定的关键字则返回 true，否则返回 false
Join | 返回一个字符串，此字符串由包含在对象中的所有数据键和项目对连接创建
Load | 从指定的数据源装载对象内容
Remove | 从一个 Dictionary 对象中删除一个关键字项目对
RemoveAll | RemoveAll 方法从一个对象中删除所有的项目
Save | 转储对象中的内容到指定的目标
Sort | 排序对象中的数据，可以指定升序和降序
Split | 分析给定的字符串，将分解出的子字符串填充到对象中

注释

Dictionary 类似于 Scripting.Dictionary 又与其不同，Dictionary 的数据键为字符串时将忽略大小写，当以数字作为下标查询数据时，则数字表示按照插入顺序的下标，顺序从 0 开始，如果其中某个数据键被删除，则其后插入的数据键的下标依次前移。

Dictionary 的缺省属性为 Item，所以可以直接对对象进行缺省操作。dict("c") 与 dict.Item("c") 的作用是完全等同的。

示例

下面的例子中插入一些关键字项目对，然后修改项目 "c" 为第二个插入的项目。

Set dict = CreateObject("NetBox.Dictionary")
dict.Add "a", "Athens"
dict.Add "b", "Belgrade"
dict.Add "c", "Cairo"
dict("c") = dict(1)


Dictionary.ArrayMode 属性

ArrayMode 属性

数组访问模式，允许以下标方式访问，缺省为 true

语法

dict.ArrayMode[ = mode]

参数

dict
一个实例化的 Dictionary 对象

mode
给定的需要设定的模式，为 true 则允许数组方式。缺省为 true

应用于

Dictionary 对象


Dictionary.Item 属性

Item 属性

在一个 Dictionary 对象中设置或者返回所指定 key 的 item

语法

dict.Item(key)[ = newitem]

参数

dict
一个实例化的 Dictionary 对象

key
需要在 Dictionary 对象中查找的 key 值

newitem
需要提供的关键字项目对的新项目值

注释

如果在改变一个 key 的时候没有找到该 item，那么将利用所指定的 newitem 创建一个新的 key。如果在试图返回一个已有项目的时候没有找到 key，那么将返回一个空值，对 Dictionary 不产生影响。

如果忽略 key 取得 item 属性，则将直接取得 Dictionary 的转储数据。详细信息参见 Save 方法。

该属性为缺省属性，所以可以直接对对象进行缺省操作。dict("c") 与 dict.Item("c") 的作用是完全等同的。

应用于

Dictionary 对象


Collection.Keys 属性

Keys 属性

以数组方式返回对象中的全部键值

语法

dict.Keys()

参数

dict
一个实例化的对象

应用于

Dictionary 对象 | Identity 对象


Collection.Add 方法

Add 方法

向对象中添加一个关键字项目对

语法

dict.Add(key, item)

参数

dict
一个实例化的对象

key
与被添加的 item 相关联的 key

item
与被添加的 key 相关联的 item

注释

此方法插入一个关键字项目对，如果给定的关键字存在，则返回错误。

示例

下面的例子创建一个新的 Dictionary 并插入一些数据：

Set dict = CreateObject("NetBox.Dictionary")
dict.Add "a", "Athens"
dict.Add "b", "Belgrade"
dict.Add "c", "Cairo"

应用于

Dictionary 对象 | Identity 对象


Dictionary.Join 方法

Join 方法

返回一个字符串，此字符串由包含在对象中的所有数据键和项目对连接创建

语法

str = obj.Join([varKeyDelimiter, varDelimiter])

参数

str
返回组建的字符串

obj
一个实例化的对象

varKeyDelimiter
可选项。在返回字符串中用于分隔键和项目的字符。如果省略，将使用字符 "="

varDelimiter
可选项。在返回字符串中用于分隔子字符串的字符。如果省略，将使用字符 ","

注释

此方法将试图转换对象所有非字符串变量到字符串后再进行组建，如果不能成功转换，则返回错误。

应用于

Dictionary 对象


Collection.Load 方法

Load 方法

从指定的数据源装载对象内容

语法

obj.Load(varSrc[, mode])

参数

obj
一个实例化的对象

varSrc
指定的数据源，可以为文件名、Stream 对象和二进制数据块

mode
指定装载方式，缺省为 7

功能

参数 varSrc 用于指定装载的数据源。如果给定一个字符串，则将以此字符串为文件名装载，如果给定一个 Stream 对象，则直接从流对象中装载数据到对象中，如果给定一个二进制数据块，则直接从数据块中装载。

装载时可以通过设定装载方式得到不同的安全级别，装载方式 mode 可以由以下一个或者多个数值相加得到：

1：允许装载对象，当装载的内容中包含其他对象时，可以决定是否继续装载；
2：允许装载外部对象，当装载的内容中包含非 NetBox 内部对象的其他对象时，可以决定是否继续装载；
4：允许装载的对象重复引用，当装载内容中包含的其他对象出现多个实例时，可以决定是否继续装载；

注释

使用 Load 可以快速方便的一次从给定的存储设备装载到对象中，与 Save 方法配合可以灵活的在内存与永久存储设备和网络设备之间交换数据。

当需要将转储数据通过开放环境，比如通过网络，或者通过软盘传递时，如果允许转储重复引用的对象将可能对系统产生内存泄露攻击，所以强烈建议在此类情况下转储和装载时将 mode 设定为禁止重复装载，或者如果禁止外部对象。

示例

下面给出的三种装载的方法，其所做的工作完全相同：

obj.Load "c:\save.dic"

其中 obj 为一个实例化的对象。

Set file = CreateObject("NetBox.File")
file.Open "c:\save.dic"
obj.Load file

这段代码打开一个文件，并且把文件对象作为流对象传递给 Load 用于装载数据。

Set file = CreateObject("NetBox.File")
file.Open "c:\save.dic"
obj.Load file.Read

上面的代码读取文件内容，然后传递给对象，从内存中直接装载数据。

应用于

Dictionary 对象 | List 对象 | Queue 对象 | Struct 对象 | Recordset 对象


Dictionary.Remove 方法

Remove 方法

从一个 Dictionary 对象中删除一个关键字项目对

语法

dict.Remove(key)

参数

dict
一个实例化的 Dictionary 对象

key
需要在 Dictionary 对象中删除的 key 值

注释

由于 Dictionary 本身忽略关键字大小写的特性，对于关键字的删除也是忽略大小写的。如果所指定的关键字不存在，将不做任何操作。

示例

下面的例子中插入一些关键字项目对，然后删除其中的一项。

Set dict = CreateObject("NetBox.Dictionary")
dict.Add "a", "Athens"
dict.Add "b", "Belgrade"
dict.Add "c", "Cairo"
......
dict.Remove "b"

应用于

Dictionary 对象


Collection.RemoveAll 方法

RemoveAll 方法

RemoveAll 方法从一个对象中删除所有的项目

语法

obj.RemoveAll

参数

obj
一个实例化的对象

应用于

Dictionary 对象 | List 对象 | Queue 对象


Collection.Save 方法

Save 方法

转储对象中的内容到指定的目标

语法

obj.Save(varDest[, mode])

参数

obj
一个实例化的对象

varDest
指定转储的目标，可以为文件名或者 Stream 对象

mode
指定转储方式，缺省为 7

功能

参数 varDest 用于指定转储的目标。如果给定一个字符串，则将以此字符串为文件名转储，如果给定一个 Stream 对象，则直接将内容转储至流对象中。如果需要直接将内容转储到内存中，可以直接读取无参数的 Item 属性。

转储时可以通过设定转储方式得到不同的安全级别，转储方式 mode 可以由以下一个或者多个数值相加得到：

1：允许转储对象，当转储的内容中包含其他对象时，可以决定是否继续转储；
2：允许转储外部对象，当转储的内容中包含非 NetBox 内部对象的其他对象时，可以决定是否继续转储；
4：允许转储的对象重复引用，当转储内容中包含的其他对象出现多个实例时，可以决定是否继续转储；

注释

使用 Save 可以快速方便的一次将对象中的内容全部转储到给定的存储设备上，与 Load 方法配合可以灵活的在内存与永久存储设备和网络设备之间交换数据。

当对象中存储了其他对象时，此方法将试图将其存储，如果不能存储，则返回错误。当对象中存储了同一对象的多个引用时，此方法将只转储一个拷贝。

当需要将转储数据通过开放环境，比如通过网络，或者通过软盘传递时，如果允许转储重复引用的对象将可能对系统产生内存泄露攻击，所以强烈建议在此类情况下转储和装载时将 mode 设定为禁止重复装载，或者如果禁止外部对象。

示例

下面给出的三种转储的方法，其所做的工作完全相同：

obj.Save "c:\save.dic"

其中 obj 为一个实例化的对象。

Set file = CreateObject("NetBox.File")
file.Create "c:\save.dic"
obj.Save file

这段代码创建一个文件，并且把文件对象作为流对象传递给 Save 用于转储数据

bin = obj
Set file = CreateObject("NetBox.File")
file.Create "c:\save.dic"
file.Write bin

上面的代码直接使用对象的缺省方法取得转储至内存的数据块，然后创建文件自行存储数据。

应用于

Dictionary 对象 | List 对象 | Queue 对象 | Struct 对象 | Recordset 对象


Collection.Sort 方法

Sort 方法

排序对象中的数据，可以指定升序和降序

语法

obj.Sort[ varMode]

参数

obj
一个实例化的集合对象

varMode
给定排序方式，true 为升序，缺省为 true

应用于

Dictionary 对象 | List 对象


Dictionary.Split 方法

Split 方法

分析给定的字符串，将分解出的子字符串填充到对象中

语法

obj.Split(str[, varKeyDelimiter, varDelimiter])

参数

obj
一个实例化的对象

str
给定的需要分析的字符串

varKeyDelimiter
可选项。指定在字符串中用于分隔键和项目的字符。如果省略，将使用字符 "="

varDelimiter
可选项。指定在字符串中用于分隔子字符串的字符。如果省略，将使用字符 ","

应用于

Dictionary 对象


Identity 对象

数据标识生成对象，用于统一管理、生成唯一的数据标识

语法

Set ids = CreateObject("NetBox.Identity")

属性

Item | 取得指定 id 的当前数值，并累加
Items | 以数组方式返回对象中的全部项目
Keys | 以数组方式返回对象中的全部键值

方法

Add | 向对象中添加一个关键字项目对
Exists | 如果对象中存在所指定的关键字则返回 true，否则返回 false
GenGUIDString | 创建一个全局唯一标识 GUID，返回一个格式化过的标识字符串

注释

使用 Identity 对象可以快速创建一个或者多个唯一的数据标识，用于对其他数据进行唯一标识，Identity 对象可以支持不同的数据类型进行初始化，并且在整个过程中保持此类型。

示例

下面的例子创建一个 Identity 对象，初始化一个 id，然后多次生成标识。

Set dict = CreateObject("NetBox.Identity")

dict.Add "aaa", CDbl(1)
Shell.Console.WriteLine dict("aaa")
Shell.Console.WriteLine dict("aaa", 20)
Shell.Console.WriteLine dict("aaa")
Shell.Console.WriteLine typename(dict("aaa"))

这段程序的执行结果如下：

1
2
22
Double


Identity.Item 属性

Item 属性

取得指定 id 的当前数值，并累加

语法

ids.Item(key[, varCount])

参数

ids
一个实例化的对象

key
操作的键值

varCount
累加的数值，缺省为 1

应用于

Identity 对象


Identity.GenGUIDString 方法

GenGUIDString 方法

创建一个全局唯一标识 GUID，返回一个格式化过的标识字符串

语法

ids.GenGUIDString

参数

ids
一个实例化的对象

应用于

Identity 对象


List 对象

可随机访问的动态数组对象，可以任意增大和缩小数组尺寸

语法

Set list = CreateObject("NetBox.List")

属性

Count | 返回一个对象中的项目数，只读属性
Item | 在一个 List 对象中设置或者返回所指定下标的 item
Items | 以数组方式返回对象中的全部项目

方法

Add | 向 List 对象中添加一个数据
Insert | 在指定的位置插入一个项目
Join | 返回一个字符串，此字符串由包含在对象中的所有子字符串连接创建
Load | 从指定的数据源装载对象内容
Remove | 删除对象中指定下标的数据
RemoveAll | RemoveAll 方法从一个对象中删除所有的项目
Save | 转储对象中的内容到指定的目标
Sort | 排序对象中的数据，可以指定升序和降序
Split | 分析给定的字符串，将分解出的子字符串填充到对象中

示例

下面的例子创建一个 List 对象，添加数据，并以两种不同的方式遍历全部数据：

Set list = CreateObject("NetBox.List")

list.Add 100
list.Add 200
list.Add 600
list.Add "dddd"

list.Remove 0

For Each n in list
    Shell.Console.WriteLine n
Next

For i = 0 To list.Count - 1
    Shell.Console.WriteLine list(i)
Next


List.Item 属性

Item 属性

在一个 List 对象中设置或者返回所指定下标的 item

语法

list.Item(index)[ = varData]

参数

list
一个实例化的 List 对象

index
给定要添加的下标

varData
给定要添加的数据

注释

如果忽略下标取得 item 属性，则将直接取得 List 的转储数据。详细信息参见 Save 方法。

该属性为缺省属性，所以可以直接对对象进行缺省操作。list(i) 与 list.Item(i) 的作用是完全等同的。

应用于

List 对象 | Struct 对象


List.Add 方法

Add 方法

向 List 对象中添加一个数据

语法

list.Add varData

参数

list
一个实例化的 List 对象

varData
给定要添加的数据

应用于

List 对象


List.Insert 方法

Insert 方法

在指定的位置插入一个项目

语法

list.Insert pos, varData

参数

list
一个实例化的 List 对象

pos
给定的插入位置

varData
给定要添加的数据

应用于

List 对象


Collection.Join 方法

Join 方法

返回一个字符串，此字符串由包含在对象中的所有子字符串连接创建

语法

str = obj.Join([varDelimiter])

参数

str
返回组建的字符串

obj
一个实例化的对象

varDelimiter
可选项。在返回字符串中用于分隔子字符串的字符。如果省略，将使用字符 ","

注释

此方法将试图转换对象所有非字符串变量到字符串后再进行组建，如果不能成功转换，则返回错误。

应用于

List 对象 | Queue 对象


List.Remove 方法

Remove 方法

删除对象中指定下标的数据

语法

list.Remove index

参数

list
一个实例化的 List 对象

index
给定要删除的下标

应用于

List 对象


Collection.Split 方法

Split 方法

分析给定的字符串，将分解出的子字符串填充到对象中

语法

obj.Split(str[, varDelimiter])

参数

obj
一个实例化的对象

str
给定的需要分析的字符串

varDelimiter
可选项。指定在字符串中用于分隔子字符串的字符。如果省略，将使用字符 ","

应用于

List 对象 | Queue 对象


Queue 对象

可双向存取的队列，通过不同的存取方式，可以构造出队列和堆栈等数据模型

语法

Set dict = CreateObject("NetBox.Queue")

属性

Count | 返回一个对象中的项目数，只读属性
Items | 以数组方式返回对象中的全部项目

方法

AddHead | 向队列的头部添加一个项目
AddTail | 向队列的尾部添加一个项目
GetHead | 查询队列头部的项目
GetTail | 查询队列尾部的项目
Join | 返回一个字符串，此字符串由包含在对象中的所有子字符串连接创建
Load | 从指定的数据源装载对象内容
RemoveAll | RemoveAll 方法从一个对象中删除所有的项目
RemoveHead | 取出并删除队列头部的项目
RemoveTail | 取出并删除队列尾部的项目
Save | 转储对象中的内容到指定的目标
Split | 分析给定的字符串，将分解出的子字符串填充到对象中

注释

Queue 对象用于根据应用的需要构造出不同的数据模型，比如顺序队列、堆栈等等。

示例

下面的例子创建一个队列，添加一组数据，然后从后向前输出全部数据：

Set queue = CreateObject("NetBox.Queue")
queue.AddHead 100
queue.AddHead 200
queue.AddHead 300

Do While queue.Count
    Shell.Console.WriteLine queue.RemoveHead
Loop


Queue.AddHead 方法

AddHead 方法

向队列的头部添加一个项目

语法

queue.AddHead var

参数

queue
一个实例化的队列对象

var
给定的要添加的项目

应用于

Queue 对象


Queue.AddTail 方法

AddTail 方法

向队列的尾部添加一个项目

语法

queue.AddTail var

参数

queue
一个实例化的队列对象

var
给定的要添加的项目

应用于

Queue 对象


Queue.GetHead 方法

GetHead 方法

查询队列头部的项目

语法

var = queue.GetHead

参数

queue
一个实例化的队列对象

var
返回取得的项目

应用于

Queue 对象


Queue.GetTail 方法

GetTail 方法

查询队列尾部的项目

语法

var = queue.GetTail

参数

queue
一个实例化的队列对象

var
返回取得的项目

应用于

Queue 对象


Queue.RemoveHead 方法

RemoveHead 方法

取出并删除队列头部的项目

语法

var = queue.RemoveHead

参数

queue
一个实例化的队列对象

var
返回取得的项目

应用于

Queue 对象


Queue.RemoveTail 方法

RemoveTail 方法

取出并删除队列尾部的项目

语法

var = queue.RemoveTail

参数

queue
一个实例化的队列对象

var
返回取得的项目

应用于

Queue 对象


Struct 对象

自定义简单对象，可以自行注册一个包含指定属性的对象以方便使用

语法

NetBox.RegisterClass strName, strMembers
Set obj = CreateObject(strName)

属性

Item 在一个 List 对象中设置或者返回所指定下标的 item

方法

Load | 从指定的数据源装载对象内容
Save | 转储对象中的内容到指定的目标

参数

strName
字符串，对象的 progid

strMembers
简单对象的成员变量名称列表，名称之间以“,”分割

注释

如果需要注册一个简单变量，可以使用下面的程序：

NetBox.RegisterClass "mySimpleClass", "id,name,age,sex"

Set o = CreateObject("mySimpleClass")
o.id=100
o.Name="张三"
o.age=102
o.sex=true

程序中首先注册一个简单对象 "mySimpleClass"，其成员属性为：id,name,age,sex 共四个，在创建对象后，便可以直接访问这些属性。

简单对象只需要注册一次，便可以在本应用中反复创建。不需要多次注册。


流对象参考

对象 | 说 明
Comm | 串口通讯对象，可以对串口进行修改配置和读写操作
File | 文件访问对象，可对文件进行文本和二进制操作，也可以使用 url 直接访问互联网资源
PipeLine | 双向管道对象，可进行双向数据传输
Stream | 标准 Stream 代理对象


Comm 对象

串口通讯对象，可以对串口进行修改配置和读写操作

语法

Set Comm = CreateObject("NetBox.Comm")

属性

BaudRate | 查询和设定通讯对象以位/每秒表示的传输速率
CodePage | 查询或者设定流对象的代码页
DataBits | 查询和设定通讯对象的数据位数。d 的有效值范围是 5 到 8，默认值是 7。不是所有的计算机都支持值 5 和 6
Handle | 返回流对象所对应的操作系统句柄，只读属性
Handshaking | 查询和设定当前通讯对象的握手方式
Parity | 查询和设定通讯对象如何使用奇偶校验位来检查传输错误
ReadTimeout | 查询和设定串口对象读操作的超时时间
StopBits | 查询和指定字符尾部的停止位的数目
Type | 查询当前流对象的类型
WriteTimeout | 查询和设定串口对象写操作的超时时间

方法

Close | 关闭当前的流对象
Config | 设定当前对象的通讯参数
CopyTo | 复制指定数量的数据到另外一个流中
CopyFrom | 从另外一个流中复制指定数量的数据到当前流对象中
Open | 打开指定的串口，并设定参数
Read | 从当前流对象中读取指定大小的二进制数据块
ReadLine | 从流对象中读取行字符串
ReadRawLine | 从流中读取一个行字符串，然后直接以二进制方式返回
ReadText | 从流对象中读取给定数量的字符，以字符串方式返回
ReadVariant | 从流对象中装载一个 VB 变量
Write | 向当前流对象中写入一个二进制数据块
WriteBlankLines | 输出指定数量的空行到流对象中
WriteLine | 向当前流对象中写入一个字符串，然后写入换行字符
WriteText | 向当前流对象写入一个字符串
WriteVariant | 向当前流对象转储一个 VB 变量

注释

Comm 对象用于操作系统的串行通讯接口，为串口提供了配置方法和完整的流对象操作方法，极大方便对底层串口的操作。下面的例子创建了一个 Comm 对象，打开 COM1，并显示配置界面由用户设定参数：

Set comm = CreateObject("NetBox.Comm")

comm.Open 1
comm.Config


Comm.BaudRate 属性

BaudRate 属性

查询和设定通讯对象以位/每秒表示的传输速率

语法

comm.BaudRate[= baud]

参数

comm
一个实例化的通讯对象

baud
指定要设定的通讯速率

注释

通过设定此属性，可以修改通讯对象的传输速率，对象的初始值为 Open 方法指定，如果未指定，则为系统缺省配置。

110 波特
150 波特
300 波特
600 波特
1200 波特
2400 波特
4800 波特
9600 波特
19,200 波特

应用于

Comm 对象


Comm.DataBits 属性

DataBits 属性

查询和设定通讯对象的数据位数。d 的有效值范围是 5 到 8，默认值是 7。不是所有的计算机都支持值 5 和 6

语法

comm.DataBits[= bits]

参数

comm
一个实例化的通讯对象

bits
指定要设定的数据位数

应用于

Comm 对象


Stream.Handle 属性

Handle 属性

返回流对象所对应的操作系统句柄，只读属性

语法

stream.Handle

参数

stream
一个实例化的流对象

注释

使用此属性，可以从一个流对象中查询与其对应的操作系统句柄，可以是文件句柄、串口操作句柄、网络通讯句柄等。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Comm.Handshaking 属性

Handshaking 属性

查询和设定当前通讯对象的握手方式

语法

comm.Handshaking[= hs]

参数

comm
一个实例化的通讯对象

hs
指定要设定的握手方式

注释

此方法支持下面的数值：

0: 无握手；
1: Xon/Xoff 握手；
2: 硬件握手；

应用于

Comm 对象


Comm.Parity 属性

Parity 属性

查询和设定通讯对象如何使用奇偶校验位来检查传输错误

语法

comm.Parity[= parity]

参数

comm
一个实例化的通讯对象

parity
指定奇偶校验位的设定

注释

通讯对象可以设定以下的校验方式：

0： 无奇偶校验
1：偶校验
2：奇校验
3：标记
4：空格

默认值是奇校验。不是所有的计算机都支持值标记和空格。

应用于

Comm 对象


Comm.ReadTimeout 属性

ReadTimeout 属性

查询和设定串口对象读操作的超时时间

语法

comm.ReadTimeout[= tmout]

参数

comm
一个实例化的通讯对象

tmout
指定要设定的超时时间

应用于

Comm 对象


Comm.StopBits 属性

StopBits 属性

查询和指定字符尾部的停止位的数目

语法

comm.StopBits[= stop]

参数

comm
一个实例化的通讯对象

stop
指定要设定的停止位的数目

注释

此方法支持下面的数值：

0: 1 位；
1: 1.5 位；
2: 2 位；

并非所有的计算机都支持 1.5 这个值。

应用于

Comm 对象


Stream.Type 属性

Type 属性

查询当前流对象的类型

语法

stream.Type

参数

stream
一个实例化的流对象

注释

通过此方法可以查询流对象的类型，通常是下面的内容：

1: 文件存储性质，例如 File 对象。
2: 通讯性质，例如 Comm 对象。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Comm.WriteTimeout 属性

WriteTimeout 属性

查询和设定串口对象写操作的超时时间

语法

comm.WriteTimeout[= tmout]

参数

comm
一个实例化的通讯对象

tmout
指定要设定的超时时间

应用于

Comm 对象


Stream.Close 方法

Close 方法

关闭当前的流对象

语法

stream.Close

参数

stream
一个实例化的流对象

注释

此方法用于关闭当前的流对象。如果当前流对象中附着了一个外部的流，则将从中脱离；如果当前的流对象是一个文件或者通讯对象，则此操作将关闭文件和通讯接口。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Comm.Config 方法

Config 方法

设定当前对象的通讯参数

语法

comm.Config[ varMode]

参数

comm
一个实例化的通讯对象

varMode
字符串，设定打开串口时的初始化参数，缺省则将显示一个对话框由用户进行配置

注释

varMode 使用下面的格式描述通讯对象的参数：

[baud=b] [parity=p] [data=d] [stop=s] [to=on|off] [xon=on|off] [odsr=on|off] [octs=on|off] [dtr=on|off|hs] [rts=on|off|hs|tg] [idsr=on|off]

例如，下面的字符串设定波特率为 9600，无校验位，数据位为 8，停止位为 1：

baud=9600 parity=N data=8 stop=1

也可以使用简单格式来描述上面的参数，但是只能设定波特率，校验位，数据位和停止位：

9600,n,8,1

格式中各个参数的描述如下：

baud=b

指定以每秒位表示的传输速率，也可以是缩写，以下列表显示 b 的有效缩写对应的相关速度：

11：110 波特
15：150 波特
30：300 波特
60：600 波特
12：1200 波特
24：2400 波特
48：4800 波特
96：9600 波特
19：19,200 波特

parity=p

指定系统如何使用奇偶校验位来检查传输错误。p 值可以是下列之一：n（无奇偶校验）、e（偶校验）、o（奇校验）、m（标记）或 s（空格）。默认值是 e。不是所有的计算机都支持值 m 和 s。

data=d

指定字符中的数据位数。d 的有效值范围是 5 到 8。默认值是 7。不是所有的计算机都支持值 5 和 6。

stop=s

指定定义字符尾部的停止位的数目：1、1.5 或 2。如果波特率为 110, 则默认值为 2：否则，默认值为 1。并非所有的计算机都支持 1.5 这个值。

to=on|off

指定是否打开或关闭无限超时处理。默认设置为关闭。

xon=on|off

指定是否打开控制数据流的 xon 或 xoff 协议。

odsr=on|off

指定使用“数据设置就绪 (DSR)”电路的输出握手是否打开或关闭。

octs=on|off

指定使用“清除发送 (CTS)”电路的输出握手是否打开或关闭。

dtr=on|off|hs

指定是否打开或关闭“数据终端就绪 (DTR)”电路，或将其设置为握手。

rts=on|off|hs|tg

指定是否将“请求发送 (RTS)”电路设置为打开、关闭、握手或切换。

idsr=on|off

指定是否打开 DSR 电路灵敏度。

应用于

Comm 对象


Stream.CopyTo 方法

CopyTo 方法

复制指定数量的数据到另外一个流中

语法

stream.CopyTo stm[, varSize]

参数

stream
一个实例化的流对象

stm
另外一个流，数据将复制到此流中

varSize
需要复制的字节数，如果不指定则复制到流结束

注释

在使用此方法时，stm 参数可以给定一个流对象，也可以给定一个文件名。当给定的是文件名时，此方法将试图创建文件，向其中复制数据。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.CopyFrom 方法

CopyFrom 方法

从另外一个流中复制指定数量的数据到当前流对象中

语法

stream.CopyFrom stm[, varSize]

参数

stream
一个实例化的流对象

stm
另外一个流，数据从此流中复制

varSize
需要复制的字节数，如果不指定则复制到流结束

注释

在使用此方法时，stm 参数可以给定一个流对象，也可以给定一个文件名、Url 地址、一个二进制数据块。当给定的是文件名或者 url 地址时，此方法将试图打开给定的资源，从其中复制数据，当给定数据为二进制数据时，此方法将以此数据块为内存流进行处理。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Comm.Open 方法

Open 方法

打开指定的串口，并设定参数

语法

comm.Open port[, varMode]

参数

comm
一个实例化的通讯对象

port
整型数，给定要打开的串口通讯号，例如打开 COM1 则为 1

varMode
字符串，设定打开串口时的初始化参数，格式参见 Config 方法，缺省则使用系统设置

应用于

Comm 对象


Stream.Read 方法

Read 方法

从当前流对象中读取指定大小的二进制数据块

语法

varData = stream.Read[(varSize)]

参数

varData
返回读取的数据，为二进制数据块

stream
一个实例化的流对象

varSize
指定要读取的数据大小，如果不指定则读取流中全部数据

注释

对于文件，如果剩余的数据不足 varSize，则返回剩余所有的数据作为结果。对于通讯接口，如果当前可以读取的数据不足 varSize，则返回可读取的数据。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.ReadVariant 方法

ReadVariant 方法

从流对象中装载一个 VB 变量

语法

var = stream.ReadVariant[(mode)]

参数

var
返回读出的变量

stream
一个实例化的流对象

mode
指定装载方式，缺省为 7

功能

装载时可以通过设定装载方式得到不同的安全级别，装载方式 mode 可以由以下一个或者多个数值相加得到：

1：允许装载对象，当装载的内容中包含其他对象时，可以决定是否继续装载；
2：允许装载外部对象，当装载的内容中包含非 NetBox 内部对象的其他对象时，可以决定是否继续装载；
4：允许装载的对象重复引用，当装载内容中包含的其他对象出现多个实例时，可以决定是否继续装载；

注释

使用 ReadVariant 可以快速方便的一次从给定的存储设备装载到变量中，与 WriteVariant 方法配合可以灵活的在内存与永久存储设备和网络设备之间交换数据。

当需要将转储数据通过开放环境，比如通过网络，或者通过软盘传递时，如果允许转储重复引用的对象将可能对系统产生内存泄露攻击，所以强烈建议在此类情况下转储和装载时将 mode 设定为禁止重复装载，或者如果禁止外部对象。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.Write 方法

Write 方法

向当前流对象中写入一个二进制数据块

语法

stream.Write varData

参数

stream
一个实例化的流对象

varData
给定的要写入的二进制数据块

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


Stream.WriteVariant 方法

WriteVariant 方法

向当前流对象转储一个 VB 变量

语法

stream.WriteVariant var[, mode]

参数

stream
一个实例化的流对象

var
给定的需要转储的变量

mode
指定转储方式，缺省为 7

功能

转储时可以通过设定转储方式得到不同的安全级别，转储方式 mode 可以由以下一个或者多个数值相加得到：

1：允许转储对象，当转储的内容中包含其他对象时，可以决定是否继续转储；
2：允许转储外部对象，当转储的内容中包含非 NetBox 内部对象的其他对象时，可以决定是否继续转储；
4：允许转储的对象重复引用，当转储内容中包含的其他对象出现多个实例时，可以决定是否继续转储；

注释

使用 WriteVariant 可以快速方便的一次将变量中的内容全部转储到流对象中，与 ReadVariant 方法配合可以灵活的在内存与永久存储设备和网络设备之间交换数据。

当变量中存储了对象时，此方法将试图将其存储，如果不能存储，则返回错误。当变量中存储了同一对象的多个引用时，此方法将只转储一个拷贝。

当需要将转储数据通过开放环境，比如通过网络，或者通过软盘传递时，如果允许转储重复引用的对象将可能对系统产生内存泄露攻击，所以强烈建议在此类情况下转储和装载时将 mode 设定为禁止重复装载，或者如果禁止外部对象。

应用于

Comm 对象 | File 对象 | PipeLine 对象 | Stream 对象


File 对象

文件访问对象，可对文件进行文本和二进制操作，也可以使用 url 直接访问互联网资源

语法

Set file = CreateObject("NetBox.File")

属性

CodePage | 查询或者设定流对象的代码页
EOS | 查询当前流对象是否已经结束，只读属性
Handle | 返回流对象所对应的操作系统句柄，只读属性
lastModify | 查询流对象所对应的文件的最后修改时间，只读属性
Position | 查询或者设定当前流对象的访问指针
Size | 查询或者设定当前流对象的大小
Type | 查询当前流对象的类型

方法

Close | 关闭当前的流对象
CopyTo | 复制指定数量的数据到另外一个流中
CopyFrom | 从另外一个流中复制指定数量的数据到当前流对象中
Create | 创建一个新文件，如果指定的文件已经存在，则可以根据参数指定是否覆盖
Open | 打开一个已经存在的文件，或者一个互联网资源
Read | 从当前流对象中读取指定大小的二进制数据块
ReadLine | 从流对象中读取行字符串
ReadRawLine | 从流中读取一个行字符串，然后直接以二进制方式返回
ReadText | 从流对象中读取给定数量的字符，以字符串方式返回
ReadVariant | 从流对象中装载一个 VB 变量
setEOS | 设定当前位置为结尾
Write | 向当前流对象中写入一个二进制数据块
WriteBlankLines | 输出指定数量的空行到流对象中
WriteLine | 向当前流对象中写入一个字符串，然后写入换行字符
WriteText | 向当前流对象写入一个字符串
WriteVariant | 向当前流对象转储一个 VB 变量

注释

使用 File 可以方便的以文本或者二进制方式操作系统文件。也可以直接访问各种 url 资源，比如：http:、ftp:、res:、ms-help:、netbox: 等，当访问 url 资源时不能使用写权限。

示例

下面的例子演示使用 File 进行二进制文件的复制：

Set file1 = CreateObject("NetBox.File")
Set file2 = CreateObject("NetBox.File")
file1.Open "TestFile"
file2.Create "TestFile.NEW"
FileData = file1.Read
file2.Write FileData
file1.Close
file2.Close


Stream.EOS 属性

EOS 属性

查询当前流对象是否已经结束，只读属性

语法

stream.EOS

参数

stream
一个实例化的流对象

注释

对于不同的流对象，EOS 的含义可能不同，对于文件 File 对象，其含义为文件结尾；对于串口 Comm 对象，不支持此属性；而其他的对象，则表示流对象已经中止。

示例

下面的例子从一个流中读取字符，并转写到另外一个流中，直到流结束为止：

Do While Not stm1.EOS
    stm2.WriteText stm1.ReadLine & vbCrLf
Loop

应用于

File 对象 | Stream 对象


Stream.lastModify 属性

lastModify 属性

查询流对象所对应的文件的最后修改时间，只读属性

语法

stream.lastModify

参数

stream
一个实例化的流对象

应用于

File 对象 | Stream 对象


Stream.Position 属性

Position 属性

查询或者设定当前流对象的访问指针

语法

stream.Position[ = pos]

参数

stream
一个实例化的流对象

pos
要设定的指针位置

注释

此属性仅对于文件性质的流对象有效。

应用于

File 对象 | Stream 对象


Stream.Size 属性

Size 属性

查询或者设定当前流对象的大小

语法

stream.Size[ = size]

参数

stream
一个实例化的流对象

size
要设定的流对象的大小

注释

可以使用此属性查询当前流对象以字节为单位的大小。也可以直接修改此属性以达到修改流对象大小的目的。

修改流对象的大小将不会影响到 Position 属性的值。

应用于

File 对象 | Stream 对象


File.Create 方法

Create 方法

创建一个新文件，如果指定的文件已经存在，则可以根据参数指定是否覆盖

语法

file.Create [varName, varOverwrite]

参数

file
一个实例化的 File 对象

varName
给定的需要创建的文件名

varOverwrite
指定是否覆盖已经存在的文件，缺省为 True

注释

与 Open 方法不同，Create 方法只支持文件访问一种形式。所以不要试图用虚拟路径，或者 url 方式创建文件，将返回错误。

应用于

File 对象


File.Open 方法

Open 方法

打开一个已经存在的文件，或者一个互联网资源

语法

file.Open strName[, varMode, varShare]

参数

file
一个实例化的 File 对象

strName
给定的要打开的文件名，或者 url

varMode
打开文件的模式

varShare
打开文件的共享模式

功能

在打开文件时，可以通过指定 varMode 和 varShare 来以不同的方式打开文件。其中 varMode 用于指定打开文件的操作权限和打开方式，可以是下面的内容：

1 - 只读(缺省权限)
2 - 只写
3 - 读写
8 - 添加(可以与前面的权限相加)
16 - 强制打开，如果文件不存在，则自动创建(可以与前面的权限相加)

varShare 用于指定打开文件的共享权限，可以是下面的值相加的结果：

1 - 允许其他用户读
2 - 允许其他用户写
4 - 允许其他用户删除此文件

缺省时 varShare 为 3，即允许其他用户读写。

注释

使用 Open 方法可以以三种方式打开文件。详细内容请参考 NetBox 的路径系统。

应用于

File 对象


Stream.setEOS 方法

setEOS 方法

设定当前位置为结尾

语法

stream.setEOS

参数

stream
一个实例化的流对象

注释

通过调用此方法，可以将流对象的结束设定到当前 Position 所指向的位置，可以立即改变流对象的大小。

应用于

File 对象 | Stream 对象


PipeLine 对象

双向管道对象，可进行双向数据传输

语法

Set pipe = CreateObject("NetBox.PipeLine")

属性

CodePage | 查询或者设定流对象的代码页
dataAvailable | 查询管道中可读数据的数量，以字节为单位
Handle | 返回流对象所对应的操作系统句柄，只读属性
Type | 查询当前流对象的类型

方法

Close | 关闭当前的流对象
CopyTo | 复制指定数量的数据到另外一个流中
CopyFrom | 从另外一个流中复制指定数量的数据到当前流对象中
Open | 创建一个管道，并且返回管道的对方对象
Read | 从当前流对象中读取指定大小的二进制数据块
ReadLine | 从流对象中读取行字符串
ReadRawLine | 从流中读取一个行字符串，然后直接以二进制方式返回
ReadText | 从流对象中读取给定数量的字符，以字符串方式返回
ReadVariant | 从流对象中装载一个 VB 变量
Write | 向当前流对象中写入一个二进制数据块
WriteBlankLines | 输出指定数量的空行到流对象中
WriteLine | 向当前流对象中写入一个字符串，然后写入换行字符
WriteText | 向当前流对象写入一个字符串
WriteVariant | 向当前流对象转储一个 VB 变量

注释

使用双向管道可以在多个环境中传输与缓存数据，通过使用管道，可以在不同的线程之间进行会话和数据的传送。

使用管道对象时，通讯的双方各拥有一个管道对象，一端写入的数据将会在另一端读出。当管道内无数据，而进行读操作时，管道将等待，另一端写入足够数据后返回。当管道内缓存满时继续写入，管道也将等待，另一端读出足够数据后返回。如果另一端已经被释放，则读操作读出全部数据，或者写操作写满缓存后，管道将报告错误，而不是进入等待，以防止进入不可恢复的状态。

示例

下面的例子创建一个管道，并建立管道实体，最后将对方对象存入 NetBox 对象，以便其他线程使用。

Set pipe = CreateObject("NetBox.PipeLine")
Set pipe1 = pipe.Open
Set NetBox("p") = pipe1


PipeLine.dataAvailable 属性

dataAvailable 属性

查询管道中可读数据的数量，以字节为单位

语法

pipe.dataAvailable

参数

pipe
一个实例化的管道对象

应用于

PipeLine 对象


PipeLine.Open 方法

Open 方法

创建一个管道，并且返回管道的对方对象

语法

Set pipe1 = pipe.Open [nSize]

参数

pipe1
返回管道的对方流对象

pipe
一个实例化的管道对象

nSize
管道缓存尺寸，缺省为 1M

注释

使用管道前，必须使用 Open 方法创建出管道实体，并且将返回的对方管道对象传送给相关的线程或者对象，以便进行管道通讯。

示例

下面的例子创建一个管道，并建立管道实体，最后将对方对象存入 NetBox 对象，以便其他线程使用。

Set pipe = CreateObject("NetBox.PipeLine")
Set pipe1 = pipe.Open
Set NetBox("p") = pipe1

应用于

PipeLine 对象


Stream 对象

标准 Stream 代理对象

语法

Set stream = CreateObject("NetBox.Stream")

属性

CodePage | 查询或者设定流对象的代码页
EOS | 查询当前流对象是否已经结束，只读属性
Handle | 返回流对象所对应的操作系统句柄，只读属性
lastModify | 查询流对象所对应的文件的最后修改时间，只读属性
Position | 查询或者设定当前流对象的访问指针
Size | 查询或者设定当前流对象的大小
Type | 查询当前流对象的类型

方法

Attach | 将一个已有的流对象附着在当前的流对象中
Close | 关闭当前的流对象
CopyTo | 复制指定数量的数据到另外一个流中
CopyFrom | 从另外一个流中复制指定数量的数据到当前流对象中
Open | 打开一个临时的流对象，并设定内存部分尺寸
Read | 从当前流对象中读取指定大小的二进制数据块
ReadLine | 从流对象中读取行字符串
ReadRawLine | 从流中读取一个行字符串，然后直接以二进制方式返回
ReadText | 从流对象中读取给定数量的字符，以字符串方式返回
ReadVariant | 从流对象中装载一个 VB 变量
setEOS | 设定当前位置为结尾
Write | 向当前流对象中写入一个二进制数据块
WriteBlankLines | 输出指定数量的空行到流对象中
WriteLine | 向当前流对象中写入一个字符串，然后写入换行字符
WriteText | 向当前流对象写入一个字符串
WriteVariant | 向当前流对象转储一个 VB 变量

注释

Stream 对象是一个基本流封装对象，用于对一个流进行较高级的访问，File 对象，Comm 对象都是建立在其基础上的。也可以直接使用 Stream 对象 Attach 到一个其他的流对象以得到 Stream 对象的丰富功能。同时 Stream 对象本身也是一个高效的临时流对象，可以通过 Open 方法打开一个内存流对象进行快速的临时操作。


Stream.Attach 方法

Attach 方法

将一个已有的流对象附着在当前的流对象中

语法

stream.Attach stm

参数

stream
一个实例化的 Stream 对象

stm
一个已有的 IStream 对象

注释

通过使用 Attach 方法，可以将一个从其他系统中获取的流对象附着在 NetBox 的流对象中，通过 NetBox 的流对象的强大访问功能来操作其他的流对象。

应用于

Stream 对象


Stream.Open 方法

Open 方法

打开一个临时的流对象，并设定内存部分尺寸

语法

stream.Open [nSize]

参数

stream
一个实例化的 Stream 对象

nSize
设定临时流对象内存部分的尺寸，以字节为单位，为 0 则全部使用内存。缺省为 1048576 字节，即 1M

注释

可以使用 Open 方法打开一个临时的流对象用于临时数据处理，并指定其内存部分最大使用字节数。当存入对象的数据超过内存部分的限定，则将自动创建一个与其对应的临时文件用于存取超出部分的数据。而当实际存入数据不足时，对象只占用相应的内存数量。

使用时可灵活调节最大内存占用值，使得大部分操作均在内存中操作，而少量的大数据量操作转为文件操作。也可以将其设定为 0，此时对象将全部使用内存来保存数据。

应用于

Stream 对象


窗口对象参考

对象 | 说 明
HtmlWindow | 用于创建一个 WEB Base 的桌面应用程序


HtmlWindow 对象

用于创建一个 WEB Base 的桌面应用程序

语法

Set htWin = CreateObject("NetBox.HtmlWindow")

对象

Browser 查询 HtmlWindow 中的 WebBrowser 对象

属性

AllowClose | 指定是否允许用户关闭本窗口，缺省为 true，允许关闭
Argument | 获取 HTML 窗口打开 URL 时传递的参数
border | 查询和设定窗口是否有边框，为 True 则有边框。缺省为 True
Caption | 查询和设定窗口是否有标题栏，为 True 则有标题栏。缺省为 True
clientHeight | 查询窗口用户区域的高度
clientWidth | 查询窗口用户区域的宽度
DropShadow | 设定和查询窗口是否显示阴影，需要 Windows XP 以上的系统支持
ContextMenu | 查询和设定窗口是否允许上下文菜单，为 True 则允许上下文菜单。缺省为 True
Height | 查询和设定当前窗口的高度
HWND | 查询窗口的系统句柄
Icon | 加载图标到对象中，支持的图标格式为：BMP (bitmap), JPEG, WMF (metafile), ICO (icon), GIF
LayeredAlpha | 设定和查询窗口半透明值，需要 Windows 2000 以上的系统支持
Left | 查询和设定当前窗口左上角 x 值
MaximizeBox | 查询和设定窗口是否有最大化按钮，为 True 则有最大化按钮。缺省为 True
Maximized | 查询和设定窗口是否有是最大化状态，为 True 则是最大化状态。缺省为 False
MinimizeBox | 查询和设定窗口是否有最小化按钮，为 True 则有最小化按钮。缺省为 True
Minimized | 查询和设定窗口是否有是最小化状态，为 True 则是最小化状态。缺省为 False
resizable | 查询和设定窗口是否可以自由改变尺寸，为 True 则可以自由改变尺寸。缺省为 True
scrollbar | 查询和设定窗口是否有滚动条，为 True 则有滚动条。缺省为 True
Title | 查询和设定当前窗口的标题文本
ToolWindow | 查询和设定窗口是否是工具窗口，为 True 则是工具窗口。缺省为 False
Top | 查询和设定当前窗口左上角 y 值
TopMost | 查询和设定窗口是否是顶层窗口，为 True 则是顶层窗口。缺省为 False
Width | 查询和设定当前窗口的宽度
WindowEdge | 查询和设定窗口是否有内陷边框，为 True 则有内陷边框。缺省为 False
Visible | 查询和设定窗口是否显示，为 True 则显示。缺省为 False

方法

center | 将当前窗口定位到屏幕中央
close | 关闭当前窗口
drag | 以指定的方式拖动窗口
EndDialog | 关闭当前窗口并设定返回值
isClosed | 检查当前对象的窗口是否已经关闭
isActived | 检查当前对象的窗口是否是当前激活的窗口
focus | 将活动焦点设定到当前窗口
moveTo | 移动当前窗口到指定位置，参数窗口左上角的目标位置
moveWindow | 同时指定窗口的位置和大小
Open | 在当前窗口打开给定 url 的 HTML 资源
OpenModalDialog | 快捷方法，创建并运行一个对话框窗口，返回结果
resizeTo | 设定当前窗口到指定的大小
SetTransparentMask | 设定窗口的透明模版和拉伸模式
showDialog | 显示激活当前窗口，并等待窗口关闭

注释

此对象用于创建基于 WEB 和 HTML 技术的桌面应用程序，通过使用 HTML，可以方便迅速的创建丰富多彩的用户操作界面。

在创建 HTML 窗口时，可以为窗口指定一个 URL，此 URL 通常可以是 http:，也可以使用 netbox: 协议直接使用 NetBox 应用程序的内部文件，以方便发布和部署。

在连接了 URL 以后，页面 HTML 内的 Javascript 或者 VBScript 可以使用 window.external 访问和操作窗口本身。

示例

下面的例子创建一个 HTML 窗口，连接一个 html 文件，显示窗口：

Set htWin= CreateObject("NetBox.HtmlWindow")
htWin.Open "netbox:/default.htm"
htWin.ShowDialog

在创建窗口和关闭窗口时，也可以在主程序和窗口程序之间传递参数和返回结果：

Set ht = CreateObject("NetBox.HtmlWindow")
ht.open "netbox:/html.htm", "Hello!!! :-P"
Shell.Console.WriteLine ht.showDialog

html.htm 的内容如下：

<script>
document.write(external.Argument);
</script>
<br>
<button onclick="external.endDialog('Hi!!!')">endDialog</button>

重要警告

此对象为创建桌面应用而设立，因此设定的安全级别较低，以方便创建各种特殊应用。所以虽然可以用于创建通用浏览器，但是在浏览未知网站时会带来严重安全隐患。


HtmlWindow.Browser 属性

Browser 属性

查询 HtmlWindow 中的 WebBrowser 对象

语法

hw.Browser

参数

hw
一个实例化的 HtmlWindow 对象

注释

通过查询 Browser 对象，可以获取 HtmlWindow 中的浏览器对象，从而直接自行控制浏览器。

应用于

HtmlWindow 对象


Window.AllowClose 属性

AllowClose 属性

指定是否允许用户关闭本窗口，缺省为 true，允许关闭

语法

win.AllowClose[ = bAllowClose]

参数

win
一个实例化的窗口对象

bAllowClose
指定是否允许用户关闭本窗口，为 True 则允许关闭。缺省为 True

注释

当窗口执行某些关键操作时，用户关闭窗口将可能导致逻辑中断或者数据丢失，为防止此类事情发生，可以将窗口设定为禁止关闭，将属性 AllowClose 设定为 false。

应用于

HtmlWindow 对象


HtmlWindow.Argument 属性

Argument 属性

获取 HTML 窗口打开 URL 时传递的参数

语法

win.Argument

参数

win
一个实例化的窗口对象

示例

下面的例子创建一个 HtmlWindow 打开一个 html 文件并传递参数，然后在 html 文件中使用 javascript 将参数输出到窗口中：

Set ht = CreateObject("NetBox.HtmlWindow")
ht.open "netbox:/html.htm", "Hello!!! :-P"
ht.showDialog

html.htm 的内容如下：

<script>
document.write(external.Argument);
</script>

应用于

HtmlWindow 对象


Window.border 属性

border 属性

查询和设定窗口是否有边框，为 True 则有边框。缺省为 True

语法

win.border[ = bBorder]

参数

win
一个实例化的窗口对象

bBorder
指定是否有边框，为 True 则有边框。缺省为 True

应用于

HtmlWindow 对象


Window.Caption 属性

Caption 属性

查询和设定窗口是否有标题栏，为 True 则有标题栏。缺省为 True

语法

win.Caption[ = bCaption]

参数

win
一个实例化的窗口对象

bCaption
指定是否有标题栏，为 True 则有标题栏。缺省为 True

应用于

HtmlWindow 对象


Window.clientHeight 属性

clientHeight 属性

查询窗口用户区域的高度

语法

win.clientHeight

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.clientWidth 属性

clientWidth 属性

查询窗口用户区域的宽度

语法

win.clientWidth

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.DropShadow 属性

DropShadow 属性

设定和查询窗口是否显示阴影，需要 Windows XP 以上的系统支持

语法

win.DropShadow[ = bShadow]

参数

win
一个实例化的窗口对象

bShadow
指定窗口是否显示阴影，为 true 则显示

应用于

HtmlWindow 对象


HtmlWindow.ContextMenu 属性

ContextMenu 属性

查询和设定窗口是否允许上下文菜单，为 True 则允许上下文菜单。缺省为 True

语法

win.ContextMenu[ = bContextMenu]

参数

win
一个实例化的窗口对象

bContextMenu
指定是否允许上下文菜单，为 True 则允许上下文菜单。缺省为 True

应用于

HtmlWindow 对象


Window.Height 属性

Height 属性

查询和设定当前窗口的高度

语法

win.Height[ = nHeight]

参数

win
一个实例化的窗口对象

nHeight
给定需要设定的高度

应用于

HtmlWindow 对象


Window.HWND 属性

HWND 属性

查询窗口的系统句柄

语法

win.HWND

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.LayeredAlpha 属性

LayeredAlpha 属性

设定和查询窗口半透明值，需要 Windows 2000 以上的系统支持

语法

win.LayeredAlpha[ = nAlpha]

参数

win
一个实例化的窗口对象

nAlpha
指定半透明窗口的透明度，范围 0~255，为 255 则完全显示

应用于

HtmlWindow 对象


Window.Left 属性

Left 属性

查询和设定当前窗口左上角 x 值

语法

win.Left[ = nLeft]

参数

win
一个实例化的窗口对象

nLeft
给定需要设定的左上角 x 值

应用于

HtmlWindow 对象


Window.MaximizeBox 属性

MaximizeBox 属性

查询和设定窗口是否有最大化按钮，为 True 则有最大化按钮。缺省为 True

语法

win.MaximizeBox[ = bMaximizeBox]

参数

win
一个实例化的窗口对象

bMaximizeBox
指定是否有最大化按钮，为 True 则有最大化按钮。缺省为 True

应用于

HtmlWindow 对象


Window.Maximized 属性

Maximized 属性

查询和设定窗口是否有是最大化状态，为 True 则是最大化状态。缺省为 False

语法

win.Maximized[ = bMaximized]

参数

win
一个实例化的窗口对象

bMaximized
指定是否是最大化状态，为 True 则是最大化状态。缺省为 False

应用于

HtmlWindow 对象


Window.MinimizeBox 属性

MinimizeBox 属性

查询和设定窗口是否有最小化按钮，为 True 则有最小化按钮。缺省为 True

语法

win.MinimizeBox[ = bMinimizeBox]

参数

win
一个实例化的窗口对象

bMinimizeBox
指定是否有最小化按钮，为 True 则有最小化按钮。缺省为 True

应用于

HtmlWindow 对象


Window.Minimized 属性

Minimized 属性

查询和设定窗口是否有是最小化状态，为 True 则是最小化状态。缺省为 False

语法

win.Minimized[ = bMinimized]

参数

win
一个实例化的窗口对象

bMinimized
指定是否是最小化状态，为 True 则是最小化状态。缺省为 False

应用于

HtmlWindow 对象


Window.resizable 属性

resizable 属性

查询和设定窗口是否可以自由改变尺寸，为 True 则可以自由改变尺寸。缺省为 True

语法

win.resizable[ = bresizable]

参数

win
一个实例化的窗口对象

bresizable
指定是否可以自由改变尺寸，为 True 则可以自由改变尺寸。缺省为 True

应用于

HtmlWindow 对象


Window.scrollbar 属性

scrollbar 属性

查询和设定窗口是否有滚动条，为 True 则有滚动条。缺省为 True

语法

win.scrollbar[ = bscrollbar]

参数

win
一个实例化的窗口对象

bscrollbar
指定是否有滚动条，为 True 则有滚动条。缺省为 True

应用于

HtmlWindow 对象


Window.Title 属性

Title 属性

查询和设定当前窗口的标题文本

语法

win.Title[ = strTitle]

参数

win
一个实例化的窗口对象

strTitle
给定需要设定的标题文本

应用于

HtmlWindow 对象


Window.ToolWindow 属性

ToolWindow 属性

查询和设定窗口是否是工具窗口，为 True 则是工具窗口。缺省为 False

语法

win.ToolWindow[ = bToolWindow]

参数

win
一个实例化的窗口对象

bToolWindow
指定是否是工具窗口，为 True 则是工具窗口。缺省为 False

应用于

HtmlWindow 对象


Window.Top 属性

Top 属性

查询和设定当前窗口左上角 y 值

语法

win.Top[ = nTop]

参数

win
一个实例化的窗口对象

nTop
给定需要设定的左上角 y 值

应用于

HtmlWindow 对象


Window.TopMost 属性

TopMost 属性

查询和设定窗口是否是顶层窗口，为 True 则是顶层窗口。缺省为 False

语法

win.TopMost[ = bTopMost]

参数

win
一个实例化的窗口对象

bTopMost
指定是否是顶层窗口，为 True 则是顶层窗口。缺省为 False

应用于

HtmlWindow 对象


Window.Width 属性

Width 属性

查询和设定当前窗口的宽度

语法

win.Width[ = nWidth]

参数

win
一个实例化的窗口对象

nWidth
给定需要设定的宽度

应用于

HtmlWindow 对象


Window.WindowEdge 属性

WindowEdge 属性

查询和设定窗口是否有内陷边框，为 True 则有内陷边框。缺省为 False

语法

win.WindowEdge[ = bWindowEdge]

参数

win
一个实例化的窗口对象

bWindowEdge
指定是否有内陷边框，为 True 则有内陷边框。缺省为 False

应用于

HtmlWindow 对象


Window.Visible 属性

Visible 属性

查询和设定窗口是否显示，为 True 则显示。缺省为 False

语法

win.Visible[ = bVisible]

参数

win
一个实例化的窗口对象

bVisible
指定是否显示，为 True 则显示。缺省为 False

应用于

HtmlWindow 对象


Window.center 方法

center 方法

将当前窗口定位到屏幕中央

语法

win.center

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.close 方法

close 方法

关闭当前窗口

语法

win.close

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.drag 方法

drag 方法

以指定的方式拖动窗口

语法

win.drag[ mode]

参数

win
一个实例化的窗口对象

mode
拖动窗口的方式，指定是移动窗口还是拉伸窗口，确省为 0

功能

此方法按照指定的方式拖动窗口直至放开鼠标，其中的 mode 参数用于指定拖动窗口的方式，其含义如下：

0 或者省略 | 移动窗口
1 | 拖动左边框
2 | 拖动右边框
3 | 拖动上边框
4 | 拖动左上角
5 | 拖动右上角
6 | 拖动下边框
7 | 拖动左下角
8 | 拖动右下角

应用于

HtmlWindow 对象


Window.EndDialog 方法

EndDialog 方法

关闭当前窗口并设定返回值

语法

win.EndDialog[ result]

参数

result
返回 endDialog 窗口时传递的结果

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.isClosed 方法

isClosed 方法

检查当前对象的窗口是否已经关闭

语法

win.isClosed

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.isActived 方法

isActived 方法

检查当前对象的窗口是否是当前激活的窗口

语法

win.isActived

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.focus 方法

focus 方法

将活动焦点设定到当前窗口

语法

win.focus

参数

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


Window.moveTo 方法

moveTo 方法

移动当前窗口到指定位置，参数窗口左上角的目标位置

语法

win.moveTo left, top

参数

win
一个实例化的窗口对象

left
给定移动目标位置的 x 坐标

top
给定移动目标位置的 y 坐标

应用于

HtmlWindow 对象


Window.moveWindow 方法

moveWindow 方法

同时指定窗口的位置和大小

语法

win.moveWindow left, top, Width, Height

参数

win
一个实例化的窗口对象

left
给定移动目标位置的 x 坐标

top
给定移动目标位置的 y 坐标

Width
给定窗口的宽度

Height
给定窗口的高度

应用于

HtmlWindow 对象


HtmlWindow.Open 方法

Open 方法

在当前窗口打开给定 url 的 HTML 资源

语法

win.Open url[,arg]

参数

win
一个实例化的窗口对象

url
给定要打开资源的 url

arg
传递给窗口对象的参数，可以在 HTML 内访问

示例

下面的例子创建一个 HtmlWindow 打开一个 html 文件并传递参数，然后在 html 文件中使用 javascript 将参数输出到窗口中：

Set ht = CreateObject("NetBox.HtmlWindow")
ht.open "netbox:/html.htm", "Hello!!! :-P"
ht.showDialog

html.htm 的内容如下：

<script>
document.write(external.Argument);
</script>

应用于

HtmlWindow 对象


HtmlWindow.OpenModalDialog 方法

OpenModalDialog 方法

快捷方法，创建并运行一个对话框窗口，返回结果

语法

win.OpenModalDialog url[,Width, Height ,arg]

参数

win
一个实例化的窗口对象

url
给定要打开资源的 url

Width
给定窗口的宽度

Height
给定窗口的高度

arg
传递给窗口对象的参数，可以在 HTML 内访问

注释

此方法是为了使用方便而设立，是一组简单方法的组合，其实现完全等同于下面的程序：

Set ht = CreateObject("NetBox.HtmlWindow")
ht.ResizeTo width, height
ht.ResizAble = false
ht.Center
ht.ScrollBar = false
ht.Open url
result = ht.showDialog

此方法并不影响对象本身，运行过程中显示的窗口为在方法内部独立创建，并自动释放。所以可以在 htmlWindow 内直接使用 external.OpenModalDialog 来显示对话框。

示例

下面的程序创建一个 htmlWindow 对象，并显示一个对话框：

Set ht = CreateObject("NetBox.HtmlWindow")
r = ht.OpenModalDialog("netbox:/test.html", 300, 200)

在 HtmlWindow 内部的脚本则可以直接使用 external 来显示对话框：

r = external.OpenModalDialog("netbox:/test1.html", 300, 200)

应用于

HtmlWindow 对象


Window.resizeTo 方法

resizeTo 方法

设定当前窗口到指定的大小

语法

win.resizeTo Width, Height

参数

win
一个实例化的窗口对象

Width
给定窗口的宽度

Height
给定窗口的高度

应用于

HtmlWindow 对象


Window.SetTransparentMask 方法

SetTransparentMask 方法

设定窗口的透明模版和拉伸模式

语法

win.SetTransparentMask strMask[, varLeft, varTop, varRight, varBottom]

参数

win
一个实例化的窗口对象

strMask
给定的透明模版文件名，必须为一个透明 gif

varLeft
左边拉伸分界点 y 坐标

varTop
上边拉伸分界点 x 坐标

varRight
右边拉伸分界点 y 坐标

varBottom
下边拉伸分界点 x 坐标

注释

通过设定透明模版，可以很容易的创建不规则形状的窗口，所需要的仅仅是提供一个透明的 gif 图片而已。当省略四个边的分界点时，NetBox 将不会根据窗口的拉伸改变透明模版，即窗口的透明模版将为固定大小。

一般来说，仅仅提供透明图片来建立一个透明窗口已经足够，如果还希望窗口能够根据用户的操作进行拉伸，则还需要提供窗口四个边的拉伸边界，以便于 NetBox 系统拉伸窗口及其透明模版。同时，窗口内还需要一个可以拉伸的 html 与之配合。

拉伸边界的含义是指当窗口被拉伸变大时，从什么位置开始分割拉伸透明模版，如下图所示：

通过设定透明模版四个边的分割坐标，NetBox 将透明模版分割为四个部分，当窗口发生拉伸时，NetBox 会自动移动四个部分的模版并复制其分界线上的内容，最终合并成为一个拉伸效果的透明模版。

通常情况下，将分界点设定在透明模版的直线部分会得到比较好的拉伸效果。

将 strMask 设定为 "" 将取消透明模式。

应用于

HtmlWindow 对象


Window.showDialog 方法

showDialog 方法

显示激活当前窗口，并等待窗口关闭

语法

result = win.showDialog

参数

result
返回 endDialog 窗口时传递的结果

win
一个实例化的窗口对象

应用于

HtmlWindow 对象


服务器对象参考

对象 | 说 明
HttpServer | 创建一个 HTTP 服务器，支持虚拟服务器、SSL、服务器脚本
HttpServerHost | 设定 HttpServer 服务器的虚拟主机信息，允许对不同的虚拟主机设定不同的运行方式
JobServer | 任务服务器，建立线程池来完成大量重复的任务
TcpServer | 创建一个 TCP 服务器，可以方便地创建高性能的多线程服务器


HttpServer 对象

创建一个 HTTP 服务器，支持虚拟服务器、SSL、服务器脚本

语法

Set httpd = CreateObject("NetBox.HttpServer")

集合

Contents 基本集合，使用标准内部对象 Dictionary 存放数据

属性

ConnectLimit | 连接限制，可以限制同一 IP 地址最多连接数量，设为零时不限制，缺省为不限制
ConnectTimeout | 设定服务器接受连接的的读写超时时间，缺省为不超时
DownloadWorkers | 查询当前服务器正在发送数据的项目数
idleWorkers | 查询当前服务器空闲的工作线程数
LocalPort | 返回服务器当前侦听端口
MaxRequestEntity | 查询和设定 Http 服务器最大允许提交的 Form 尺寸
MaxWorkers | 线程池最大线程数，缺省为 256
queueWorks | 查询当前队列中排队的任务
Running | 返回服务器对象是否正在运行
SSLSessionTimeout | 设定服务器 SSL 通道会话超时时间
Timeout | 线程池等待时间，如果线程在给定的时间内没有接收到新的任务，将自行退出，缺省为 10 分钟
totalBytes | 查询服务器已经输出数据的字节数，不包括 HTTP 响应头
totalWorks | 查询服务器已处理的请求或者任务
Workers | 查询当前工作线程总数

方法

AddHost | 为已经创建的服务器添加新的虚拟主机
AttachHost | 将已经建立的虚拟主机对象以指定的主机名添加到已经创建的服务器
Close | 关闭服务器对象
Create | 创建在指定地址端口一个 HTTP 服务器
EnableSSL | 装载服务器使用的私钥和证书
Start | 启动服务器
Stop | 停止服务器运行

注释

使用 HttpServer 对象可以创建一个高性能的多线程 Web 服务器，并可以根据需求设定虚拟主机，执行权限等执行参数。

新创建的服务器不包含主机信息，需要使用 AddHost 方法建立主机信息后才能正确运行。

示例

下面的代码创建一个 HttpServer 对象，初始化一个主机，并启动服务器，等待用户输入回车后退出。

Set Console = Shell.Console
Set httpd = CreateObject("NetBox.HttpServer")

If httpd.Create("", 80) = 0 Then
    Set host = httpd.AddHost("", "\wwwroot")
    host.AddDefault "default.htm"
    httpd.Start

    Console.ReadLine

    httpd.Stop
    httpd.Close
End If

Set httpd = Nothing


TcpServer.ConnectLimit 集合

ConnectLimit 集合

连接限制，可以限制同一 IP 地址最多连接数量，设为零时不限制，缺省为不限制

语法

tcpd.ConnectLimit[ = limit]

参数

tcpd
一个实例化的服务器对象

limit
给定的连接限制数，设定为 0 时取消限制

注释

通过限制同一 IP 地址的连接数，可以用户对服务器进行恶意访问，提高服务器的稳定性。

应用于

HttpServer 对象 | TcpServer 对象


TcpServer.ConnectTimeout 属性

ConnectTimeout 属性

设定服务器接受连接的的读写超时时间，缺省为不超时

语法

tcpd.ConnectTimeout[ = tmout]

参数

tcpd
一个实例化的服务器对象

tmout
给定的超时时间，以毫秒为单位

应用于

HttpServer 对象 | TcpServer 对象


HttpServer.DownloadWorkers 属性

DownloadWorkers 属性

查询当前服务器正在发送数据的项目数

语法

workers = svr.DownloadWorkers

参数

workers
返回服务器中的传送数据的项目数

svr
一个实例化的服务器

应用于

HttpServer 对象


JobServer.idleWorkers 属性

idleWorkers 属性

查询当前服务器空闲的工作线程数

语法

workers = svr.idleWorkers

参数

workers
返回服务器中空闲的工作线程数

svr
一个实例化的服务器

应用于

HttpServer 对象 | JobServer 对象 | TcpServer 对象


TcpServer.LocalPort 属性

LocalPort 属性

返回服务器当前侦听端口

语法

LocalPort = tcps.LocalPort

参数

LocalPort
返回 Socket 对象的本地端口

tcps
一个实例化的服务器对象

应用于

HttpServer 对象 | TcpServer 对象


HttpServer.MaxRequestEntity 属性

MaxRequestEntity 属性

查询和设定 Http 服务器最大允许提交的 Form 尺寸

语法

httpd.MaxRequestEntity[ = size]

参数

httpd
一个实例化的 HttpServer 对象

size
给定的以字节为单位的尺寸，为 0 则不限制。缺省为 0

注释

在对公开提供服务的情况下，可能会出现不是善意的 Http 请求提交，其中可以指定一个较大的请求尺寸，从而导致服务器消耗大量资源，频繁的此类操作有可能导致服务器拒绝访问。为防止此类事情发生，可以设定此方法以拒绝接受超过此尺寸的请求，从而达到预防攻击的目的。

应用于

HttpServer 对象


JobServer.MaxWorkers 属性

MaxWorkers 属性

线程池最大线程数，缺省为 256

语法

svr.MaxWorkers[ = max]

参数

svr
一个实例化的服务器对象

max
线程池的最大线程数

应用于

HttpServer 对象 | JobServer 对象 | TcpServer 对象


JobServer.queueWorks 属性

queueWorks 属性

查询当前队列中排队的任务

语法

works = srv.queueWorks

参数

works
返回服务器正在排队的任务

svr
一个实例化的服务器

应用于

HttpServer 对象 | JobServer 对象 | TcpServer 对象


TcpServer.Running 属性

Running 属性

返回服务器对象是否正在运行

语法

ret = tcpd.Running

参数

ret
返回服务器当前状态

tcpd
一个实例化的服务器对象

应用于

HttpServer 对象 | TcpServer 对象


TcpServer.SSLSessionTimeout 属性

SSLSessionTimeout 属性

设定服务器 SSL 通道会话超时时间

语法

tcpd.SSLSessionTimeout[ = tmout]

参数

tcpd
一个实例化的服务器对象

tmout
给定的超时时间，以秒为单位

应用于

HttpServer 对象 | TcpServer 对象


JobServer.Timeout 属性

Timeout 属性

线程池等待时间，如果线程在给定的时间内没有接收到新的任务，将自行退出，缺省为 10 分钟

语法

svr.Timeout[ = tmout]

参数

svr
一个实例化的服务器对象

tmout
给定的超时时间，以分钟为单位

应用于

HttpServer 对象 | JobServer 对象 | TcpServer 对象


HttpServer.totalBytes 属性

totalBytes 属性

查询服务器已经输出数据的字节数，不包括 HTTP 响应头

语法

bytes = srv.totalBytes

参数

bytes
返回输出的字节数

svr
一个实例化的服务器

应用于

HttpServer 对象


JobServer.totalWorks 属性

totalWorks 属性

查询服务器已处理的请求或者任务

语法

works = srv.totalWorks

参数

works
返回服务器已处理的任务

svr
一个实例化的服务器

应用于

HttpServer 对象 | JobServer 对象 | TcpServer 对象


JobServer.Workers 属性

Workers 属性

查询当前工作线程总数

语法

workers = svr.Workers

参数

workers
返回服务器中现有的工作线程数

svr
一个实例化的服务器

应用于

HttpServer 对象 | JobServer 对象 | TcpServer 对象


HttpServer.AddHost 方法

AddHost 方法

为已经创建的服务器添加新的虚拟主机

语法

Set host = httpd.AddHost(hostName, RootPath)

参数

host
返回新创建的主机对象，为 HttpServerHost 对象

httpd
一个实例化的 HttpServer 对象

hostName
虚拟主机的主机名

RootPath
虚拟主机的根目录，参见 NetBox 的路径系统

注释

新创建的 HttpServer 对象不包含主机信息，为了能够理解和正确处理客户的请求，必须为对象添加新的主机信息。

在添加新的虚拟主机时，hostName 用于指定虚拟主机的主机名，比如，如果希望建立一个虚拟主机 www.zydsoft.com，则可是使用下面的代码：

httpd.AddHost "www.zydsoft.com", ...

服务器在进行主机匹配的时候是通用匹配的，所以上面的代码建立了一个所有的 *.www.zydsoft.com 和 www.zydsoft.com 都能够匹配的虚拟主机。而如果希望建立一个 www.zydsoft.com 和 web.zydsoft.com 等所有的 *.zydsoft.com 都可以匹配的虚拟主机，则可以使用下面的代码：

httpd.AddHost "zydsoft.com", ...

可以在一个服务器上创建多个新的虚拟主机，服务器将按照最符合的主机进行匹配，服务器对虚拟主机的匹配顺序与主机的添加顺序没有关系，只与主机的匹配程度有关。比如下面例子建立了两个虚拟主机：

httpd.AddHost "zydsoft.com", ...
httpd.AddHost "www.zydsoft.com", ...

如果客户请求了 my.www.zydsoft.com，两个主机都是可以匹配的，在这种情况下，服务器将匹配最接近的主机，即 www.zydsoft.com。

也可以使用空字符串作为 hostName 使用，此时则创建了一个完全通配的虚拟主机，即如果服务器搜索了全部主机信息，没找到合适的主机进行匹配，则自动使用此主机。比如下面的例子：

httpd.AddHost "zydsoft.com", ...
httpd.AddHost "www.zydsoft.com", ...
httpd.AddHost "", ...

如果客户请求 www.intel.com，则在前面两个主机中都不能匹配，服务器便会使用最后一个虚拟主机进行匹配。

AddHost 方法将返回一个 HttpServerHost 对象，可以使用此对象进行进一步的设定。同时 AddHost 方法会将此对象存放在 httpd.Contents 集合中，可以使用 httpd(hostName) 取得。下面代码中 host 与 host1 是同一个主机对象：

Set host = httpd.AddHost("zydsoft.com", ...)
Set host1 = httpd("zydsoft.com")

示例

下面的例子创建一个新的 HttpServer 对象，在 80 端口建立一个服务器，然后添加一个虚拟主机：

Set httpd = CreateObject("NetBox.HttpServer")
httpd.Create "", 80
Set host = httpd.AddHost("", "\wwwroot")

应用于

HttpServer 对象


HttpServer.AttachHost 方法

AttachHost 方法

将已经建立的虚拟主机对象以指定的主机名添加到已经创建的服务器

语法

httpd.AttachHost(hostName, objHost)

参数

httpd
一个实例化的 HttpServer 对象

hostName
虚拟主机的主机名

objHost
已经创建的虚拟主机对象

注释

在很多时候需要在不同的 HttpServer 对象之间共享虚拟主机运行环境，例如 Application 对象，Session 对象等，此时就需要使用 AttachHost 方法将为一个 HttpServer 对象所创建的虚拟主机添加到另外一个 HttpServer 对象，此时，两个 HttpServer 对象将使用同一个虚拟主机对象。

应用于

HttpServer 对象


TcpServer.Close 方法

Close 方法

关闭服务器对象

语法

tcpd.Close

参数

tcpd
一个实例化的服务器对象

注释

关闭服务器对象将关闭所有已经建立的连接，等待正在处理的连接线程全部结束，并清除服务器所占用的资源。

应用于

HttpServer 对象 | TcpServer 对象


HttpServer.Create 方法

Create 方法

创建在指定地址端口一个 HTTP 服务器

语法

ret = httpd.Create(strAddr, port)

参数

ret
返回结果，服务器建立成功返回 0

httpd
一个实例化的 HttpServer 对象

strAddr
字符串，要侦听的机器名或以点分方式表示的 IP 地址

port
侦听端口，为 0 则将随机指定一个端口，可使用 LocalPort 查询此端口

注释

HttpServer.Create 将在指定的地址、端口创建一个 HTTP 服务器应用。新创建的 HTTP 服务器必须使用 AddHost 添加主机系统。

示例

下面的例子创建一个新的 HttpServer 对象，在 80 端口建立一个服务器：

Set httpd = CreateObject("NetBox.HttpServer")
httpd.Create "", 80

应用于

HttpServer 对象


TcpServer.EnableSSL 方法

EnableSSL 方法

装载服务器使用的私钥和证书

语法

ret = tcpd.EnableSSL(PrivateKey, Certificate)

参数

ret
返回装载结果，成功装载时返回 0

tcpd
一个实例化的服务器对象

PrivateKey
私钥文件名

Certificate
证书文件名

注释

装载私钥和证书将要求服务器只接受 SSL 请求，装载时将验证证书的合法性。

应用于

HttpServer 对象 | TcpServer 对象


TcpServer.Start 方法

Start 方法

启动服务器

语法

tcpd.Start

参数

tcpd
一个实例化的服务器对象

应用于

HttpServer 对象 | TcpServer 对象


TcpServer.Stop 方法

Stop 方法

停止服务器运行

语法

tcpd.Stop

参数

tcpd
一个实例化的服务器对象

注释

停止服务器运行将暂停接受新的连接请求，对于已经建立的连接没有影响。

应用于

HttpServer 对象 | TcpServer 对象


HttpServerHost 对象

设定 HttpServer 服务器的虚拟主机信息，允许对不同的虚拟主机设定不同的运行方式

语法

Set host = httpd.AddHost(hostName, RootPath)

对象

Application 可以使用 Application 对象在给定的应用程序的所有用户之间共享信息。基于 ASP 的应用程序同所有的 .asp 文件一样在一个虚拟目录及其子目录中定义。因为多个用户可以共享 Application 对象，所以必须要有 Lock 和 Unlock 方法以确保多个用户无法同时改变某一属性。

集合

Contents 基本集合，使用标准内部对象 Dictionary 存放数据

属性

ApplicationID | 查询和修改当前主机的应用标识
AutoWebDAV | 自动定向 WebFolder
BrowseHeader | 查询和设定目录浏览页面的顶部内容
EnableBrowse | 是否允许目录浏览，仅限于浏览未发布的文件，缺省为 False
EnableDebug | 脚本调试模式，为 true 表示当运行的代码出现运行错误时将自动激活系统中的调试环境，为 false 则直接返回，缺省为 false
EnableScript | 是否允许执行脚本程序，缺省为 false
EnableSession | 脚本程序是否支持 Session，缺省为 true
EnableWrite | 允许客户端修改和删除此主机的文件系统
ErrorMessage | 自定义出错提示信息
EventSink | 设定事件处理脚本部件，初始化时指向虚拟主机根目录下的 global.wsc
GlobalApplication | 设定和查询当前虚拟目录是否继承上级目录或者主机的应用环境，缺省为 False
Language | 缺省脚本语言，可以是 VBScript，Javascript，JScript 等，缺省为 VBScript
Name | 主机名，只读属性
Root | 根目录
SessionDomain | 查询和设定当前主机会话所指定的域
SessionTimeout | Session 对象指定超时时限，以分钟为单位，缺省为 20

方法

AddDefault | 添加缺省文件
AddFolder | 为已经创建的虚拟主机添加新的虚拟目录
AddHeader | AddHeader 方法用指定的值添加 HTML 标题。该方法用于向响应添加新的 HTTP 标题
AttachFolder | 将已经建立的虚拟主机对象以指定的路径名添加到指定的虚拟主机

事件

OnApplicationEnd | 事件在虚拟主机或者虚拟目录结束运行时发生
OnApplicationStart | 事件在该虚拟主机或者虚拟目录初始化时发生
OnSessionEnd | 事件在会话被放弃或超时发生
OnSessionStart | 事件在产生新会话时发生

注释

HttpServerHost 对象提供对虚拟主机的参数设定，同时也提供了对主机脚本程序中 Application 对象的直接访问，通过 Application 对象，主程序可以与服务器脚本程序进行通讯和数据交换。

可以通过两种方式获得指定主机的 HttpServerHost 对象。一种是使用 AddHost 创建新的主机对象。例如：

Set host = httpd.AddHost("zydsoft.com", "\wwwroot")

也可以直接使用 HttpServer 对象访问已经创建的主机对象。例如：

Set host = httpd("zydsoft.com")


HttpServerHost.ApplicationID 属性

ApplicationID 属性

查询和修改当前主机的应用标识

语法

host.ApplicationID[ = id]

参数

host
一个 HttpServerHost 对象

id
字符串，指定新的应用标识

注释

ApplicationID 属性用于查询和设定当前主机的应用标识，每个虚拟主机都拥有自己的标识，并使用以标识为名称的 Cookie 与浏览器维护会话状态。此属性与 Application 对象的 ApplicationID 属性返回结果是相同的，不同的是在 HttpServerHost 对象中是可以修改 ApplicationID 属性，而在 Application 对象中此属性为只读。在主机创建时，系统将随机生成一个字符串作为应用标识，通过修改此属性可以自行指定一个固定的标识来维持会话。

应用于

HttpServerHost 对象


HttpServerHost.AutoWebDAV 属性

AutoWebDAV 属性

自动定向 WebFolder

语法

host.AutoWebDAV[ = boolWebDav]

参数

host
一个 HttpServerHost 对象

boolWebDav
true 或 false，指定是否支持自动 WebFolder

注释

在支持自动 WebFolder 时，服务器将在发送目录浏览信息的时候，自动发送 WebFolder 代码，支持 WebFolder 的 ie5 以上版本的浏览器，将自动进入目录操作方式，更加方便目录操作。而不支持 WebFolder 的浏览器则不受影响。

应用于

HttpServerHost 对象


HttpServerHost.BrowseHeader 属性

BrowseHeader 属性

查询和设定目录浏览页面的顶部内容

语法

host.BrowseHeader[ = header]

参数

host
一个 HttpServerHost 对象

header
给定的一段 HTML 格式字符串

注释

在主机允许浏览时，即 EnableBrowse 属性设定为 true，可以使用此属性设定目录浏览页面的顶部添加的内容，以 HTML 格式提供。

示例

下面的例子允许目录浏览，并在目录浏览页面顶部添加一段广告代码：

……
Set host = httpd.AddHost("zydsoft.com", "\wwwroot")
host.EnableBrowse
host.BrowseHeader = "<script src=""http://ad.zydsoft.com/inowshare/ad.js""></script>"
……

上面的程序执行后，在浏览目录时，浏览器中的页面将显示下面的内容：

127.0.0.1 - /

…………

应用于

HttpServerHost 对象


HttpServerHost.EnableBrowse 属性

EnableBrowse 属性

是否允许目录浏览，仅限于浏览未发布的文件，缺省为 False

语法

host.EnableBrowse[ = boolBrowse]

参数

host
一个 HttpServerHost 对象

boolBrowse
true 或 false，指定需要设定的浏览模式

注释

如果虚拟主机或者虚拟目录允许被浏览，则当给定目录中未发现缺省文件时，服务器将自动以 HTML 方式返回文件目录。

注意：目录浏览的结果中将不包含已经发布在应用程序中的文件，只允许浏览操作系统中实际存在的文件。

当主机允许客户端进行浏览时，也可以使用 WebDAV(web 文件夹) 协议进行文件的浏览操作。

应用于

HttpServerHost 对象


HttpServerHost.EnableDebug 属性

EnableDebug 属性

脚本调试模式，为 true 表示当运行的代码出现运行错误时将自动激活系统中的调试环境，为 false 则直接返回，缺省为 false

语法

host.EnableDebug[ = boolDebug]

参数

host
一个 HttpServerHost 对象

boolDebug
true 或 false，指定需要设定的调试模式

注释

设定 HttpServerHost 对象的调试模式将影响所有此虚拟主机运行的 asp 程序的运行方式，如果 asp 程序中指定了调试模式，将以指定的调试模式运行。

应用于

HttpServerHost 对象


HttpServerHost.EnableScript 属性

EnableScript 属性

是否允许执行脚本程序，缺省为 false

语法

host.EnableScript[ = boolScript]

参数

host
一个 HttpServerHost 对象

boolScript
true 或 false，指定是否允许执行脚本程序

注释

HttpServer 支持两种服务器脚本程序，一种是标准 asp 程序，另一种是标准 NetBox 程序。标准 asp 程序的编程可以参阅 MSDN 中的相关文档，标准 NetBox 程序则是纯代码程序，不包含 HTML 部分，如果需要输出，可以使用 Response 对象。

示例

接下来，我们就可以在虚拟主机所在的目录里建立我们的 asp 脚本程序，建立 test.asp：

<%Response.Write "Hello"%>

NetBox 也支持服务器 box 程序，在目录中建立 test.box：

Response.Write "Hello"

应用于

HttpServerHost 对象


HttpServerHost.EnableSession 属性

EnableSession 属性

脚本程序是否支持 Session，缺省为 true

语法

host.EnableSession[ = boolSession]

参数

host
一个 HttpServerHost 对象

boolSession
true 或 false，指定是否支持 Session

注释

通过支持 Session，在服务器脚本程序中可以使用 Session 对象存储特定用户会话所需的信息。这样，当用户在应用程序的 Web 页之间跳转时，存储在 Session对象中的变量将不会丢失，而是在整个用户会话中一直存在下去。

当用户请求来自应用程序的 Web 页时，如果该用户还没有会话，则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后，服务器将终止该会话。

Session 对象最常见的一个用法就是存储用户的首选项。例如，如果用户指明不喜欢查看图形，就可以将该信息存储在 Session 对象中。

应用于

HttpServerHost 对象


HttpServerHost.EnableWrite 属性

EnableWrite 属性

允许客户端修改和删除此主机的文件系统

语法

host.EnableWrite[ = boolWrite]

参数

host
一个 HttpServerHost 对象

boolWrite
true 或 false，指定是否允许修改

注释

当主机允许客户端进行修改时，将支持使用 WebDAV(web 文件夹) 协议进行文件的删除、上传、更名、复制、移动等操作。

应用于

HttpServerHost 对象


HttpServerHost.ErrorMessage 属性

ErrorMessage 属性

自定义出错提示信息

语法

host.ErrorMessage[ = strMessage]

参数

host
一个 HttpServerHost 对象

strMessage
错误提示字符串

注释

可以使用 ErrorMessage 方法设定给定虚拟主机的出错提示信息，从而达到个性化错误信息、隐藏代码细节等目的。如果设定为空字符串，服务器将显示详细的错误信息。缺省为空。

应用于

HttpServerHost 对象


HttpServerHost.EventSink 属性

EventSink 属性

设定事件处理脚本部件，初始化时指向虚拟主机根目录下的 global.wsc

语法

host.EventSink[ = strEventSink]

参数

host
一个 HttpServerHost 对象

strEventSink
事件处理脚本部件的文件名，参见 NetBox 的路径系统

注释

通过设定事件处理的脚本部件，可以根据不同的事件触发相应的事件处理，当前支持的事件有：OnSessionStart，OnSessionEnd，OnApplicationStart，OnApplicationEnd。

在虚拟主机初始化时，此属性指向虚拟主机根目录的 global.wsc 文件。例如：

Set host = httpd.AddHost("", "\wwwroot")

此时虚拟主机的根为 "\wwwroot"，则 EventSink 自动初始化为 "\wwwroot\global.wsc"

示例

下面的示例设定当前 Host 对象的事件处理为 demo.wsc：

Set httpd = CreateObject("NetBox.HttpServer")

httpd.Create("", 80)
Set host = httpd.AddHost("", "\wwwroot")
host.AddDefault "default.htm"
host.EnableScript = true
host.EventSink = "\demo.wsc"
httpd.Start

demo.wsc 的代码如下：

<?xml version="1.0"?>

<component>

<public>
    <method name="OnSessionStart"/>
    <method name="OnSessionEnd"/>
    <method name="OnApplicationStart"/>
    <method name="OnApplicationEnd"/>
</public>

<script language="VBScript">
<![CDATA[
Sub OnSessionStart
End Sub

Sub OnSessionEnd
End Sub

Sub OnApplicationStart
End Sub

Sub OnApplicationEnd
End Sub
]]>
</script>

</component>

应用于

HttpServerHost 对象


HttpServerHost.GlobalApplication 属性

GlobalApplication 属性

设定和查询当前虚拟目录是否继承上级目录或者主机的应用环境，缺省为 False

语法

host.GlobalApplication[ = boolGlobalApplication]

参数

host
一个 HttpServerHost 对象

boolGlobalApplication
true 或 false，指定是否继承上级目录或者主机的应用环境

注释

当开启 GlobalApplication，即继承上层运行环境时，本层虚拟目录将与上层目录或者主机共享 Application 对象和 Session 状态，从而共享全局数据和用户私有数据。此时，因为不再使用虚拟目录本身的 Application 对象，Host.Application 对象将被忽略。

应用于

HttpServerHost 对象


HttpServerHost.Language 属性

Language 属性

缺省脚本语言，可以是 VBScript，Javascript，JScript 等，缺省为 VBScript

语法

host.Language[ = strLang]

参数

host
一个 HttpServerHost 对象

strLang
给定的需要设定的语言

注释

设定 HttpServerHost 对象的语言将影响服务器脚本程序的缺省语言，如果脚本程序中指定了语言，将以指定的语言为实际运行语言。

应用于

HttpServerHost 对象


HttpServerHost.Name 属性

Name 属性

主机名，只读属性

语法

host.Name

参数

host
一个 HttpServerHost 对象

注释

此处取得的主机名与 HttpServer.AddHost 创建时给定的主机名是相同的。

应用于

HttpServerHost 对象


HttpServerHost.Root 属性

Root 属性

根目录

语法

host.Root[ = RootPath]

参数

host
一个 HttpServerHost 对象

RootPath
虚拟主机的根目录

注释

对于新创建的 HttpServerHost 对象，此处取得的 Root 值与 HttpServer.AddHost 时给定的值是相同的，同样可以对此属性进行修改。

应用于

HttpServerHost 对象


HttpServerHost.SessionDomain 属性

SessionDomain 属性

查询和设定当前主机会话所指定的域

语法

host.SessionDomain[ = domain]

参数

host
一个 HttpServerHost 对象

domain
字符串，指定会话的主机名或者域，设定为空字符串则不指定域。缺省为空

注释

在 HttpServerHost 对象创建时，此属性缺省被设定为空字符串，即不限定主机名和域。在这种情况下，主机的会话可能可以以任何名称的主机连接成功，并且会话只能以创建时的主机名称维持。通过修改此属性，可以指定会话的维持范围，是在一个指定的主机，还是一个指定的域。

限定会话有效域将会限制服务器只允许和使用指定域内的主机名称访问的客户浏览器创建会话，以 IP 和其他主机名将不能成功建立会话，所以在设定是需谨慎。

应用于

HttpServerHost 对象


HttpServerHost.SessionTimeout 属性

SessionTimeout 属性

Session 对象指定超时时限，以分钟为单位，缺省为 20

语法

host.Timeout[ = nMinutes]

应用于

HttpServerHost 对象


HttpServerHost.AddDefault 方法

AddDefault 方法

添加缺省文件

语法

host.AddDefault strFileName

参数

host
一个 HttpServerHost 对象

strFileName
给定要添加的文件名

注释

缺省文件指当直接访问目录时，服务器在所访问的目录下查询的文件名。可以添加多个缺省文件，服务器在查询时以添加顺序查询文件，以最先查询到的文件作为目录访问的结果。

示例

下面的例子给缺省主机添加缺省文件“default.htm”。

Set httpd = CreateObject("NetBox.HttpServer")

httpd.Create("", 80)
Set host = httpd.AddHost("", "\wwwroot")
host.AddDefault "default.htm"
httpd.Start

应用于

HttpServerHost 对象


HttpServerHost.AddFolder 方法

AddFolder 方法

为已经创建的虚拟主机添加新的虚拟目录

语法

Set folder = host.AddFolder(pathName, RootPath)

参数

folder
返回新创建的目录对象，为 HttpServerHost 对象

host
一个实例化的 HttpServerHost 对象

pathName
虚拟目录的目录名

RootPath
虚拟目录的根目录，参见 NetBox 的路径系统

注释

一般情况下，同一个虚拟主机是作为一个完整的应用创建的。然而，有些时候可能需要将虚拟主机下面的一个特定路径定义为一个单独的应用，此时就需要为该虚拟主机创建虚拟目录。

在添加新的虚拟目录时，pathName 用于指定虚拟目录的路径名，比如，如果希望建立一个虚拟目录在 \demo，则可是使用下面的代码：

host.AddFolder "\demo", ...

可以为一个虚拟主机创建多个虚拟目录，服务器将按照最符合的目录进行匹配，服务器对虚拟目录的匹配顺序与目录的添加顺序没有关系，只与目录的匹配程度有关。比如下面例子建立了两个虚拟目录：

host.AddFolder "\demo\demo1", ...
host.AddFolder "\demo", ...

如果客户请求了 /demo/demo1/test.htm，两个目录都是可以匹配的，在这种情况下，服务器将匹配最接近的目录，即 \demo\demo1。

AddFolder 方法将返回一个 HttpServerHost 对象，可以使用此对象进行进一步的设定。同时 AddFolder 方法会将此对象存放在 host.Contents 集合中，可以使用 host(pathName) 取得。下面代码中 folder 与 folder1 是同一个主机对象：

Set folder = host.AddFolder("\demo", ...)
Set folder1 = host("\demo")

注意：该方法添加的虚拟目录名将被自动格式化为“\”分割方式。

应用于

HttpServerHost 对象


HttpServerHost.AddHeader 方法

AddHeader 方法

AddHeader 方法用指定的值添加 HTML 标题。该方法用于向响应添加新的 HTTP 标题

语法

host.AddHeader name, value

参数

host
一个 HttpServerHost 对象

name
新的标题变量的名称

value
存储在新的标题变量中的初始值

注释

AddHeader 方法用于向虚拟主机或者虚拟目录添加 HTML 标题，添加的标题将在每个请求发送给用户。

示例

下面的代码为虚拟主机增加一个 MaxConnection 字段，以限制网络蚂蚁的同时下载数量：

host.AddHeader "MaxConnection", 3

应用于

HttpServerHost 对象


HttpServerHost.AttachFolder 方法

AttachFolder 方法

将已经建立的虚拟主机对象以指定的路径名添加到指定的虚拟主机

语法

host.AttachFolder(pathName, objHost)

参数

host
一个实例化的 HttpServerHost 对象

pathName
虚拟目录的目录名

objHost
已经创建的虚拟主机对象

注释

在很多时候需要在不同的 HttpServer 对象或者不同的虚拟主机之间共享虚拟主机运行环境，例如 Application 对象，Session 对象等，此时就需要使用 AttachFolder 方法将一个虚拟主机对象添加到另外一个 host 对象。

应用于

HttpServerHost 对象


HttpServerHost.OnApplicationEnd 事件

OnApplicationEnd 事件

事件在虚拟主机或者虚拟目录结束运行时发生

语法

Sub OnApplicationEnd
...
End Sub

注释

OnApplicationStart 事件在虚拟主机或者虚拟目录结束运行时发生，在事件处理时，可以使用的内建对象有：NetBox，Application，Shell。

参见 EventSink 属性

应用于

HttpServerHost 对象


HttpServerHost.OnApplicationStart 事件

OnApplicationStart 事件

事件在该虚拟主机或者虚拟目录初始化时发生

语法

Sub OnSessionStart
...
End Sub

注释

OnApplicationStart 事件在虚拟主机或者虚拟目录初始化时发生，在事件处理时，可以使用的内建对象有：NetBox，Application，Shell，Host。其中 Host 对象即为产生事件的虚拟主机或者虚拟目录本身。

参见 EventSink 属性

应用于

HttpServerHost 对象


HttpServerHost.OnSessionEnd 事件

OnSessionEnd 事件

事件在会话被放弃或超时发生

语法

Sub OnSessionEnd
...
End Sub

注释

OnSessionEnd 事件在会话被放弃或超时发生，在事件处理时，可以使用的内建对象有：NetBox，Application，Session。

参见 EventSink 属性

应用于

HttpServerHost 对象


HttpServerHost.OnSessionStart 事件

OnSessionStart 事件

事件在产生新会话时发生

语法

Sub OnSessionStart
...
End Sub

注释

OnSessionStart 事件在产生新会话时发生，在事件处理时，可以使用的内建对象有：NetBox，Application，Session，Request，Response。

参见 EventSink 属性

应用于

HttpServerHost 对象


JobServer 对象

任务服务器，建立线程池来完成大量重复的任务

语法

Set jobs = CreateObject("NetBox.JobServer")

集合

Contents 基本集合，使用标准内部对象 Dictionary 存放数据

属性

AutoStop | 设定任务服务器关闭时是否自动中止服务，缺省为 false
idleWorkers | 查询当前服务器空闲的工作线程数
MaxWorkers | 线程池最大线程数，缺省为 256
queueWorks | 查询当前队列中排队的任务
Timeout | 线程池等待时间，如果线程在给定的时间内没有接收到新的任务，将自行退出，缺省为 10 分钟
totalWorks | 查询服务器已处理的请求或者任务
Workers | 查询当前工作线程总数

方法

Add | 添加一个任务到任务队列
Clear | 清除队列中未处理的任务
Close | 关闭当前的任务服务器
Create | 创建一个任务服务器并指定任务处理程序和最大任务队列
Stop | 中断全部未完成的任务

事件

OnAccept 服务器连接接受事件

注释

JobServer 用于创建一个高性能的线程池以完成用户提交的大批量的重复任务，从而满足多线程完成任务的需求。

示例

下面的例子实例化一个 JobServer 对象，创建一个任务服务器，并添加任务。

Set JobServer = CreateObject("NetBox.JobServer")
JobServer.Create "\Accept.wsc"
JobServer.Add 100
JobServer.Add 200

Console.ReadLine

任务服务器的接受脚本部件文件 Accept.wsc 内容如下：

<?xml version="1.0"?>
<component>
<public>
    <method name="OnAccept"/>
</public>

<script language="VBScript">
<![CDATA[
Function OnAccept(Job, Contents)
    ……
End Function
]]>
</script>
</component>


JobServer.AutoStop 属性

AutoStop 属性

设定任务服务器关闭时是否自动中止服务，缺省为 false

语法

job.AutoStop[ = stop]

参数

job
一个实例化的任务服务器

stop
设定关闭时是否自动中止任务

注释

当调用任务服务器 Close 方法关闭时，如果 AutoStop 属性设定为 false，任务服务器将等待所有任务完成；如果 AutoStop 属性设定为 true，则任务服务器先调用 Stop 方法中止服务器中现有正在进行的和排队的任务，再关闭服务器。

当任务服务器对象创建时，AutoStop 属性设定为 false。

应用于

JobServer 对象


JobServer.Add 方法

Add 方法

添加一个任务到任务队列

语法

jobs.Add(varJob)

参数

jobs
一个实例化的任务服务器

varJob
给定要添加的任务，可以是任何数据类型

注释

添加的任务将作为参数传输给用户任务处理程序，由用户任务处理程序执行任务。

应用于

JobServer 对象


JobServer.Clear 方法

Clear 方法

清除队列中未处理的任务

语法

jobs.Clear

参数

jobs
一个实例化的任务服务器

应用于

JobServer 对象


JobServer.Close 方法

Close 方法

关闭当前的任务服务器

语法

jobs.Close

参数

jobs
一个实例化的任务服务器

注释

Close 方法将等待全部任务执行完毕，清除线程池，关闭任务服务器。由于 Close 方法将等待全部任务执行结束，所以可能会执行一段时间。如果需要立刻关闭服务器，则可以先调用 Stop 方法将服务器中现有的任务中断，再调用 Close 方法关闭。

应用于

JobServer 对象


JobServer.Create 方法

Create 方法

创建一个任务服务器并指定任务处理程序和最大任务队列

语法

jobs.Create(strFile[, MaxQueue])

参数

jobs
一个实例化的任务服务器

strFile
字符串，指定的WSC文件的文件名，参见 NetBox 的路径系统

MaxQueue
最大任务队列，缺省为 4096

注释

创建一个任务服务器，strFile 指定当连接请求到达时处理连接的脚本部件文件名，此脚本部件必须提供一个公共方法 OnAccept 以处理连接。

应用于

JobServer 对象


JobServer.Stop 方法

Stop 方法

中断全部未完成的任务

语法

jobs.Stop

参数

jobs
一个实例化的任务服务器

注释

Stop 方法将中断全部未完成的任务，包括清除未处理的任务，停止正在执行的任务。

应用于

JobServer 对象


JobServer.OnAccept 事件

OnAccept 事件

服务器连接接受事件

语法

Function OnAccept(varJob, Contents)
...
End Function

参数

varJob
本次任务的内容

Contents
服务器的内置容器

注释

OnAccept 事件用于处理服务器接受的任务，在触发 OnAccept 事件时，服务器将新建立任务和服务器内置的容器对象作为参数传递给事件函数，应用可以通过服务器的 Contents 存储相关数据，或通过 Contents 在主程序和连接事件之间通讯。

OnAccept 事件需要在脚本部件中实现，关于脚本部件的详细信息请参考相关文档。

示例

下面是一个 OnAccept 事件的例子：

<?xml version="1.0"?>

<component>

<public>
    <method name="OnAccept"/>
</public>

<script language="VBScript">
<![CDATA[
Function OnAccept(varJob, Contents)
    ……
End Function
]]>
</script>

</component>

应用于

JobServer 对象


TcpServer 对象

创建一个 TCP 服务器，可以方便地创建高性能的多线程服务器

语法

Set tcpd = CreateObject("NetBox.TcpServer")

集合

Contents 基本集合，使用标准内部对象 Dictionary 存放数据

属性

ConnectLimit | 连接限制，可以限制同一 IP 地址最多连接数量，设为零时不限制，缺省为不限制
ConnectTimeout | 设定服务器接受连接的的读写超时时间，缺省为不超时
idleWorkers | 查询当前服务器空闲的工作线程数
LocalPort | 返回服务器当前侦听端口
MaxWorkers | 线程池最大线程数，缺省为 256
queueWorks | 查询当前队列中排队的任务
Running | 返回服务器对象是否正在运行
SSLSessionTimeout | 设定服务器 SSL 通道会话超时时间
Timeout | 线程池等待时间，如果线程在给定的时间内没有接收到新的任务，将自行退出，缺省为 10 分钟
totalWorks | 查询服务器已处理的请求或者任务
Workers | 查询当前工作线程总数

方法

Close | 关闭服务器对象
Create | 创建在指定地址端口一个服务器
EnableSSL | 装载服务器使用的私钥和证书
Start | 启动服务器
Stop | 停止服务器运行

事件

OnAccept 服务器连接接受事件

注释

使用 NetBox.TcpServer 可以创建一个高性能的多线程 TCP 服务器。

示例

下面的例子创建一个 NetBox.TcpServer 对象，在 23(telnet) 端口建立服务器，并启动服务：

Set TcpServer = CreateObject("NetBox.TcpServer")
TcpServer.Create "", 23, "\Accept.wsc"
TcpServer.Start

Shell.Console.ReadLine

服务器的接受脚本部件文件 Accept.wsc 内容如下：

<?xml version="1.0"?>
<component>
<public>
    <method name="OnAccept"/>
</public>

<script language="VBScript">
<![CDATA[
Function OnAccept(Socket, Contents)
    Socket.WriteLine "Hello! I'm here!!!"
End Function
]]>
</script>
</component>

这个例子与 NetBox.Socket 的例子很类似，但是功能实实在在的强大了很多，可以接受多个请求，并且可以同步处理多个请求，主运行程序可以继续做其他工作，等等。


TcpServer.Create 方法

Create 方法

创建在指定地址端口一个服务器

语法

ret = tcpd.Create(strAddr, port, strFile)

参数

ret
返回结果，服务器建立成功返回 0

tcpd
一个实例化的服务器对象

strAddr
字符串，要侦听的机器名或以点分方式表示的 IP 地址

port
侦听端口，为 0 则将随机指定一个端口，可使用 LocalPort 查询此随机端口

strFile
字符串，指定的WSC文件的文件名，参见 NetBox 的路径系统

注释

TcpServer.Create 将在指定的地址、端口创建一个 TCP 服务器应用，strFile 指定当连接请求到达时处理连接的脚本部件文件名，此脚本部件必须提供一个公共方法 OnAccept 以处理连接。

应用于

TcpServer 对象


TcpServer.OnAccept 事件

OnAccept 事件

服务器连接接受事件

语法

Function OnAccept(Socket, Contents)
...
End Function

参数

Socket
新建立起来的 TCP 连接

Contents
服务器的内置容器

注释

OnAccept 事件用于处理服务器接受的新 TCP 连接，在触发 OnAccept 事件时，服务器将新建立的 TCP 连接对象和服务器内置的容器对象作为参数传递给事件函数，应用可以通过服务器的 Contents 存储相关数据，或通过 Contents 在主程序和连接事件之间通讯。

OnAccept 事件需要在脚本部件中实现，关于脚本部件的详细信息请参考相关文档。

示例

下面是一个 OnAccept 事件的例子：

<?xml version="1.0"?>

<component>

<public>
    <method name="OnAccept"/>
</public>

<script language="VBScript">
<![CDATA[
Function OnAccept(Socket, Contents)
    Socket.WriteLine "Hello! I'm here!!!"
End Function
]]>
</script>

</component>

应用于

TcpServer 对象


加密对象参考

对象 | 说 明
Cipher | 对称密钥加密算法对象
Hash | 报文摘要算法
Random | 生成高随机性的数据块
RSA | 非对称加密算法 RSA 加密解密对象


Cipher 对象

对称密钥加密算法对象

语法

Set Cipher = CreateObject("NetBox.Cipher")

属性

BlockSize | 查询目前选择的加密算法的块尺寸，以字节为单位
CipherMode | 查询目前选择的加密算法的分组运算模式，此模式由 Create 方法创建时指定
IVSize | 查询目前选择的加密算法的初始化向量的尺寸，以字节为单位，如不支持初始化向量则返回 0
IV | 设定和读取目前选择的加密算法的初始化向量，类型为二进制
KeySize | 查询目前选择的加密算法的密钥的尺寸，以字节为单位
Key | 设定和读取目前选择的加密算法的密钥，类型为二进制
Name | 查询目前选择的加密算法的内部名称
Padding | 设定和读取目前选择的加密算法的填充模式

方法

Create | 选择并按照指定的算法创建一个对称加密实体
GenerateIV | 生成随机的对称加密算法初始化向量
GenerateKey | 按照指定的尺寸生成随机的对称加密算法密钥
Decrypt | 使用当前加密对象对给定的数据进行解密操作
Encrypt | 使用当前加密对象对给定的数据进行加密操作

注释

Cipher 提供一组对称密钥加密算法，对称加密采用了对称密码编码技术，它的特点是数据加密和解密使用相同的密钥，即加密密钥也同时作为解密密钥，这种方法在密码学中叫做对称加密算法，对称加密算法使用起来简单快捷，密钥较短，且破译困难。

示例

下面的例子创建一个 Cipher 对象，并设定算法为 DES，然后指定加密密钥，并加密一个文件到另外一个文件。

Set C = CreateObject("NetBox.Cipher")
C.Create "DES"
C.Key = NetBox.Encoding.HexDecode("D93F76F8175EB1A3")
C.Encrypt "c:\test.dat", "c:\test.enc"

反之，如果我们需要对这个文件进行解密，则可以使用下面的代码：

Set C = CreateObject("NetBox.Cipher")
C.Create "DES"
C.Key = NetBox.Encoding.HexDecode("D93F76F8175EB1A3")
C.Decrypt "c:\test.enc", "c:\test.dat"

下面是一段测试代码，可以列举各种算法的相关参数，并对算法的运算时间进行实测，代码同时演示了如何枚举对象所支持的全部算法的编程方法：

Dim a(3000)

Set R = CreateObject("NetBox.Random")
For i = 0 to 3000
    a(i) = R(i)
Next

Sub TestCipher(name, mode)
    C.Create name, mode

    If mode > 1 And C.IVSize Then C.GenerateIV

    t = Timer

    For i = 1 To 3000
        B1 = C.Decrypt(C.Encrypt(a(i)))

        If CStr(a(i)) <> CStr(B1) Then
            Shell.Console.WriteLine C.name & ": ERROR!!!, " & i
            Exit Sub
        End If
    Next

    Shell.Console.WriteLine C.name & ": OK,    time:" & Timer - t
End Sub

Set C = CreateObject("NetBox.Cipher")

For Each n In C
    C.Create n
    Shell.Console.WriteLine "------------------ " & n & " -----------------"
    Shell.Console.WriteLine "BlockSize: " & C.BlockSize
    Shell.Console.WriteLine "KeySize: " & C.KeySize
    Shell.Console.WriteLine "IVSize: " & C.IVSize
    Shell.Console.WriteLine "Default Mode: " & C.CipherMode

    Shell.Console.WriteLine

    If C.CipherMode <> 1 Then
        TestCipher n, C.CipherMode
    Else
        For m = 1 To 4
            TestCipher n, m
        Next
    End If

    Shell.Console.WriteLine
Next

在我所使用的机器上面，上面的代码运行结果如下：

------------------ AES-128 -----------------
BlockSize: 16
KeySize: 16
IVSize: 16
Default Mode: 1

AES-128-ECB: OK,    time:.328125
AES-128-CBC: OK,    time:.34375
AES-128-CFB: OK,    time:.4375
AES-128-OFB: OK,    time:.359375

------------------ AES-192 -----------------
BlockSize: 16
KeySize: 24
IVSize: 16
Default Mode: 1

AES-192-ECB: OK,    time:.359375
AES-192-CBC: OK,    time:.390625
AES-192-CFB: OK,    time:.390625
AES-192-OFB: OK,    time:.390625

------------------ AES-256 -----------------
BlockSize: 16
KeySize: 32
IVSize: 16
Default Mode: 1

AES-256-ECB: OK,    time:.40625
AES-256-CBC: OK,    time:.40625
AES-256-CFB: OK,    time:.4375
AES-256-OFB: OK,    time:.421875

------------------ BLOWFISH -----------------
BlockSize: 8
KeySize: 16
IVSize: 8
Default Mode: 1

BF-ECB: OK,    time:.796875
BF-CBC: OK,    time:.75
BF-CFB: OK,    time:.84375
BF-OFB: OK,    time:.84375

------------------ CAST5 -----------------
BlockSize: 8
KeySize: 16
IVSize: 8
Default Mode: 1

CAST5-ECB: OK,    time:.3125
CAST5-CBC: OK,    time:.28125
CAST5-CFB: OK,    time:.359375
CAST5-OFB: OK,    time:.375

------------------ DES -----------------
BlockSize: 8
KeySize: 8
IVSize: 8
Default Mode: 1

DES-ECB: OK,    time:.359375
DES-CBC: OK,    time:.34375
DES-CFB: OK,    time:.40625
DES-OFB: OK,    time:.4375

------------------ DES-EDE -----------------
BlockSize: 8
KeySize: 16
IVSize: 8
Default Mode: 1

DES-EDE: OK,    time:.78125
DES-EDE-CBC: OK,    time:.734375
DES-EDE-CFB: OK,    time:.828125
DES-EDE-OFB: OK,    time:.796875

------------------ DES-EDE3 -----------------
BlockSize: 8
KeySize: 24
IVSize: 8
Default Mode: 1

DES-EDE3: OK,    time:.75
DES-EDE3-CBC: OK,    time:.734375
DES-EDE3-CFB: OK,    time:.8125
DES-EDE3-OFB: OK,    time:.8007813

------------------ DESX -----------------
BlockSize: 8
KeySize: 24
IVSize: 8
Default Mode: 2

DESX-CBC: OK,    time:.34375

------------------ IDEA -----------------
BlockSize: 8
KeySize: 16
IVSize: 8
Default Mode: 1

IDEA-ECB: OK,    time:.5195313
IDEA-CBC: OK,    time:.5273438
IDEA-CFB: OK,    time:.5195313
IDEA-OFB: OK,    time:.546875

------------------ RC2 -----------------
BlockSize: 8
KeySize: 16
IVSize: 8
Default Mode: 1

RC2-ECB: OK,    time:.625
RC2-CBC: OK,    time:.625
RC2-CFB: OK,    time:.75
RC2-OFB: OK,    time:.75

------------------ RC2-40 -----------------
BlockSize: 8
KeySize: 5
IVSize: 8
Default Mode: 2

RC2-40-CBC: OK,    time:.625

------------------ RC2-64 -----------------
BlockSize: 8
KeySize: 8
IVSize: 8
Default Mode: 2

RC2-64-CBC: OK,    time:.625

------------------ RC4 -----------------
BlockSize: 1
KeySize: 16
IVSize: 0
Default Mode: 0

RC4: OK,    time:.203125

------------------ RC4-40 -----------------
BlockSize: 1
KeySize: 5
IVSize: 0
Default Mode: 0

RC4-40: OK,    time:.203125

------------------ RC5 -----------------
BlockSize: 8
KeySize: 16
IVSize: 8
Default Mode: 1

RC5-ECB: OK,    time:.21875
RC5-CBC: OK,    time:.203125
RC5-CFB: OK,    time:.25
RC5-OFB: OK,    time:.296875


Cipher.BlockSize 属性

BlockSize 属性

查询目前选择的加密算法的块尺寸，以字节为单位

语法

size = Cipher.BlockSize

参数

size
取得结果的字节数

Cipher
实例化的对称密钥加密算法对象

注释

基本数据块是对称加密算法的基本单元，尺寸超过基本数据块的数据将被作为多个数据块分块处理，数据最后不足尺寸的数据将被按照填充模式予以填充。

不同的算法其基本数据块的尺寸是不同的，下面的例子列举了对象支持的全部算法的数据块尺寸：

Set C = CreateObject("NetBox.Cipher")

For Each n In C
    C.Create n
    Shell.Console.WriteLine n & ": " & C.BlockSize
Next

上面的代码运行后得到以下结果：

AES-128: 16
AES-192: 16
AES-256: 16
BLOWFISH: 8
CAST5: 8
DES: 8
DES-EDE: 8
DES-EDE3: 8
DESX: 8
IDEA: 8
RC2: 8
RC2-40: 8
RC2-64: 8
RC4: 1
RC4-40: 1
RC5: 8

应用于

Cipher 对象


Cipher.CipherMode 属性

CipherMode 属性

查询目前选择的加密算法的分组运算模式，此模式由 Create 方法创建时指定

语法

mode = Cipher.CipherMode

参数

mode
取得结果的字节数

Cipher
实例化的对称密钥加密算法对象

注释

此属性查询的结果可以有以下 5 种：

数值 | 含义
0 | Stream(数据流)
1 | ECB(Electronic Codebook，电子密码本)
2 | CBC(Cipher Block Chaining，密码分组链接)
3 | CFB(Cipher Feedback，密码反馈)
4 | OFB(Output Feedback，输出反馈)

应用于

Cipher 对象


Cipher.IVSize 属性

IVSize 属性

查询目前选择的加密算法的初始化向量的尺寸，以字节为单位，如不支持初始化向量则返回 0

语法

size = Cipher.IVSize

参数

size
取得结果的字节数

Cipher
实例化的对称密钥加密算法对象

应用于

Cipher 对象


Cipher.IV 属性

IV 属性

设定和读取目前选择的加密算法的初始化向量，类型为二进制

语法

Cipher.IV = iv

参数

Cipher
实例化的对称密钥加密算法对象

iv
指定新的初始化向量

应用于

Cipher 对象


Cipher.KeySize 属性

KeySize 属性

查询目前选择的加密算法的密钥的尺寸，以字节为单位

语法

size = Cipher.KeySize

参数

size
取得结果的字节数

Cipher
实例化的对称密钥加密算法对象

应用于

Cipher 对象


Cipher.Key 属性

Key 属性

设定和读取目前选择的加密算法的密钥，类型为二进制

语法

Cipher.Key = key

参数

Cipher
实例化的对称密钥加密算法对象

key
指定新的密钥

注释

对称加密对象在使用 Create 方法指定算法时，会自动按照算法的缺省密钥尺寸生成一个随机密钥。当需要使用指定的密钥加密或者解密时，可以使用此属性修改缺省建立的密钥。

应用于

Cipher 对象


Cipher.Name 属性

Name 属性

查询目前选择的加密算法的内部名称

语法

Cipher.Name

参数

Cipher
实例化的对称密钥加密算法对象

应用于

Cipher 对象


Cipher.Padding 属性

Padding 属性

设定和读取目前选择的加密算法的填充模式

语法

Cipher.Padding = padding

参数

Cipher
实例化的对称密钥加密算法对象

padding
指定新的填充模式

注释

填充模式指的是当剩余数据不足加密算法的一个基本数据块时，以何种方式填充不足的部分。Stream 方式的加密算法因为最小数据块单位为一个字节，所以不存在填充模式。

在对称加密对象选择加密算法时，缺省设定为 1，即使用 PKCS 填充模式，在被加密的数据后面加上n个值为n的字节，使得加密后的数据长度为加密块长度的整数倍。无论在什么情况下，都是要加上padding的，也就是说，如果被加密的数据已经是块长度的整数倍，那么这时候n就应该等于块长度。

当 Padding 属性被设置为 0，即不填充时，如果若处理的数据不是加密算法基本数据块尺寸的整数倍，则加密或者解密操作将报告错误。

是否使用 Padding 取决于具体应用。如果所处理的数据是随机不定长的，则使用填充模式更加灵活方便，缺点是增加了结果的数据量。而如果处理的数据是自行控制的，则可以考虑将 Padding 设定为 0。

应用于

Cipher 对象


Cipher.Create 方法

Create 方法

选择并按照指定的算法创建一个对称加密实体

语法

Cipher.Create [strName[, nMode]]

参数

Cipher
实例化的对称密钥加密算法对象

strName
指定所选择的加密算法，缺省为 "DES"

nMode
指定加密算法的分组运算模式，缺省则根据算法选择其缺省模式，详细描述参阅 CipherMode

注释

可选择的算法和分组运算模式见下表：

算法 | Stream | ECB | CBC | CFB | OFB
AES-128 |  | X | X | X | X
AES-192 |  | X | X | X | X
AES-256 |  | X | X | X | X
BLOWFISH |  | X | X | X | X
CAST5 |  | X | X | X | X
DES |  | X | X | X | X
DES-EDE |  | X | X | X | X
DES-EDE3 |  | X | X | X | X
DESX |  |  | X |  |
IDEA |  | X | X | X | X
RC2 |  | X | X | X | X
RC2-40 |  |  | X |  |
RC2-64 |  |  | X |  |
RC4 | X |  |  |  |
RC4-40 | X |  |  |  |
RC5 |  | X | X | X | X

如果创建时选定了不存在的算法，或者指定的算法不支持选择分组运算模式，此次调用将失败。

在创建时也可以使用全名直接创建。比如如果希望创建一个 AES-256 的算法，使用 OFB 分组运算模式，则可以使用下面的代码：

Cipher.Create "AES-256-OFB"

这一行代码等同于：

Cipher.Create "AES-256", 4

应用于

Cipher 对象


Cipher.GenerateIV 方法

GenerateIV 方法

生成随机的对称加密算法初始化向量

语法

Cipher.GenerateIV

参数

Cipher
实例化的对称密钥加密算法对象

应用于

Cipher 对象


Cipher.GenerateKey 方法

GenerateKey 方法

按照指定的尺寸生成随机的对称加密算法密钥

语法

Cipher.GenerateKey size

参数

Cipher
实例化的对称密钥加密算法对象

size
指定密钥的尺寸，以字节为单位，缺省为 -1，使用算法缺省尺寸

应用于

Cipher 对象


Cipher.Decrypt 方法

Decrypt 方法

使用当前加密对象对给定的数据进行解密操作

语法

[retData =]Cipher.Decrypt(inData[, outData])

参数

retData
返回解密的数据块

Cipher
实例化的对称密钥加密算法对象

inData
输入的需要解密的数据源

outData
解密后的数据的目标，可省略，如果省略，则解密数据作为方法结果 retData 返回

注释

在调用此方法时，inData 可以是二进制数据块、一个已经实例化的流、文件名、或者 url 地址。而 outData 则可以是一个已经实例化的流或者是文件名。如果 outData 省略，则解密数据作为方法结果 retData 返回

例如，解密一个文件到另外一个文件，可以用下面的代码：

cipher.Decrypt "test.enc", "test.txt"

而解密一个加密的数据块到另外一个数据块，则可以使用下面的代码：

retData = cipher.Decrypt(encData)

解密一个加密的数据块到一个文件：

cipher.Decrypt encData, "test.txt"

解密一个加密的文件到一个数据块：

retData = cipher.Decrypt("test.enc")

应用于

Cipher 对象


Cipher.Encrypt 方法

Encrypt 方法

使用当前加密对象对给定的数据进行加密操作

语法

[retData =]Cipher.Encrypt(inData[, outData])

参数

retData
返回加密的数据块

Cipher
实例化的对称密钥加密算法对象

inData
输入的需要加密的数据源

outData
加密后的数据的目标，可省略，如果省略，则加密数据作为方法结果 retData 返回

注释

在调用此方法时，inData 可以是二进制数据块、一个已经实例化的流、文件名、或者 url 地址。而 outData 则可以是一个已经实例化的流或者是文件名。如果 outData 省略，则加密数据作为方法结果 retData 返回

例如，加密一个文件到另外一个文件，可以用下面的代码：

cipher.Encrypt "test.txt", "test.enc"

而加密一个数据块到另外一个数据块，则可以使用下面的代码：

retData = cipher.Encrypt(Data)

加密一个数据块到一个文件：

cipher.Encrypt Data, "test.enc"

加密一个文件到一个数据块：

retData = cipher.Encrypt("test.txt")

应用于

Cipher 对象


Hash 对象

报文摘要算法

语法

Set Hash = CreateObject("NetBox.Hash")

属性

HashSize 取得报文摘要算法结果的大小

方法

Create | 清除并制定新的报文摘要算法，清除后的对象以制定的新算法进行计算
Final | 结束报文摘要算法并返回结果，缺省方法
Update | 向报文摘要算法添加数据

注释

报文摘要算法（Message Digest Algorithms）即采用单向HASH算法将需要加密的明文进行摘要，而产生的具有固定长度的单向散列（HASH）值。其中，散列函数（Hash Functions）是将一个不同长度的报文转换成一个数字串（即报文摘要）的公式，该函数不需要密钥，公式决定了报文摘要的长度。报文摘要对非对称加密一起，提供数字签名的方法。

示例

下面的例子创建一个 Hash 对象，指定算法为 MD5，添加数据，最后返回结果：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
Hash.Update "String"
val = Hash.Final

上面的例子也可以更加方便的方式编写：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
val = Hash.Final("String")

Hash 对象所支持的算法可以使用下面的程序查询：

Set Hash = CreateObject("NetBox.Hash")
For Each n In hash
    hash.Create n
    Shell.Console.WriteLine n & ": " & hash.HashSize
Next


Hash.HashSize 属性

HashSize 属性

取得报文摘要算法结果的大小

语法

size = Hash.HashSize

参数

size
取得结果的字节数

Hash
实例化的报文摘要算法对象

应用于

Hash 对象


Hash.Create 方法

Create 方法

清除并制定新的报文摘要算法，清除后的对象以制定的新算法进行计算

语法

Hash.Create [varAlgo]

参数

Hash
实例化的报文摘要算法对象

varAlgo
字符串，给定的摘要算法名称，确省为 "MD5"

注释

可以使用 Create 方法指定不同的摘要算法，支持的算法有：MD2，MD4，MD5，MDC2，RipeMD160，SHA，SHA1，SHA256，SHA384，SHA512。

示例

下面的例子创建一个 Hash 对象，指定算法为 MD5，添加数据，最后返回结果：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
Hash.Update "String"
val = Hash.Final

应用于

Hash 对象


Hash.Final 方法

Final 方法

结束报文摘要算法并返回结果，缺省方法

语法

varHash = Hash.Final([varData])

参数

varHash
取得报文摘要算法的二进制结果

Hash
实例化的报文摘要算法对象

varData
最终添加给算法的数据，二进制数据或者字符串

注释

使用 Final 方法可以最终取得摘要算法的结果，并初始化 Hash 对象到 Create 以后的状态，摘要算法保持不变。Final 为 Hash 对象的缺省方法。

示例

下面的例子创建一个 Hash 对象，指定算法为 MD5，添加数据，最后返回结果：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
Hash.Update "String"
val = Hash.Final

上面的例子也可以更加方便的方式编写：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
val = Hash.Final("String")

应用于

Hash 对象


Hash.Update 方法

Update 方法

向报文摘要算法添加数据

语法

Hash.Update varData

参数

Hash
实例化的报文摘要算法对象

varData
添加给算法的数据，二进制数据或者字符串

注释

使用 Update 方法可以将数据分成多次添加进 Hash 对象，如果只有一块数据需要计算摘要，则可以直接使用 Final 方法。

示例

下面的例子创建一个 Hash 对象，指定算法为 MD5，添加数据，最后返回结果：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
Hash.Update "String"
val = Hash.Final

上面的例子也可以更加方便的方式编写：

Set Hash = CreateObject("NetBox.Hash")
Hash.Create "MD5"
val = Hash.Final("String")

应用于

Hash 对象


Random 对象

生成高随机性的数据块

语法

Set rand = CreateObject("NetBox.Random")

方法

Generate 生成高随机性的数据块

注释

使用 Random 对象可以生成高随机性的数据块，用于随机生成密钥和其他随机要求较高的场所。

示例

下面的例子生成一个 10 字节的随机数据块

Set rand = CreateObject("NetBox.Random")
d = rand.Generate(10)


Random.Generate 方法

Generate 方法

生成高随机性的数据块

语法

variant = rand.Generate(BlockSize)

参数

variant
返回随机二进制数据块，数据类型为 VT_ARRAY | VT_UI1

rand
实例化的 Random 对象

BlockSize
给定需要生成的数据块尺寸

示例

下面的例子生成一个 10 字节的随机数据块

Set rand = CreateObject("NetBox.Random")
d = rand.Generate(10)

应用于

Random 对象


RSA 对象

非对称加密算法 RSA 加密解密对象

语法

Set rsa = CreateObject("NetBox.RSA")

属性

IsPrivateKey | 查询当前的 RSA 对象所包含的密钥是是否是私钥
Key | 读取当前对象中包含的密钥，根据不同对象返回公钥或私钥
KeySize | 查询当前对象的密钥尺寸
Padding | 查询和设定当前填充模式，确省为 1
PrivateKey | 读取或设定当前对象中包含的私钥
PublicKey | 读取或设定当前对象中包含的公钥

方法

Decrypt | 使用对象内的公钥或者私钥解密数据
Encrypt | 使用对象内的公钥或者私钥加密数据
GenerateKey | 创建一个密钥

注释

下面的例子创建一个 rsa 对象，创建一个私钥，加密一段数据。然后创建另外一个 rsa 对象，使用第一个对象的公钥对刚才加密的结果解密，并以 16 进制输出数据：

Set rand = CreateObject("netbox.random")
Set rsa = CreateObject("netbox.rsa")
Set rsa1 = CreateObject("netbox.rsa")
rsa.GenerateKey
a = rand(50)
Shell.Console.WriteLine NetBox.Encoding.base64Encode(a)
b = rsa.Encrypt(a)
rsa1.PublicKey = rsa.PublicKey
c = rsa1.Decrypt(b)
Shell.Console.WriteLine NetBox.Encoding.base64Encode(a)


RSA.IsPrivateKey 属性

IsPrivateKey 属性

查询当前的 RSA 对象所包含的密钥是是否是私钥

语法

rsa.IsPrivateKey

参数

rsa
实例化的 NetBox.RSA 对象

应用于

RSA 对象


RSA.Key 属性

Key 属性

读取当前对象中包含的密钥，根据不同对象返回公钥或私钥

语法

rsa.Key

参数

rsa
实例化的 NetBox.RSA 对象

应用于

RSA 对象


RSA.KeySize 属性

KeySize 属性

查询当前对象的密钥尺寸

语法

rsa.KeySize

参数

rsa
实例化的 NetBox.RSA 对象

应用于

RSA 对象


RSA.Padding 属性

Padding 属性

查询和设定当前填充模式，确省为 1

语法

rsa.Padding[ = padding]

参数

rsa
实例化的 NetBox.RSA 对象

padding
给定要设置的填充模式

注释

padding 的数值含义如下：

1: RSA_PKCS1_PADDING
2: RSA_SSLV23_PADDING
3: RSA_NO_PADDING
4: RSA_PKCS1_OAEP_PADDING

应用于

RSA 对象


RSA.PrivateKey 属性

PrivateKey 属性

读取或设定当前对象中包含的私钥

语法

rsa.PrivateKey = privKey

参数

rsa
实例化的 NetBox.RSA 对象

privKey
给定要设定的私钥

应用于

RSA 对象


RSA.PublicKey 属性

PublicKey 属性

读取或设定当前对象中包含的公钥

语法

rsa.PublicKey = pubKey

参数

rsa
实例化的 NetBox.RSA 对象

pubKey
给定要设定的公钥

应用于

RSA 对象


RSA.Decrypt 方法

Decrypt 方法

使用对象内的公钥或者私钥解密数据

语法

rsa.Decrypt(varData)

参数

rsa
实例化的 NetBox.RSA 对象

varData
给定要解密的数据

应用于

RSA 对象


RSA.Encrypt 方法

Encrypt 方法

使用对象内的公钥或者私钥加密数据

语法

rsa.Encrypt(varData)

参数

rsa
实例化的 NetBox.RSA 对象

varData
给定要加密的数据

应用于

RSA 对象


RSA.GenerateKey 方法

GenerateKey 方法

创建一个密钥

语法

rsa.GenerateKey([varKeySize])

参数

rsa
实例化的 NetBox.RSA 对象

varKeySize
密钥尺寸，缺省为 512 位

应用于

RSA 对象


脚本对象参考

对象 | 说 明
Script | 支持在程序中创建一个新的脚本运行环境，并可以实现对其的完全控制
ScriptObject | 支持在程序中创建一个脚本部件运行环境，并可以实现对其的完全控制


Script 对象

支持在程序中创建一个新的脚本运行环境，并可以实现对其的完全控制

语法

Set Script = CreateObject("NetBox.Script")

属性

EnableDebug | 调试模式，为 true 表示当运行的代码出现运行错误时将自动激活系统中的调试环境，为 false 则直接返回，缺省为 false
Language | 脚本语言，可以是 VBScript，Javascript，JScript 等，缺省为 VBScript
Source | 只写属性，装载给定的代码到 Script 对象
StepDebug | 单步跟踪模式，为 true 表示当运行的代码运行时进入单步跟踪，缺省为 false
Transaction | 设定 Script 对象中的脚本是否允许事务

方法

AddNameItem | 为 Script 对象设定内建对象
Close | 关闭 Script 对象
GetLastError | 取得 Script 对象的最后运行时间错误
Load | 将给定的程序文件装载进 Script 对象
Run | 运行已经装载在 Script 对象里的代码，并返回运行状态
SetGlobalObjects | 复制当前运行环境中的内建对象到 Script 对象中

事件

OnScriptEnd | 脚本结束触发事件
OnScriptError | 运行错误触发事件

注释

使用 Script 可以在程序中创建属于自己的脚本运行环境，并可以自主设定运行环境，根据需求执行内存的代码或者从系统中装载程序执行。

示例

下面的程序初始化一个 Script 对象，复制当前的内建对象到新的运行环境中，并执行 cmd.box 程序。

Set Script = CreateObject("NetBox.Script")
Script.Load "cmd.Box"
Script.SetGlobalObjects
Script.Run


Script.EnableDebug 属性

EnableDebug 属性

调试模式，为 true 表示当运行的代码出现运行错误时将自动激活系统中的调试环境，为 false 则直接返回，缺省为 false

语法

Script.EnableDebug[ = boolDebug]

参数

Script
一个实例化的 Script 对象

boolDebug
true 或 false，指定需要设定的调试模式

注释

设定 Script 对象的调试模式将影响 Script.Source 和 Script.Load 的运行方式，所以对 Script.EnableDebug 的设定只在 Script.Source 和 Script.Load 之前有效，同时如果 Script.Load 进来的程序中指定了调试模式，将以指定的调试模式运行。

注：对 Script.EnableDebug 的设定不能捕获语法错误，对于代码的语法错误可以使用 Script.GetLastError 进行查询

示例

下面的例子创建一个新的 Script 对象，允许错误调试并装载一段代码运行，因为我给定了一段错误的代码，这段程序将激活系统的调试环境。

Set Script = CreateObject("NetBox.Script")
Script.EnableDebug = true
Script.Source = "a = ""abcd"" + 200"
Script.Run

应用于

Script 对象 | ScriptObject 对象


Script.Language 属性

Language 属性

脚本语言，可以是 VBScript，Javascript，JScript 等，缺省为 VBScript

语法

Script.Language[ = strLang]

参数

Script
一个实例化的 Script 对象

strLang
给定的需要设定的语言

注释

设定 Script 对象的语言将影响 Script.Source 和 Script.Load 的缺省语言，所以对 Script.Language 的设定只在 Script.Source 和 Script.Load 之前有效，同时如果 Script.Load 进来的程序中指定了语言，将以指定的语言为实际运行语言。

示例

下面的例子创建一个新的 Script 对象，将缺省语言设定为 JScript 并装载一段 Javascript 代码运行。呵呵，其实运行的代码跟前面 VBScript 的例子只相差一个 ";" 而已，不过它告诉你这样是可以的。

Set Script = CreateObject("NetBox.Script")
Script.Language = "JScript"
Script.Source = "a = 100 + 200;"
Script.Run

应用于

Script 对象 | ScriptObject 对象


Script.Source 属性

Source 属性

只写属性，装载给定的代码到 Script 对象

语法

Script.Source = strSource

参数

Script
一个实例化的 Script 对象

strSource
给定的代码字符串

注释

装载一段代码到 Script 对象将清除以前装载的任何代码和内建对象。装载代码的语言和调试模式由 Language 和 EnableDebug 两个属性的内容决定。

示例

下面的代码创建一个新的运行环境，并执行一段运算代码，因为未给新环境设定内建输入输出对象，所以这段代码不会有运行结果显示。关于内建对象的用法请参照 Script.AddNameItem 方法

Set Script = CreateObject("NetBox.Script")
Script.Source = "a = 100 + 200"
Script.Run

应用于

Script 对象 | ScriptObject 对象


Script.StepDebug 属性

StepDebug 属性

单步跟踪模式，为 true 表示当运行的代码运行时进入单步跟踪，缺省为 false

语法

Script.StepDebug[ = boolStep]

参数

Script
一个实例化的 Script 对象

boolStep
true 或 false，指定需要设定的单步跟踪模式

注释

设定 Script 对象的调试模式将影响 Script.Source 和 Script.Load 的运行方式，所以对 Script.StepDebug 的设定只在 Script.Source 和 Script.Load 之前有效，同时如果 Script.Load 进来的程序中指定了调试模式，将以指定的调试模式运行。

应用于

Script 对象


Script.Transaction 属性

Transaction 属性

设定 Script 对象中的脚本是否允许事务

语法

Script.Transaction[ = trans]

参数

Script
一个实例化的 Script 对象

trans
数字，指定事务支持方式

注释

通过设定不同的 Transaction 的值，可以指定脚本以不同的规则建立事务，可以是下面的值：

3: Required | 总是初始化一个新的事务
2: Requires_New | 如果存在事务，则加入，否则创建一个新的事务
1: Supported | 如果存在事务，则加入，否则不支持事务
0: Not_Supported | 不支持事务

设定 Script 对象的事务模式将影响 Script.Run 的方式，所以对 Script.Transaction 的设定只在 Script.Run 之前有效。同时，Script.Transaction 还受到脚本本身对事务规则的指定影响，参见 #transaction 或 @TRANSACTION。

应用于

Script 对象


Script.AddNameItem 方法

AddNameItem 方法

为 Script 对象设定内建对象

语法

Script.AddNameItem(strName, object)

参数

Script
一个实例化的 Script 对象

strName
给定的内建对象的访问名称

object
需要添加为内建对象的实例

注释

通过使用 Script.AddNameItem， 可以将任何对象设定为 Script 对象内建对象，同时因为使用 Script.Source 和 Script.Load 将清除以前装载的任何代码和内建对象，所以必须在 Script.Source 和 Script.Load 之后调用 Script.AddNameItem 添加内建对象。

示例

下面的例子创建一个 Script 对象，装载 Sub.Box，将自己 Shell.Console 对象以 "MyConsole" 为名称设定为它的内建对象，然后执行：

Set Script = CreateObject("NetBox.Script")
Script.Load "Sub.Box"
Script.AddNameItem "MyConsole", Shell.Console

Sub.Box 的代码如下：

MyConsole.WriteLine "Sub.Box: I'am here!!!"

程序运行将在控制台显示一段文字：

Sub.Box: I'am here!!!

应用于

Script 对象 | ScriptObject 对象


Script.Close 方法

Close 方法

关闭 Script 对象

语法

Script.Close

参数

Script
一个实例化的 Script 对象

注释

Script.Close 操作将清除 Script 对象中的代码和内建对象，恢复缺省的调试模式，但保留上次的脚本语言设定。

应用于

Script 对象 | ScriptObject 对象


Script.GetLastError 方法

GetLastError 方法

取得 Script 对象的最后运行时间错误

语法

screrr = Script.GetLastError

参数

ScriptError
返回 Script 对象的错误信息对象

Script
一个实例化的 Script 对象

注释

使用 Script.GetLastError 可以取得 Script 对象最后的错误信息，包括语法错误、运行错误等。返回信息存放在一个 ScriptError 对象中。

示例

下面的代码执行 err.box，如果执行过程中出现错误，则输出错误结果：

Set Script = CreateObject("NetBox.Script")
e = Script.Load("Err.box")
If e = 0 Then
    Script.SetGlobalObjects

    e = Script.Run
End If

If e = 404 Then
    Shell.Console.WriteLine "Bad Command"
ElseIf e <> 0 Then
    Set error = Script.GetLastError
    Shell.Console.WriteLine error.Category
    Shell.Console.WriteLine "Error Number: " & Hex(error.Number)
    Shell.Console.WriteLine "File: " & error.File
    Shell.Console.WriteLine "Line: " & error.Line
    Shell.Console.WriteLine error.Description & vbCRLF
    Set error = Nothing
End If

Set Script = nothing

err.box 的代码如下：

a = "asd" + 100

Sub OnScriptError
    Shell.Console.WriteLine "OnScriptError"
End Sub

Sub OnScriptEnd
    Shell.Console.WriteLine "OnScriptEnd"
End Sub

运行结果在控制台输出下面的信息：

OnScriptError
Microsoft VBScript runtime error
Error Number: 800A000D
File: \err.box
Line: 1
Type mismatch: '[string: "asd"]'

应用于

Script 对象 | ScriptObject 对象


Script.Load 方法

Load 方法

将给定的程序文件装载进 Script 对象

语法

ret = Script.Load(strFile)

参数

ret
调用返回结果，成功返回 0，文件不存在则返回 404，否则返回 500

Script
一个实例化的 Script 对象

strFile
给定的程序文件名称，参见 NetBox 的路径系统

注释

装载一段代码到 Script 对象将清除以前装载的任何代码和内建对象。装载代码的缺省语言和缺省调试模式由 Language 和 EnableDebug 两个属性的内容决定，如果程序文件中自行声明了语言和调试模式，则以程序文件中的声明为准。

示例

下面的程序初始化一个 Script，复制当前的内建对象到新的运行环境中，并执行 cmd.box 程序。

Set Script = CreateObject("NetBox.Script")
Script.Load "cmd.Box"
Script.SetGlobalObjects
Script.Run

应用于

Script 对象 | ScriptObject 对象


Script.Run 方法

Run 方法

运行已经装载在 Script 对象里的代码，并返回运行状态

语法

ret = Script.Run

参数

ret
调用返回结果，成功返回 0

Script
一个实例化的 Script 对象

注释

执行 Script 对象已经装载的代码，如果代码中出现错误且 Script.EnableDebug 设定为 true，将自动装载系统设定的调试环境对代码进行调试，同时，无论是否允许错误调试，运行环境都将调用 Script.OnScriptError 事件向用户代码报告错误信息。

示例

下面的程序初始化一个 Script，复制当前的内建对象到新的运行环境中，并执行 cmd.box 程序。

Set Script = CreateObject("NetBox.Script")
Script.Load "cmd.Box"
Script.SetGlobalObjects
Script.Run

应用于

Script 对象 | ScriptObject 对象


Script.SetGlobalObjects 方法

SetGlobalObjects 方法

复制当前运行环境中的内建对象到 Script 对象中

语法

Script.SetGlobalObjects

参数

Script
一个实例化的 Script 对象

注释

通过使用 Script.SetGlobalObjects，可以将当前运行环境中的内建对象全部复制为 Script 对象的同名内建对象，同时因为使用 Script.Source 和 Script.Load 将清除以前装载的任何代码和内建对象，所以必须在 Script.Source 和 Script.Load 之后调用 Script.SetGlobalObjects 复制内建对象。

示例

下面的程序初始化一个 Script，复制当前的内建对象到新的运行环境中，并执行 cmd.box 程序。

Set Script = CreateObject("NetBox.Script")
Script.Load "cmd.Box"
Script.SetGlobalObjects
Script.Run

应用于

Script 对象 | ScriptObject 对象


Script.OnScriptEnd 事件

OnScriptEnd 事件

脚本结束触发事件

语法

Sub OnScriptEnd
...
End Sub

注释

OnScriptEnd 事件为正常结束事件，当脚本运行无任何未捕捉的错误事件，即未触发 OnScriptError 事件，则在运行结束时触发 OnScriptEnd 事件。

对 OnScriptEnd 与程序逻辑无关，无论脚本是正常退出，还是由外部命令退出，只要无运行时间错误，都将触发 OnScriptEnd。

示例

下面的例子将在脚本的开始请求退出，则 Shell.Console.WriteLine ":<" 将不会被执行，但是 OnScriptEnd 却一定会被触发：

Shell.Quit 0

Shell.Console.WriteLine ":<"

Sub OnScriptEnd
    Shell.Console.WriteLine "I'm here!!!"
End Sub

应用于

Script 对象 | ScriptObject 对象


Script.OnScriptError 事件

OnScriptError 事件

运行错误触发事件

语法

Sub OnScriptError
...
End Sub

注释

OnScriptError 是 Script 对象的基本事件。如果一个脚本代码被成功装载，即语法正确，开始运行时出现运行时间错误，而并未被脚本代码自身捕获，则触发 OnScriptError 事件。

因为 OnScriptError 只捕获运行时间错误，所以格式错误与语法错误不在捕获之列。若需要得到脚本的格式错误与语法错误，可以参照 Script.GetLastError。

示例

下面的代码制造了两个错误，由脚本自身捕捉了第一个，而第二个则触发了 OnScriptError 事件。

On Error Resume Next
a = "asd" + 100

On Error Goto 0
Set a = b

Sub OnScriptError
    Shell.Console.WriteLine err.Description
End Sub

代码运行结果为：

Object required: 'b'

从结果可以看出，Set a = b 中的错误事件被成功捕捉。

应用于

Script 对象 | ScriptObject 对象


ScriptObject 对象

支持在程序中创建一个脚本部件运行环境，并可以实现对其的完全控制

语法

Set ScriptObject = CreateObject("NetBox.ScriptObject")

属性

ClassID | 取得 ScriptObject 对象所装载的脚本部件的 ClassID
EnableDebug | 调试模式，为 true 表示当运行的代码出现运行错误时将自动激活系统中的调试环境，为 false 则直接返回，缺省为 false
Language | 脚本语言，可以是 VBScript，Javascript，JScript 等，缺省为 VBScript
Object | 取得 ScriptObject 对象所装载的脚本部件
ProgID | 取得 ScriptObject 对象所装载的脚本部件的 ProgID
Source | 只写属性，装载给定的代码到 Script 对象

方法

AddNameItem | 为 Script 对象设定内建对象
Close | 关闭 Script 对象
GetLastError | 取得 Script 对象的最后运行时间错误
Init | 初始化 ScriptObject 对象所装载的脚本部件
Load | 将给定的程序文件装载进 Script 对象
LoadObject | 装载一个脚本部件，返回经过初始化的脚本部件
Run | 运行已经装载在 Script 对象里的代码，并返回运行状态
SetGlobalObjects | 复制当前运行环境中的内建对象到 Script 对象中

事件

OnScriptEnd | 脚本结束触发事件
OnScriptError | 运行错误触发事件

注释

使用 NetBox.ScriptObject 可以在程序中创建属于自己的脚本部件运行环境，并可以自主设定运行环境，装载一个给定的 .wsc 脚本，并最终得到脚本部件。

NetBox.ScriptObject 的大部分功能继承自 NetBox.Script 对象，所以相关的说明请参考 NetBox.Script 对象。

示例

下面的例子创建一个 ScriptObject 对象并装载 test.wsc 脚本：

Set ScriptObject = CreateObject("NetBox.ScriptObject")
Set Obj = ScriptObject.LoadObject "test.wsc"
Set ScriptObject = nothing


ScriptObject.ClassID 属性

ClassID 属性

取得 ScriptObject 对象所装载的脚本部件的 ClassID

语法

ClassID = ScriptObject.ClassID

参数

ClassID
返回 ScriptObject 对象所装载的脚本部件的 ClassID

ScriptObject
一个实例化的 ScriptObject 对象

注释

使用 ScriptObject.ClassID 可以取得装载进 ScriptObject 的脚本部件的 ClassID，脚本部件的格式参见脚本部件方面的文档。

应用于

ScriptObject 对象


ScriptObject.Object 属性

Object 属性

取得 ScriptObject 对象所装载的脚本部件

语法

Object = ScriptObject.Object

参数

Object
取得 ScriptObject 对象所装载的脚本部件

ScriptObject
一个实例化的 ScriptObject 对象

注释

ScriptObject.Object 所取得的对象是脚本部件本身，不同于 ScriptObject。ScriptObject 是脚本部件的装载、构造对象，使用 ScriptObject.Object 可以对脚本部件提供的方法和属性进行操作，而 ScriptObject 则不能。

应用于

ScriptObject 对象


ScriptObject.ProgID 属性

ProgID 属性

取得 ScriptObject 对象所装载的脚本部件的 ProgID

语法

ProgID = ScriptObject.ProgID

参数

ProgID
返回 ScriptObject 对象所装载的脚本部件的 ProgID

ScriptObject
一个实例化的 ScriptObject 对象

注释

使用 ScriptObject.ProgID 可以取得装载进 ScriptObject 的脚本部件的 ProgID，脚本部件的格式参见脚本部件方面的文档。

应用于

ScriptObject 对象


ScriptObject.Init 方法

Init 方法

初始化 ScriptObject 对象所装载的脚本部件

语法

ret = ScriptObject.Init

参数

ret
返回初始化的返回结果，正常初始化返回 0

ScriptObject
一个实例化的 ScriptObject 对象

注释

ScriptObject.Init 方法对 ScriptObject 对象里面装载的脚本部件进行初始化，复制当前运行环境中的内建对象到 ScriptObject 对象中，执行脚本部件的初始化代码，建立脚本部件的方法和属性。

一般情况下，建议直接使用 ScriptObject.LoadObject 装载一个给定的脚本部件，独立给出 ScriptObject.Init 是为了提供特殊情况下脚本部件的状态，比如在装载后增加内建对象等特殊需求。

示例

下面的代码装载一个脚本部件文件 test.wsc，同时为脚本部件提供一个特殊的内建对象：

Set so = CreateObject("NetBox.ScriptObject")
so.Load "test.wsc"
so.AddNameItem "MyObject", myObj
so.Init
Set obj = so.Object

应用于

ScriptObject 对象


ScriptObject.LoadObject 方法

LoadObject 方法

装载一个脚本部件，返回经过初始化的脚本部件

语法

Set Object = ScriptObject.LoadObject(strFile)

参数

Object
取得 ScriptObject 对象所装载的脚本部件

ScriptObject
一个实例化的 ScriptObject 对象

strFile
给定的程序文件名称

注释

ScriptObject.LoadObject 本身并不是基本方法，而是一组方法的完整封装，其实现等同于下面的代码：

ScriptObject.Load(strFile)
ScriptObject.Init
Set Object = ScriptObject.Object

应用于

ScriptObject 对象


网络对象参考

对象 | 说 明
Http | 使用 HTTP(超级文本传输协议) 传输数据
Smtp | 使用 SMTP(简单邮件发送协议) 发送邮件
Socket | 提供 TCP 的控制与读写操作，同时支持底层的二进制读写和高级的字符流处理


Http 对象

使用 HTTP(超级文本传输协议) 传输数据

语法

Set http = CreateObject("NetBox.Http")

属性

dataAvailable | 返回 Http 请求当前可读取的数据字节数
readyState | 返回请求执行的状态
status | 返回 Http 请求返回的状态码
statusText | 返回 Http 请求返回的状态文本
TotalBytes | 返回 Http 请求返回结果内容的总字节数

方法

abort | 取消 Http 请求
getResponseHeader | 读取 Http 请求返回结果的消息头字段
getAllResponseHeaders | 查询全部返回结果的头字段，结果以换行符 vbCrLf 为分割
open | 初始化一个 NetBox.Http 对象，指定方法，URL 和请求的认证信息
Read | 从 Http 请求中读取指定大小的数据块，结果类型为 VT_ARRAY | VT_UI1
ReadAll | 读取全部返回结果的数据，结果类型为 VT_ARRAY | VT_UI1
send | 发送请求到服务器并接收返回结果
setRequestHeader | 设定 Http 请求头的值
WaitForResponse | 等待服务器返回数据

注释

Http 对象通过标准的 HTTP 协议向服务器出请求，并且返回服务器的响应结果。

示例

下面的例子创建一个 Http 对象，并发出请求，并显示返回的内容：

Set Http = CreateObject("NetBox.Http")
Http.Open "GET", "http://www.zydsoft.com/", False
Http.Send
Shell.Console.Write NetBox.Encoding.BinToStr(Http.ReadAll)


Http.dataAvailable 属性

dataAvailable 属性

返回 Http 请求当前可读取的数据字节数

语法

dataAvailable = Http.dataAvailable

参数

dataAvailable
返回 Http 请求当前可读取的数据字节数

Http
一个实例化的 Http 对象

应用于

Http 对象


Http.readyState 属性

readyState 属性

返回请求执行的状态

语法

rs = Http.readyState

参数

rs
返回 Http 对象的状态

Http
一个实例化的 Http 对象

注释

此属性为只读属性，用于查询 Http 对象当前状态，状态的说明如下：

0（未初始化） | 对象成功创建，但是未调用 open
1（初始化） | open 方法调用成功，但是尚未发送至服务器
2（请求发送成功） | send 方法调用成功，请求已经成功发送至服务器
3（数据下载中） | 服务器已经返回信息，并且开始下载数据
4（请求结束） | 服务器数据下载成功，或者网络连接中断请求出错

应用于

Http 对象


Http.status 属性

status 属性

返回 Http 请求返回的状态码

语法

status = Http.status

参数

status
返回 Http 请求返回的状态码

Http
一个实例化的 Http 对象

应用于

Http 对象


Http.statusText 属性

statusText 属性

返回 Http 请求返回的状态文本

语法

statusText = Http.statusText

参数

statusText
返回 Http 请求返回的状态文本

Http
一个实例化的 Http 对象

应用于

Http 对象


Http.TotalBytes 属性

TotalBytes 属性

返回 Http 请求返回结果内容的总字节数

语法

TotalBytes = Http.TotalBytes

参数

TotalBytes
返回 Http 请求返回结果内容的总字节数

Http
一个实例化的 Http 对象

注释

TotalBytes 返回 Http 请求返回结果中 Content-Length 字段的内容，为服务器声明的数据字节数，请求当前可以读取的数据的尺寸可以从 dataAvailable 属性读取。

应用于

Http 对象


Http.abort 方法

abort 方法

取消 Http 请求

语法

Http.abort

参数

Http
一个实例化的 Http 对象

注释

此操作将取消当前的 Http 请求，恢复对象状态到初始状态。

应用于

Http 对象


Http.getResponseHeader 方法

getResponseHeader 方法

读取 Http 请求返回结果的消息头字段

语法

strValue = Http.getResponseHeader(strName)

参数

strValue
返回查询的结果

Http
一个实例化的 Http 对象

strName
要查询的字段名称

应用于

Http 对象


Http.getAllResponseHeaders 方法

getAllResponseHeaders 方法

查询全部返回结果的头字段，结果以换行符 vbCrLf 为分割

语法

strValue = Http.getAllResponseHeaders

参数

strValue
返回查询的结果

Http
一个实例化的 Http 对象

应用于

Http 对象


Http.open 方法

open 方法

初始化一个 NetBox.Http 对象，指定方法，URL 和请求的认证信息

语法

Http.open(strMethod, strUrl[, varAsync, varUser, varPassword])

参数

Http
一个实例化的 Http 对象

strMethod
打开连接的 HTTP 方法，可以是 GET，POST，PUT 或 PROPFIND 等

strUrl
请求的 URL，必须为绝对地址，比如："http://www.zydsoft.com/"

varAsync
确定此次请求是否为异步请求，如果为 True，则 Send 方法立即返回，缺省为 True

varUser
用于用户认证的用户名

varPassword
用于用户认证的口令

注释

调用此方法将清除以前对象中的全部数据，并按照调用的参数初始化一个新的对象。open 一个请求以后，可以使用 send 方法将此次请求发送至服务器。

示例

下面的例子创建一个 Http 对象，然后使用 open 方法同步打开一个页面，并发出请求，并显示返回的内容：

Set Http = CreateObject("NetBox.Http")
Http.Open "GET", "http://www.zydsoft.com/"
Http.Send
Shell.Console.Write NetBox.Encoding.BinToStr(Http.ReadAll)

应用于

Http 对象


Http.Read 方法

Read 方法

从 Http 请求中读取指定大小的数据块，结果类型为 VT_ARRAY | VT_UI1

语法

variant = Http.Read([nReadSize])

参数

variant
读取的二进制数据块，数据类型为 VT_ARRAY | VT_UI1

Http
一个实例化的 Http 对象

nReadSize
要读取的数据块字节数，如果当前可读数据不足，则返回可读数据，缺省为读取全部可读数据

注释

Read 方法读取 Http 请求中的可读数据，如果请求对象中无数据可读，则调用返回一个长度为零的二进制数据块。

Read 方法与 open 方法指定的方式无关，无论同步或者异步，是否有足够可读数据，调用都将立即返回。如果需要等待有效数据，可以调用 WaitForResponse 方法。

应用于

Http 对象


Http.ReadAll 方法

ReadAll 方法

读取全部返回结果的数据，结果类型为 VT_ARRAY | VT_UI1

语法

variant = Http.ReadAll()

参数

variant
读取的二进制数据块，数据类型为 VT_ARRAY | VT_UI1

Http
一个实例化的 Http 对象

注释

ReadAll 将读取全部返回的数据，此方法与 open 方法指定的方式无关，无论同步或者异步，调用都将等待全部数据下载完毕后才返回。

应用于

Http 对象


Http.send 方法

send 方法

发送请求到服务器并接收返回结果

语法

Http.send([varBody])

参数

Http
一个实例化的 Http 对象

varBody
Http 请求的消息内容，通常为 Form 的内容

注释

此方法可以是同步和异步两种方式，由 open 方法的 varAsync 参数决定。如果调用 open 方法的时候 varAsync 为 False，则此方法将等待请求成功发出后才返回，而如果 varAsync 为 True，则调用立即返回。

此方法有一个参数，指定 Http 请求的消息内容，可以是字符串和二进制。此参数将自动设定 Http 请求中的 Content-Length 字段，而并不设定 Content-Type 的内容，如果需要指定 Content-Type 的内容，需要使用 SetHeader 方法自行设定以向服务器声明消息内容的数据格式。

应用于

Http 对象


Http.setRequestHeader 方法

setRequestHeader 方法

设定 Http 请求头的值

语法

Http.setRequestHeader(strName, strValue)

参数

Http
一个实例化的 Http 对象

strName
Http 请求头字段名称

strValue
Http 请求头字段内容

应用于

Http 对象


Http.WaitForResponse 方法

WaitForResponse 方法

等待服务器返回数据

语法

bRet = Http.WaitForResponse([varTimeout])

参数

bRet
返回等待结果，成功则为 True

Http
一个实例化的 Http 对象

varTimeout
等待的超时时间，以毫秒为单位，缺省为不超时

注释

WaitForResponse 将进入等待直至超出超时时间或者 Http 对象中有数据可读。

应用于

Http 对象


Smtp 对象

使用 SMTP(简单邮件发送协议) 发送邮件

语法

Set smtp = CreateObject("NetBox.Smtp")

方法

BeginData | 开始发送邮件的内容
Close | 关闭当前 SMTP 连接。对象退出时将自动关闭连接
Connect | 使用 Smtp 对象连接到 strAddr:port
EndData | 中止发送邮件的内容
Hello | 声明 SMTP 会话的本机信息
mailFrom | 声明发送邮件的信箱
rcptTo | 指定发送邮件的目标信箱
Reset | 复位 smtp 会话
sendData | 发送邮件的内容
sendMail | 发送一封邮件
SSLConnect | 使用 Smtp 对象连接到 strAddr:port，并建立 SSL 安全连接
WriteData | 发送邮件的内容

注释

Smtp 对象通过标准的 SMTP 协议向服务器发送 Internet 邮件

示例

下面的代码创建一个 NetBox.Smtp 对象，连接到 SMTP 服务器 MySmtp.com 上，并发送一封邮件到 test@MyMail.com。

Set Smtp = CreateObject("NetBox.Smtp")
Smtp.Connect "MySmtp.com", 25
Smtp.Hello "MyHost"
Smtp.sendMail "me@MyMail.com", "test@MyMail.com", "Subject: title" & vbCrlf & vbCrlf & "body"


Smtp.BeginData 方法

BeginData 方法

开始发送邮件的内容

语法

ret = Smtp.BeginData

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

应用于

Smtp 对象


Smtp.Close 方法

Close 方法

关闭当前 SMTP 连接。对象退出时将自动关闭连接

语法

Smtp.Close

参数

Smtp
实例化的 Smtp 对象

注释

Close 方法将关闭现有的 smtp 连接。也可以简单的销毁对象来关闭连接。

应用于

Smtp 对象


Smtp.Connect 方法

Connect 方法

使用 Smtp 对象连接到 strAddr:port

语法

ret = Smtp.Connect(strAddr, port)

参数

ret
返回连接结果，连接成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strAddr
字符串，目标机器名或以点分方式表示的目标 IP 地址

port
目标端口，标准 SMTP 端口为 25

注释

在本机和目标地址、端口之间建立 TCP 连接，并等待服务器应答，如果连接成功，则返回 0。

应用于

Smtp 对象


Smtp.EndData 方法

EndData 方法

中止发送邮件的内容

语法

ret = Smtp.EndData

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

应用于

Smtp 对象


Smtp.Hello 方法

Hello 方法

声明 SMTP 会话的本机信息

语法

ret = Smtp.Hello(strHost)

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strHost
字符串，给定的主机名称

应用于

Smtp 对象


Smtp.mailFrom 方法

mailFrom 方法

声明发送邮件的信箱

语法

ret = Smtp.mailFrom(strMail)

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strMail
字符串，给定的信箱

应用于

Smtp 对象


Smtp.rcptTo 方法

rcptTo 方法

指定发送邮件的目标信箱

语法

ret = Smtp.rcptTo(strMail)

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strMail
字符串，给定的信箱

应用于

Smtp 对象


Smtp.Reset 方法

Reset 方法

复位 smtp 会话

语法

ret = Smtp.Reset

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

应用于

Smtp 对象


Smtp.sendData 方法

sendData 方法

发送邮件的内容

语法

ret = Smtp.sendData(strData)

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strData
字符串，给定的邮件的内容

注释

sendData 方法是一组基本方法的组合，其行为等同于下面的代码：

Smtp.BeginData
Smtp.WriteData strData
Smtp.EndData

应用于

Smtp 对象


Smtp.sendMail 方法

sendMail 方法

发送一封邮件

语法

ret = Smtp.sendMail(strFrom, strTo, strData)

参数

ret
返回结果，成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strFrom
字符串，给定的发送邮件的信箱

strTo
字符串，给定的发送邮件的目标信箱

strData
字符串，给定的发送邮件的内容

注释

sendMail 方法是一组基本方法的组合，其行为等同于下面的代码：

Smtp.MailFrom strFrom
Smtp.rcptTo strTo
Smtp.sendData strData
Smtp.Reset

应用于

Smtp 对象


Smtp.SSLConnect 方法

SSLConnect 方法

使用 Smtp 对象连接到 strAddr:port，并建立 SSL 安全连接

语法

ret = Smtp.SSLConnect(strAddr, port)

参数

ret
返回连接结果，连接成功返回 0

Smtp
一个实例化的 NetBox.Smtp 对象

strAddr
字符串，目标机器名或以点分方式表示的目标 IP 地址

port
目标端口，标准 SMTP 端口为 25

注释

在本机和目标地址、端口之间建立 TCP 连接，建立 SSL 安全通道，并等待服务器应答，如果连接成功，则返回 0。

应用于

Smtp 对象


Smtp.WriteData 方法

WriteData 方法

发送邮件的内容

语法

Smtp.sendData(strData)

参数

Smtp
一个实例化的 NetBox.Smtp 对象

应用于

Smtp 对象


Socket.dataAvailable 属性

dataAvailable 属性

返回 Socket 对象中当前可以读取的数据尺寸

语法

dataAvailable = socket.dataAvailable

参数

dataAvailable
返回 Socket 请求当前可读取的数据字节数

socket
一个实例化的 Socket 对象

应用于

Socket 对象


Socket.Echo 属性

Echo 属性

指定是否回送所有的输入数据，缺省为 false

语法

Socket.Echo = flag

参数

Socket
一个实例化的 NetBox.Socket 对象

flag
指定是否回送数据，为 true 则回送

注释

初始状态的 Socket 对象是不回送数据的，通过设定 Socket.Echo 为 true，可以方便地建立简单回显的 Telnet 服务。

应用于

Socket 对象


Socket.Eof 属性

Eof 属性

查询当前 Socket 对象是否仍有数据可以读取

语法

eof = Socket.Eof

参数

eof
返回 Socket 对象是否仍然可读

Socket
一个实例化的 NetBox.Socket 对象

注释

Socket.Eof 用于查询 Socket 对象是否仍然可读，如果 Socket 对象未建立连接或者连接已经关闭，则返回 true。

应用于

Socket 对象


Socket.Handle 属性

Handle 属性

返回 Socket 对象的 socket 句柄

语法

handle = socket.Handle

参数

handle
返回 Socket 对象的底层句柄

socket
一个实例化的 Socket 对象

应用于

Socket 对象


Socket.LocalAddress 属性

LocalAddress 属性

返回 Socket 对象本地 IP 地址

语法

LocalAddress = Socket.LocalAddress

参数

LocalAddress
返回 Socket 对象本地 IP 地址

Socket
一个实例化的 NetBox.Socket 对象

注释

Socket.LocalAddress 返回 Socket 对象的本地地址，返回类型为 BSTR，以点分方式返回本地地址的 IP 值。

应用于

Socket 对象


Socket.LocalPort 属性

LocalPort 属性

返回 Socket 对象的本地端口

语法

LocalPort = Socket.LocalPort

参数

LocalPort
返回 Socket 对象的本地端口

Socket
一个实例化的 NetBox.Socket 对象

注释

Socket.LocalPort 返回 Socket 对象的本地端口值。

应用于

Socket 对象


Socket.RemoteAddress 属性

RemoteAddress 属性

返回 Socket 对象远端 IP 地址

语法

RemoteAddress = Socket.RemoteAddress

参数

RemoteAddress
返回 Socket 对象远端 IP 地址

Socket
一个实例化的 NetBox.Socket 对象

注释

无论 Socket 对象是连接到指定的远端地址，还是接受远端的连接请求，Socket.RemoteAddress 属性都将返回远端的 IP 地址，返回类型为 BSTR，以点分方式表达。

应用于

Socket 对象


Socket.RemotePort 属性

RemotePort 属性

返回 Socket 对象的远端端口

语法

RemotePort = Socket.RemotePort

参数

RemotePort
返回 Socket 对象的远端端口

Socket
一个实例化的 NetBox.Socket 对象

注释

无论 Socket 对象是连接到指定的远端地址，还是接受远端的连接请求，Socket.RemotePort 属性都将返回远端的端口值。

应用于

Socket 对象


Socket.Timeout 属性

Timeout 属性

设定 Socket 对象的读写超时时间

语法

Socket.Timeout = tmout

参数

Socket
一个实例化的 NetBox.Socket 对象

tmout
给定的超时时间，以毫秒为单位

注释

通过设定 Socket 对象的超时时间，可以防止死读事件的发生，当读或写操作时间超过给定的超时时间，将返回错误。

应用于

Socket 对象


Socket.Accept 方法

Accept 方法

从已经建立 TCP 侦听的 Socket 对象接受一个新的 TCP 连接

语法

Set newSocket = Socket.Accept

参数

newSocket
返回新 TCP 连接的 Socket 对象

Socket
一个实例化的 NetBox.Socket 对象

注释

Socket.Accept 只可对 Socket.Listen 成功的 Socket 对象使用，否则返回结果将为空。

示例

下面的例子创建一个 NetBox.Socket 对象，在 23(telnet) 端口建立侦听，接受一个请求并输出一个字符串，然后退出。

Set Socket = CreateObject("NetBox.Socket")
Socket.Listen "", 23

Set Socket1 = Socket.Accept

Socket1.WriteLine "Hello! I'm here!!!!"

应用于

Socket 对象


Socket.BinaryRead 方法

BinaryRead 方法

从 TCP 连接中读取指定大小的数据块，结果类型为 VT_ARRAY | VT_UI1

语法

variant = Socket.BinaryRead(nReadSize)

参数

variant
从 TCP 连接读取的二进制数据块，数据类型为 VT_ARRAY | VT_UI1

Socket
一个实例化的 NetBox.Socket 对象

nReadSize
要读取的数据块字节数，如果未读取足够数据时 TCP 连接中断，则返回实际数据

注释

Socket.BinaryRead 可以在 TCP 连接上进行二进制数据的读操作，可用于处理一些非字符协议的数据。

示例

下面的代码创建一个 NetBox.Socket 对象，连接到 www.zydsoft.com 的 WEB 端口，发出一个请求后用 Socket.BinaryRead 读取全部返回并使用 NetBox.File 对象保存到 Socket.Log 文件中，为了演示，代码中每次只读取 20 个字节：

Set Socket = CreateObject("NetBox.Socket")

Socket.Connect "zyserver1", 80
Socket.Timeout = 2000

Socket.WriteLine "GET /test.asp HTTP/1.0"
Socket.WriteBlankLines 1

Set file = CreateObject("NetBox.File")
file.Create "Socket.Log"

Do While Not Socket.Eof
    file.Write Socket.BinaryRead(20)
Loop

Socket.Close

程序运行后，可以在 NetBox 运行目录看到一个文件 Socket.Log，其内容为：

: HTTP/1.1 404 File Not Found
: Server: NetBox Version 2.01 Build 2544
: Connection: Close
: Content-Type: text/html
: Date: Wed, 13 Nov 2002 07:05:48 GMT
: Content-Length: 101
:
: <html><head><title>404 File Not Found</title></head>
: <body><h1>404 File Not Found</h1></body></html>

呵呵，跟我们前面一个例子的结果完全相同。

应用于

Socket 对象


Socket.BinaryWrite 方法

BinaryWrite 方法

将给定的二进制数据块写入到 TCP 连接中

语法

Socket.BinaryWrite variant

参数

Socket
一个实例化的 NetBox.Socket 对象

variant
给定的二进制数据块，数据类型为 VT_ARRAY | VT_UI1

注释

Socket.BinaryWrite 可以在 TCP 连接上进行二进制数据的写操作，可用于处理一些非字符协议的数据。

应用于

Socket 对象


Socket.Close 方法

Close 方法

关闭当前的连接

语法

Socket.Close

参数

Socket
一个实例化的 NetBox.Socket 对象

注释

关闭当前连接将中断本机与远端机器的 TCP 连接，并将 Socket 对象初始化到初始状态。

应用于

Socket 对象


Socket.Connect 方法

Connect 方法

使用 Socket 对象连接到 strAddr:port

语法

ret = Socket.Connect(strAddr, port)

参数

ret
返回连接结果，连接成功返回 0

Socket
一个实例化的 NetBox.Socket 对象

strAddr
字符串，目标机器名或以点分方式表示的目标 IP 地址

port
目标端口

注释

在本机和目标地址、端口之间建立一个 TCP 连接，如果连接成功，则返回 0。

示例

下面的代码创建一个 NetBox.Socket 对象并连接到 www.zydsoft.com 的 WEB 端口：

Set Socket = CreateObject("NetBox.Socket")
Socket.Connect "www.zydsoft.com", 80
...

应用于

Socket 对象


Socket.Listen 方法

Listen 方法

使用 Socket 对象在指定的地址、端口上面建立侦听端口

语法

ret = Socket.Listen(strAddr, port)

参数

ret
返回结果，侦听建立成功返回 0

Socket
一个实例化的 NetBox.Socket 对象

strAddr
字符串，要侦听的机器名或以点分方式表示的 IP 地址

port
侦听端口，为 0 则将随机指定一个端口，可使用 LocalPort 查询此端口

注释

Socket.Listen 将在指定的地址、端口建立 TCP 侦听，如果需要在所有本地地址都建立侦听，则 strAddr 为空字符串即可。

示例

下面的例子创建一个 NetBox.Socket 对象，在 23(telnet) 端口建立侦听，接受一个请求并输出一个字符串，然后退出。

Set Socket = CreateObject("NetBox.Socket")
Socket.Listen "", 23

Set Socket1 = Socket.Accept

Socket1.WriteLine "Hello! I'm here!!!!"

应用于

Socket 对象


Socket.ReadLine 方法

ReadLine 方法

从 TCP 连接中读取一行文本，不包含回车

语法

strText = Socket.ReadLine

参数

strText
返回 TCP 连接对方传递的一行字符串，不包含回车

Socket
一个实例化的 NetBox.Socket 对象

注释

读取的字符串以回车作为结束标志，返回字符串中不包含回车字符。

示例

下面的代码创建一个 NetBox.Socket 对象，连接到 www.zydsoft.com 的 WEB 端口，发出一个请求后返回结果：

Set Socket = CreateObject("NetBox.Socket")
Socket.Connect "www.zydsoft.com", 80
Socket.Timeout = 2000

Socket.WriteLine "GET /test.asp HTTP/1.0"
Socket.WriteBlankLines 1

Do While Not Socket.Eof
    Shell.Console.WriteLine ": " & Socket.ReadLine
Loop

Socket.Close

这个代码的运行结果是：

: HTTP/1.1 404 File Not Found
: Server: NetBox Version 2.01 Build 2544
: Connection: Close
: Content-Type: text/html
: Date: Wed, 13 Nov 2002 07:05:48 GMT
: Content-Length: 101
:
: <html><head><title>404 File Not Found</title></head>
: <body><h1>404 File Not Found</h1></body></html>

哈，根本就没有这么个文件嘛，当然 404 了。

应用于

Socket 对象


Socket.ReadPassword 方法

ReadPassword 方法

从 TCP 连接输入一行字符串，无论 Socket.Echo 设定如何均不回送输入的字符

语法

strPass = Socket.ReadPassword

参数

strPass
返回用户输入的口令字符串

Socket
一个实例化的 NetBox.Socket 对象

注释

使用 Socket.ReadPassword 将要求用户输入字符串，出于对用户输入的保护，全部输入过程将不回送到 TCP 连接。

示例

下面的例子显示提示要求用户输入口令，然后将用户输入的口令再回送显示在 TCP 连接的那边(哈，这个例子我们见过哎)。

Socket.Write "Please input password:"
strPass = Socket.ReadPassword
Socket.WriteLine strPass

应用于

Socket 对象


Socket.Resolve 方法

Resolve 方法

查询给定的主机的 IP 地址

语法

straddr = socket.Resolve(strhost)

参数

straddr
字符串，返回查询出的 IP 地址

socket
一个实例化的 Socket 对象

strhost
给定的需要查询的主机名称

注释

此方法将向 DNS 查询主机的 IP 地址，如果不能成功查询，则返回一个空字符串。

应用于

Socket 对象


Socket.SSLAccept 方法

SSLAccept 方法

在已经建立的 TCP 连接上面接受一个新的已经建立了 SSL 通道的 Socket 对象

语法

Set newSSLSocket = Socket.SSLAccept

参数

newSSLSocket
返回新成功建立 SSL 通道的 Socket 对象

Socket
一个实例化的 NetBox.Socket 对象

注释

Socket.SSLAccept 只可对 Socket.Listen 成功的 Socket 对象使用，否则返回结果将为空。如果接受到一个 TCP 连接，而不能正常与对方建立 SSL 通道，则此连接将被抛弃，而 Socket.SSLAccept 继续等待下一个连接请求。

作为 SSL 通道连接的接受者，Socket.SSLAccept 必须提供证书与私钥，具体的装载方法参见 Shell.LoadPrivateKey。

示例

下面的例子创建一个 NetBox.Socket 对象，在 443(telnet) 端口建立侦听，接受一个请求并输出一个字符串，然后退出。

Shell.LoadPrivateKey "test.key", "test.crt"

Set Socket = CreateObject("NetBox.Socket")
Socket.Listen "", 443

Set Socket1 = Socket.SSLAccept

Socket1.WriteLine "Hello! I'm here!!!!"

应用于

Socket 对象


Socket.SSLConnect 方法

SSLConnect 方法

在已经建立的 TCP 连接上面建立 SSL 通道

语法

ret = Socket.SSLConnect

参数

ret
返回结果，SSL 通道建立成功返回 0

Socket
一个实例化的 NetBox.Socket 对象

注释

在调用 Socket.SSLConnect 之前，Socket 对象必须已经建立连接，且连接对方准备接受 SSL 连接，否则将返回错误。

缺省状态建立 SSL 连接时客户端不提供证书，如果需要提供客户证书和私钥，可是在建立 SSL 连接前使用 Shell.LoadPrivateKey 装载证书和私钥。

示例

下面的代码是连接一个 SSL 网站的过程：

Set Socket = CreateObject("NetBox.Socket")
Socket.Connect "msdn.microsoft.com", 443
Socket.SSLConnect
...

应用于

Socket 对象


Socket.SSLClose 方法

SSLClose 方法

在 Socket 对象上面关闭 SSL 连接

语法

socket.SSLClose

参数

socket
一个实例化的 Socket 对象

应用于

Socket 对象


Socket.Write 方法

Write 方法

将给定的字符串输出到 TCP 连接

语法

Socket.Write strText

参数

Socket
一个实例化的 NetBox.Socket 对象

strText
要输出的字符串

示例

下面的代码创建一个 NetBox.Socket 对象，连接到 www.zydsoft.com 的 WEB 端口，根据 strFile 中的路径发出一个请求：

Set Socket = CreateObject("NetBox.Socket")
Socket.Connect "www.zydsoft.com", 80
Socket.Timeout = 2000

Socket.Write "GET "
Socket.Write strFile
Socket.WriteLine " HTTP/1.0"
Socket.WriteBlankLines 1
...

应用于

Socket 对象


Socket.WriteBlankLines 方法

WriteBlankLines 方法

输出指定数量的空行到 TCP 连接

语法

Socket.WriteBlankLines nLines

参数

Socket
一个实例化的 NetBox.Socket 对象

nLines
要输出的空行数

示例

下面的代码创建一个 NetBox.Socket 对象，连接到 www.zydsoft.com 的 WEB 端口，发出一个请求：

Set Socket = CreateObject("NetBox.Socket")
Socket.Connect "www.zydsoft.com", 80
Socket.Timeout = 2000

Socket.WriteLine "GET /test.asp HTTP/1.0"
Socket.WriteBlankLines 1
...

应用于

Socket 对象


Socket.WriteLine 方法

WriteLine 方法

将给定的字符串输出到 TCP 连接并换行

语法

Socket.WriteLine strText

参数

Socket
一个实例化的 NetBox.Socket 对象

strText
要输出的字符串

示例

下面的代码创建一个 NetBox.Socket 对象，连接到 www.zydsoft.com 的 WEB 端口，发出一个请求：

Set Socket = CreateObject("NetBox.Socket")
Socket.Connect "www.zydsoft.com", 80
Socket.Timeout = 2000

Socket.WriteLine "GET /test.asp HTTP/1.0"
Socket.WriteBlankLines 1
...

应用于

Socket 对象


数据库对象参考

对象 | 说 明
Database | 提供对 SQLite 数据库的基本操作，用于建立独立与环境的数据库应用
Recordset | 数据库结果集，用于返回、传递 SQLite 数据库结果集


Database 对象

提供对 SQLite 数据库的基本操作，用于建立独立与环境的数据库应用

语法

Set db = CreateObject("NetBox.Database")

属性

CommandTimeout | 指定和查询在终止尝试和产生错误之前执行命令期间需等待的时间，以毫秒为单位，缺省为 5000
Synchronous | 设置和查询当前打开的数据库的同步属性
TotalExecTime | 查询从打开数据库开始实际运算时间
TotalReadBytes | 查询从打开数据库开始实际从文件中读取的数据，以字节为单位
TotalReadTimes | 查询从打开数据库开始实际从文件中进行读操作的次数
TotalWriteBytes | 查询从打开数据库开始实际向文件中写入的数据，以字节为单位
TotalWriteTimes | 查询从打开数据库开始实际向文件中进行写操作的次数

方法

BeginTrans | 开始新事务
Close | 关闭当前打开的数据库文件
CommitTrans | 保存任何更改并结束当前事务
Execute | 执行指定的 SQL 语句，并返回结果
GetTable | 从打开的数据库中获取空记录集用于插入新纪录
Open | 打开指定的数据库文件并指定同步模式
RollbackTrans | 取消当前事务中所作的任何更改并结束事务
Shrink | 紧缩数据库文件，释放文件中的无用空间以缩小文件大小

注释

Database 对象提供了对 SQLite 的简单封装，以便于建立独立与环境的数据库应用。SQLite 的语法与 SQL Server 和 Access 有所不同，详细的说明请参阅 SQLite 网站上的文档。本手册中不再进一步说明。


Database.CommandTimeout 属性

CommandTimeout 属性

指定和查询在终止尝试和产生错误之前执行命令期间需等待的时间，以毫秒为单位，缺省为 5000

语法

timeout = db.CommandTimeout

参数

timeout
返回当前超时时间

db
一个实例化的数据库对象

应用于

Database 对象


Database.Synchronous 属性

Synchronous 属性

设置和查询当前打开的数据库的同步属性

语法

Sync = db.Synchronous

参数

Sync
返回数据库的同步属性

db
一个实例化并打开的数据库对象

注释

数据库同步属性有三种方式：

2，完全同步，数据库系统将在进行写操作以后进入同步等待，以确定操作系统将数据全部写入介质以后才进行下一步操作。以此保证当操作系统崩溃或者出现以外电源故障后数据库文件能够保持数据完整，不被破坏。完全同步模式非常安全，但是因为需要不断等待磁盘操作完成，此模式运算速度也比较慢。

1，正常同步，数据库系统在写操作完成后仍然会进入同步等待，但是并不象完全同步模式那样频繁，此种模式运行时数据库可以保证足够的安全，但是仍然有可能在操作系统崩溃或者出现电源故障时破坏数据库。其运行速度比完全同步模式稍快。

0，不同步，当数据库进行写操作以后，不进行任何等待，直接进入下一步操作。在此种模式下，如果应用本身崩溃，数据库系统将不受影响，而当操作系统崩溃，或者出现电源故障时，如果还存在未写入的数据，数据库文件将可能被破坏。因为此模式不等待磁盘操作完成，所以其运行速度将比完全同步模式和正常同步模式快非常多。

正确选择合适的同步模式非常重要，也需要比较多的相关知识来做出合适的选择。通常如果能够保证系统不被暴力关机，比如安装了 UPS 系统并且并能够在断电时通知操作系统主动关机，则可以选择不同步的模式，以保证最快的运行速度。而如果数据库操作并不是十分频繁，同时运行的机器是普通的家用系统，则最好建议使用完全同步模式，以防止数据库文件因断电，或者用户粗暴关机而被破坏。

同步模式也可以在数据库系统 使用 Open 打开数据库文件时指定，如果不指定，则缺省为 2，完全同步。

应用于

Database 对象


Database.TotalExecTime 属性

TotalExecTime 属性

查询从打开数据库开始实际运算时间

语法

time = db.TotalExecTime

参数

time
返回运算总时间

db
一个实例化的数据库对象

应用于

Database 对象


Database.TotalReadBytes 属性

TotalReadBytes 属性

查询从打开数据库开始实际从文件中读取的数据，以字节为单位

语法

bytes = db.TotalReadBytes

参数

bytes
返回实际字节数

db
一个实例化的数据库对象

应用于

Database 对象


Database.TotalReadTimes 属性

TotalReadTimes 属性

查询从打开数据库开始实际从文件中进行读操作的次数

语法

times = db.TotalReadTimes

参数

times
返回实际次数

db
一个实例化的数据库对象

应用于

Database 对象


Database.TotalWriteBytes 属性

TotalWriteBytes 属性

查询从打开数据库开始实际向文件中写入的数据，以字节为单位

语法

bytes = db.TotalWriteBytes

参数

bytes
返回实际字节数

db
一个实例化的数据库对象

应用于

Database 对象


Database.TotalWriteTimes 属性

TotalWriteTimes 属性

查询从打开数据库开始实际向文件中进行写操作的次数

语法

times = db.TotalWriteTimes

参数

times
返回实际次数

db
一个实例化的数据库对象

应用于

Database 对象


Database.BeginTrans 方法

BeginTrans 方法

开始新事务

语法

db.BeginTrans

参数

db
一个实例化的数据库对象

应用于

Database 对象


Database.Close 方法

Close 方法

关闭当前打开的数据库文件

语法

db.Close

参数

db
一个实例化的数据库对象

应用于

Database 对象


Database.CommitTrans 方法

CommitTrans 方法

保存任何更改并结束当前事务

语法

db.CommitTrans

参数

db
一个实例化的数据库对象

应用于

Database 对象


Database.Execute 方法

Execute 方法

执行指定的 SQL 语句，并返回结果

语法

Set rs = db.Execute(strCommand[, start, len])

参数

rs
返回包含结果的 Recordset 对象

db
一个实例化的数据库对象

strCommand
指定要执行的 SQL 语句

start
指定运行结果的起始记录，记录号从 0 开始计数

len
指定运行结果实际返回的记录数

注释

在调用此方法时可以指定一个或者多个 SQL 语句给 strCommand 参数，如果是多条语句，则语句之间用分号(;)分割，返回结果也将为多个 Recordset。可以通过查询 NextRecordset 属性来取得下一条语句的执行结果。

通常如果需要返回全部结果集，或者 SQL 并不返回实际数据时，start 和 len 参数可以省略；如果需要返回结果集中的部分数据时，则可以使用 start 指定起始位置， len 指定实际返回的个数。一般在分页显示数据时可以使用此功能。

SQLite 的语法与 SQL Server 和 Access 有所不同，详细的说明请参阅 SQLite 网站上的文档。本手册中不再进一步说明。

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并查询一个记录集，显示结果集的数据：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.Execute("SELECT * FROM docs")

Do While Not rs.EOF
  Shell.Console.WriteLine rs("f1")
  Shell.Console.WriteLine rs("f2")
  Shell.Console.WriteLine rs("f3")
  rs.MoveNext
Loop

应用于

Database 对象


Database.GetTable 方法

GetTable 方法

从打开的数据库中获取空记录集用于插入新纪录

语法

Set rs = db.GetTable(TableName)

参数

rs
返回空的 Recordset 对象用于添加新纪录

db
一个实例化的数据库对象

TableName
要取得的表的名称

注释

当需要向数据库中成批插入记录时可以使用此方法。调用 GetTable，可以取得一个空的记录集，通过调用此 Recordset 的 AddNew 方法可以向记录集中添加空的记录，然后修改此记录各个字段的数据，最后调用 Update 提交数据。

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并获取一个空的记录集，插入数据后提交：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.GetTable("docs")

rs.AddNew
rs("f1") = 100
rs("f2") = 300
rs("f3") = 400
rs.Update

应用于

Database 对象


Database.Open 方法

Open 方法

打开指定的数据库文件并指定同步模式

语法

db.Open path[, Sync]

参数

db
一个实例化的数据库对象

path
数据库文件的路径

Sync
同步模式，缺省为 2，完全同步，关于同步模式的详细描述请参阅 Synchronous 属性

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并查询一个记录集，显示结果集的数据：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.Execute("SELECT * FROM docs")

Do While Not rs.EOF
  Shell.Console.WriteLine rs("f1")
  Shell.Console.WriteLine rs("f2")
  Shell.Console.WriteLine rs("f3")
  rs.MoveNext
Loop

应用于

Database 对象


Database.RollbackTrans 方法

RollbackTrans 方法

取消当前事务中所作的任何更改并结束事务

语法

db.RollbackTrans

参数

db
一个实例化的数据库对象

应用于

Database 对象


Database.Shrink 方法

Shrink 方法

紧缩数据库文件，释放文件中的无用空间以缩小文件大小

语法

db.Shrink

参数

db
一个实例化的数据库对象

应用于

Database 对象


Recordset 对象

数据库结果集，用于返回、传递 SQLite 数据库结果集

语法

Set rs = CreateObject("NetBox.Recordset")

集合

Fields 查询结果集的各字段名称列表

属性

AbsolutePosition | 查询与设置记录集当前记录的绝对序号位置
BOF | 查询记录集当前记录是否位于记录集的第一个记录之前
EOF | 查询记录集当前记录是否位于记录集的最后一个记录之后
ExecTime | 查询得到此结果集使用的运算时间
FirstPosition | 返回结果集在全部返回结果中的起始位置
NextRecordset | 查询下一个结果集
ReadTimes | 查询得到此结果集实际从文件中进行读操作的次数
ReadBytes | 查询得到此结果集实际从文件中读取的数据，以字节为单位
RecordCount | 返回结果集中的记录数
ResultCount | 返回结果集全部结果的记录数
WriteTimes | 查询得到此结果集实际向文件中进行写操作的次数
WriteBytes | 查询得到此结果集实际向文件中写入的数据，以字节为单位

方法

AddNew | 向一个新的记录集中添加一个空的记录
Load | 从指定的数据源装载对象内容
Move | 设置记录集当前记录的绝对序号位置
MoveFirst | 移动结果集当前记录到第一条记录
MoveLast | 移动结果集当前记录到最后一条记录
MoveNext | 移动结果集当前记录到后一条记录
MovePrevious | 移动结果集当前记录到前一条记录
Save | 转储对象中的内容到指定的目标
Update | 提交结果集中新添加的数据到数据库中

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并查询一个记录集，显示结果集的数据：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.Execute("SELECT * FROM docs")

Do While Not rs.EOF
  Shell.Console.WriteLine rs("f1")
  Shell.Console.WriteLine rs("f2")
  Shell.Console.WriteLine rs("f3")
  rs.MoveNext
Loop


Recordset.Fields 集合

Fields 集合

查询结果集的各字段名称列表

语法

Set fields = rs.Fields

参数

fields
返回字段名称列表

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.AbsolutePosition 属性

AbsolutePosition 属性

查询与设置记录集当前记录的绝对序号位置

语法

pos = rs.AbsolutePosition

参数

pos
返回序号位置

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.BOF 属性

BOF 属性

查询记录集当前记录是否位于记录集的第一个记录之前

语法

bBOF = rs.BOF

参数

bBOF
返回是否位于记录集的第一个记录之前

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.EOF 属性

EOF 属性

查询记录集当前记录是否位于记录集的最后一个记录之后

语法

bEOF = rs.EOF

参数

bEOF
返回是否位于记录集的最后一个记录之后

rs
一个包含返回数据的记录集

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并查询一个记录集，显示结果集的数据：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.Execute("SELECT * FROM docs")

Do While Not rs.EOF
  Shell.Console.WriteLine rs("f1")
  Shell.Console.WriteLine rs("f2")
  Shell.Console.WriteLine rs("f3")
  rs.MoveNext
Loop

应用于

Recordset 对象


Recordset.ExecTime 属性

ExecTime 属性

查询得到此结果集使用的运算时间

语法

time = rs.ExecTime

参数

time
返回运算时间

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.FirstPosition 属性

FirstPosition 属性

返回结果集在全部返回结果中的起始位置

语法

pos = rs.FirstPosition

参数

pos
返回序号位置

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.NextRecordset 属性

NextRecordset 属性

查询下一个结果集

语法

Set rs1 = rs.NextRecordset

参数

rs
一个包含返回数据的记录集

rs1
返回下一个记录集

注释

当 Execute 方法执行了多于一个 SQL 语句时，将返回多个结果集，通过不断查询此属性，可以依次取得下面的一个结果集。

应用于

Recordset 对象


Recordset.ReadTimes 属性

ReadTimes 属性

查询得到此结果集实际从文件中进行读操作的次数

语法

times = rs.ReadTimes

参数

times
返回实际次数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.ReadBytes 属性

ReadBytes 属性

查询得到此结果集实际从文件中读取的数据，以字节为单位

语法

bytes = rs.ReadBytes

参数

bytes
返回实际字节数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.RecordCount 属性

RecordCount 属性

返回结果集中的记录数

语法

count = rs.RecordCount

参数

count
返回记录数

rs
一个包含返回数据的记录集

注释

通常情况下，此属性查询的结果与 ResultCount 的结果是相同的，只有在 Execute 方法指定了 start 或 len 参数后才会因为返回的结果集只是全部结果的子集而不同。

应用于

Recordset 对象


Recordset.ResultCount 属性

ResultCount 属性

返回结果集全部结果的记录数

语法

count = rs.ResultCount

参数

count
返回记录数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.WriteTimes 属性

WriteTimes 属性

查询得到此结果集实际向文件中进行写操作的次数

语法

times = rs.WriteTimes

参数

times
返回实际次数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.WriteBytes 属性

WriteBytes 属性

查询得到此结果集实际向文件中写入的数据，以字节为单位

语法

bytes = rs.WriteBytes

参数

bytes
返回实际字节数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.AddNew 方法

AddNew 方法

向一个新的记录集中添加一个空的记录

语法

rs.AddNew

参数

rs
一个包含返回数据的记录集

注释

只有通过 GetTable 方法取得的结果集对象可以使用此方法

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并获取一个空的记录集，插入数据后提交：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.GetTable("docs")

rs.AddNew
rs("f1") = 100
rs("f2") = 300
rs("f3") = 400
rs.Update

应用于

Recordset 对象


Recordset.Move 方法

Move 方法

设置记录集当前记录的绝对序号位置

语法

rs.Move pos

参数

rs
一个包含返回数据的记录集

pos
指定序号位置

应用于

Recordset 对象


Recordset.MoveFirst 方法

MoveFirst 方法

移动结果集当前记录到第一条记录

语法

rs.MoveFirst

参数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.MoveLast 方法

MoveLast 方法

移动结果集当前记录到最后一条记录

语法

rs.MoveLast

参数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.MoveNext 方法

MoveNext 方法

移动结果集当前记录到后一条记录

语法

rs.MoveNext

参数

rs
一个包含返回数据的记录集

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并查询一个记录集，显示结果集的数据：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.Execute("SELECT * FROM docs")

Do While Not rs.EOF
  Shell.Console.WriteLine rs("f1")
  Shell.Console.WriteLine rs("f2")
  Shell.Console.WriteLine rs("f3")
  rs.MoveNext
Loop

应用于

Recordset 对象


Recordset.MovePrevious 方法

MovePrevious 方法

移动结果集当前记录到前一条记录

语法

rs.MovePrevious

参数

rs
一个包含返回数据的记录集

应用于

Recordset 对象


Recordset.Update 方法

Update 方法

提交结果集中新添加的数据到数据库中

语法

rs.Update

参数

rs
一个包含返回数据的记录集

示例

下面的例子创建一个数据库对象，打开一个数据库文件，并获取一个空的记录集，插入数据后提交：

Set db = CreateObject("NetBox.Database")
db.Open "d:\test.db"
Set rs = db.GetTable("docs")

rs.AddNew
rs("f1") = 100
rs("f2") = 300
rs("f3") = 400
rs.Update

应用于

Recordset 对象


其他对象参考

对象 | 说 明
MessageColl | 消息对象，可用于创建、管理、保存消息
MessageManager | 多语种消息管理对象，可用于创建、管理、保存多语种消息


MessageColl 对象

消息对象，可用于创建、管理、保存消息

语法

Set Lang = mm.AddLanguage(strLanguage[, CodePage])
Set Lang = mm.GetLanguage(strLanguage)

属性

CodePage | 查询当前消息对象对应的代码页，此代码页为创建时所指定的
Count | 查询消息对象中消息的数量
Language | 查询消息对象的语言名称，为创建时所指定的名称
Messages | 以数组方式返回消息对象中的全部消息
Names | 以数组方式返回消息对象中的全部消息名称

方法

AddMessage | 向消息对象中添加新的消息
FormatMessage | 按照消息对象中的消息格式化给定的参数
GetMessage | 从消息对象中查询消息
RemoveMessage | 从消息对象中删除消息

示例

下面的例子创建一个消息管理对象，添加一个新消息对象，建立一个消息，并最终使用格式化输出。

Set mm = CreateObject("NetBox.MessageManager")
Set mc = mm.AddLanguage("testLang")
mc.AddMessage "testMsg", "Arg 1: %1, Arg 2: %2, Arg 3: %3"
mc.AddMessage "testMsg1", "Arg 3: %3, Arg 2: %2, Arg 1: %1"

Set mc1 = mm.GetLanguage("testLang")
Shell.Console.WriteLine mc.FormatMessage("testMsg", 100, 200, 300)
Shell.Console.WriteLine mc.FormatMessage("testMsg1", 100, 200, 300)

上面的程序执行结果是：

Arg 1: 100, Arg 2: 200, Arg 3: 300
Arg 3: 300, Arg 2: 200, Arg 1: 100


MessageColl.CodePage 属性

CodePage 属性

查询当前消息对象对应的代码页，此代码页为创建时所指定的

语法

mc.CodePage

参数

mc
一个实例化的消息对象

应用于

MessageColl 对象


MessageColl.Count 属性

Count 属性

查询消息对象中消息的数量

语法

mc.Count

参数

mc
一个实例化的消息对象

应用于

MessageColl 对象


MessageColl.Language 属性

Language 属性

查询消息对象的语言名称，为创建时所指定的名称

语法

mc.Language

参数

mc
一个实例化的消息对象

应用于

MessageColl 对象


MessageColl.Messages 属性

Messages 属性

以数组方式返回消息对象中的全部消息

语法

mc.Messages

参数

mc
一个实例化的消息对象

应用于

MessageColl 对象


MessageColl.Names 属性

Names 属性

以数组方式返回消息对象中的全部消息名称

语法

mc.Names

参数

mc
一个实例化的消息对象

应用于

MessageColl 对象


MessageColl.AddMessage 方法

AddMessage 方法

向消息对象中添加新的消息

语法

mc.AddMessage strKey, strMessage

参数

mc
一个实例化的消息对象

strKey
消息名称

strMessage
消息内容

示例

下面的例子创建一个消息管理对象，添加一个新消息对象，建立一个消息，并最终使用格式化输出。

Set mm = CreateObject("NetBox.MessageManager")
Set mc = mm.AddLanguage("testLang")
mc.AddMessage "testMsg", "Arg 1: %1, Arg 2: %2, Arg 3: %3"
mc.AddMessage "testMsg1", "Arg 3: %3, Arg 2: %2, Arg 1: %1"

Set mc1 = mm.GetLanguage("testLang")
Shell.Console.WriteLine mc.FormatMessage("testMsg", 100, 200, 300)
Shell.Console.WriteLine mc.FormatMessage("testMsg1", 100, 200, 300)

上面的程序执行结果是：

Arg 1: 100, Arg 2: 200, Arg 3: 300
Arg 3: 300, Arg 2: 200, Arg 1: 100

应用于

MessageColl 对象


MessageColl.FormatMessage 方法

FormatMessage 方法

按照消息对象中的消息格式化给定的参数

语法

strMessage = mc.FormatMessage(strKey[, str, ...])

参数

strMessage
消息内容

mc
一个实例化的消息对象

strKey
消息名称

str
消息参数

注释

使用格式化消息可以更加灵活的将结果与不同的输出格式组合起来，并且可以任意改变参数输出顺序，次数等。消息字符串中使用 %1 到 %8 表示 8 个参数在消息中的替换位置，s% 和 0% 与 1% 同义，% 本身则使用 %% 替换。

示例

下面的例子创建一个消息管理对象，添加一个新消息对象，建立一个消息，并最终使用格式化输出。

Set mm = CreateObject("NetBox.MessageManager")
Set mc = mm.AddLanguage("testLang")
mc.AddMessage "testMsg", "Arg 1: %1, Arg 2: %2, Arg 3: %3"
mc.AddMessage "testMsg1", "Arg 3: %3, Arg 2: %2, Arg 1: %1"

Set mc1 = mm.GetLanguage("testLang")
Shell.Console.WriteLine mc.FormatMessage("testMsg", 100, 200, 300)
Shell.Console.WriteLine mc.FormatMessage("testMsg1", 100, 200, 300)

上面的程序执行结果是：

Arg 1: 100, Arg 2: 200, Arg 3: 300
Arg 3: 300, Arg 2: 200, Arg 1: 100

应用于

MessageColl 对象


MessageColl.GetMessage 方法

GetMessage 方法

从消息对象中查询消息

语法

strMessage = mc.GetMessage(strKey)

参数

strMessage
消息内容

mc
一个实例化的消息对象

strKey
消息名称

应用于

MessageColl 对象


MessageColl.RemoveMessage 方法

RemoveMessage 方法

从消息对象中删除消息

语法

mc.RemoveMessage strKey

参数

mc
一个实例化的消息对象

strKey
消息名称

应用于

MessageColl 对象


MessageManager 对象

多语种消息管理对象，可用于创建、管理、保存多语种消息

语法

Set mm = CreateObject("NetBox.MessageManager")

属性

Count | 查询消息管理对象中语种的数量
Languages | 以数组方式返回全部语言对象

方法

AddLanguage | 向消息管理对象中添加新的语言对象
GetLanguage | 从消息管理对象中查询指定的语言对象
Load | 从消息存储文件中装载消息到消息管理对象
RemoveLanguage | 从消息管理对象中删除指定的语言对象
Save | 向消息存储文件中转储消息管理对象中的数据

注释

使用 MessageManager 对象可以非常方便地创建多语种应用，MessageManager 对象可以创建、管理多个语种的消息，以 id 为标识查询消息内容，可以保存、装载全部消息，便于软件发布，并且可以在不修改软件的前提下通过修改消息文件直接增加新语种。

示例

下面的例子创建一个消息管理对象，添加一个新消息对象，建立一个消息，并最终使用格式化输出。

Set mm = CreateObject("NetBox.MessageManager")
Set mc = mm.AddLanguage("testLang")
mc.AddMessage "testMsg", "Arg 1: %1, Arg 2: %2, Arg 3: %3"
mc.AddMessage "testMsg1", "Arg 3: %3, Arg 2: %2, Arg 1: %1"

Set mc1 = mm.GetLanguage("testLang")
Shell.Console.WriteLine mc.FormatMessage("testMsg", 100, 200, 300)
Shell.Console.WriteLine mc.FormatMessage("testMsg1", 100, 200, 300)

上面的程序执行结果是：

Arg 1: 100, Arg 2: 200, Arg 3: 300
Arg 3: 300, Arg 2: 200, Arg 1: 100


MessageManager.Count 属性

Count 属性

查询消息管理对象中语种的数量

语法

mm.Count

参数

mm
一个实例化的消息管理对象

应用于

MessageManager 对象


MessageManager.Languages 属性

Languages 属性

以数组方式返回全部语言对象

语法

langs = mm.Languages

参数

Langs
返回新全部语言对象数组

mm
一个实例化的消息管理对象

应用于

MessageManager 对象


MessageManager.AddLanguage 方法

AddLanguage 方法

向消息管理对象中添加新的语言对象

语法

Set Lang = mm.AddLanguage(strLanguage[, CodePage])

参数

Lang
返回新创建的语言对象，参见 MessageColl 对象

mm
一个实例化的消息管理对象

strLanguage
语言名称，以后可作为键值查询此次加入的语言对象

CodePage
语言相对应的代码页，仅用于描述语言，可省略，缺省为0

注释

AddLanguage 方法用于向消息管理对象中添加一个新的语言对象，方法返回新建的对象。添加对象时必须指定语言标识，用于使用时查询指定的语种。如果添加的语种已经存在，则此方法将用新的空白对象替换以前的语言对象。

示例

下面的例子创建一个消息管理对象，添加一个新消息对象，建立一个消息，并最终使用格式化输出。

Set mm = CreateObject("NetBox.MessageManager")
Set mc = mm.AddLanguage("testLang")
mc.AddMessage "testMsg", "Arg 1: %1, Arg 2: %2, Arg 3: %3"
mc.AddMessage "testMsg1", "Arg 3: %3, Arg 2: %2, Arg 1: %1"

Set mc1 = mm.GetLanguage("testLang")
Shell.Console.WriteLine mc.FormatMessage("testMsg", 100, 200, 300)
Shell.Console.WriteLine mc.FormatMessage("testMsg1", 100, 200, 300)

上面的程序执行结果是：

Arg 1: 100, Arg 2: 200, Arg 3: 300
Arg 3: 300, Arg 2: 200, Arg 1: 100

应用于

MessageManager 对象


MessageManager.GetLanguage 方法

GetLanguage 方法

从消息管理对象中查询指定的语言对象

语法

Set Lang = mm.GetLanguage(strLanguage)

参数

Lang
返回新创建的语言对象，参见 MessageColl 对象

mm
一个实例化的消息管理对象

strLanguage
语言名称，以后可作为键值查询此次加入的语言对象

示例

下面的例子创建一个消息管理对象，添加一个新消息对象，建立一个消息，并最终使用格式化输出。

Set mm = CreateObject("NetBox.MessageManager")
Set mc = mm.AddLanguage("testLang")
mc.AddMessage "testMsg", "Arg 1: %1, Arg 2: %2, Arg 3: %3"
mc.AddMessage "testMsg1", "Arg 3: %3, Arg 2: %2, Arg 1: %1"

Set mc1 = mm.GetLanguage("testLang")
Shell.Console.WriteLine mc.FormatMessage("testMsg", 100, 200, 300)
Shell.Console.WriteLine mc.FormatMessage("testMsg1", 100, 200, 300)

上面的程序执行结果是：

Arg 1: 100, Arg 2: 200, Arg 3: 300
Arg 3: 300, Arg 2: 200, Arg 1: 100

应用于

MessageManager 对象


MessageManager.Load 方法

Load 方法

从消息存储文件中装载消息到消息管理对象

语法

mm.Load varSrc

参数

mm
一个实例化的消息管理对象

varSrc
指定的数据源，可以为文件名、Stream 对象和二进制数据块

注释

消息存储文件为一个 UTF-8 格式编码的文本文件，以语言为分组，以消息为行。可以使用 notepad 等支持 UTF-8 的编辑器直接编辑。

应用于

MessageManager 对象


MessageManager.RemoveLanguage 方法

RemoveLanguage 方法

从消息管理对象中删除指定的语言对象

语法

mm.RemoveLanguage strLanguage

参数

mm
一个实例化的消息管理对象

strLanguage
语言名称，以后可作为键值查询此次加入的语言对象

应用于

MessageManager 对象


MessageManager.Save 方法

Save 方法

向消息存储文件中转储消息管理对象中的数据

语法

mm.Save varDest

参数

mm
一个实例化的消息管理对象

varDest
指定转储的目标，可以为文件名或者 Stream 对象

注释

消息存储文件为一个 UTF-8 格式编码的文本文件，以语言为分组，以消息为行。可以使用 notepad 等支持 UTF-8 的编辑器直接编辑。

应用于

MessageManager 对象