下面的示例说明了如何从服务器上取得日期和时间并在浏览器窗口中显示它们。使用这个特定ISAPI的方式有多种,但我们讨论的是在一个简单Web页上使用它们。你顺便可以获得的最重要概念是,使用ISAPI扩展,允许你访问那些你坐在控制台前使用正规程序访问的每一条信息。换言之,坐在计算机前能做的一切也可以远程地管理它们。实际上唯一的限制是你应考虑到标准Windows NT的安全性。
技巧 灵活性是一把双刃剑。对于ISAPI扩展要考虑一些对普通程序不必考虑的限制。例如,除非你拥有实际管理整个进程的全部能力,否则就要对是否允许远程备份进行再三考虑。坐在Windows NT控制台前的管理员能够通过物理地验证磁带编号或其他识别信息看到,你打算使用的磁带不是你用于备份应该使用的那盘磁带,问题是,你不得不问问自己,远程管理员是否也具有这种能力,多数情况下,答案都是否定的。
创建得到时间/日期的ISAPI扩展
让我们设计基本程序吧。由于本章中已设计过一个基本的ISAPI扩展,本节中不再花费时间讨论程序的细节。请你按下列步骤进行操作吧。
1. 创建一个新的ISAPI扩展工程,我把它命名为GetTD,至于你怎么命名就随你的便了。
2. 对于ISAPI Extension Wizard(ISAPI扩展向导)Step 1 of 1 没有什么特别可做的事,单击Finish(完成)即可。
3. 单击OK,关闭New Project Information(新建工程信息)对话框,在这之前应先确认所有程序参数。
下面创建代码。和其他ISAPI扩展一样,这个例子也要添加三段主要代码。下面的列表就是要添加的东西。
Parse map(分析映射) 分析映射对DLL中的函数如何调用作出定义,它还定义了所需变量以及这些变量映射到你的函数中的方式。
Function(函数) 显然,如果没有某些向浏览器提供输出的代码,你的DLL 就没用了。
Function definition(函数定义) 需要在ISAPI扩展的头文件中添加函数说明。
正如你要看到的,我们将对GetTD.CPP文件作两处改动,还要对GetTD.H文件作一处改动。程序列表13.9是GetTD.CPP文件的有关代码。对分析映射及GetTD()函数都要看一下。还要注意对Default()函数所作的改动,它使得当你在一个ISAPI扩展文件中有多个函数时这个函数更有用。程序列表13.10列出了整个GetTD.H文件。
(AFX_GETTD_H_E8B71025_2785_11D1_8E36_444553540000__INCLUDED)
让我们先讨论一下程序列表13.9中的代码。这个分析映射没有什么出人意料之处。我们不需要把来自客户机的数据传递给服务器,所以对GetID函数使用了ITS_EMPTY常量。
请注意我是如何修改Default()函数的。通常如果DLL中只有一个函数时就要在代码中使用Default()函数。但是,我发现,当DLL中多于一个函数时,作为生成ISAPI 扩展接口文件的一种方法,使用Default()函数也是相当方便的,这样,合作者(coworker) 能快速地构造一个Web页,查看ISAPI扩展提供的文档,然后去处理创建一个实际页的事务。
GetTD()函数是相当基础的一个函数。它只是获取系统时间并把它格式化成两个字符串,一个是时间,一个是日期。请注意我是如何使用Format()函数来得到这两个字符串的。有了这两个字符串变量后,就可以创建包含其值的基本Web页面了。
程序列表13.10与我们以前的例子有很大区别。我做的一切工作就是说明GetTD函数。这是因为我没有向函数传递任何数据,所以唯一的数据是pCtxt。
创建测试GetTD的Web页
现在看一看访问ISAPI扩展的HTML代码,程序列表13.11包含了一个非常简单的测试页面。
应该注意到程序列表13.11比起以前的例子(程序列表13.4)有一个主要的变化。这一次是使用了一个锚地去访问ISAPI扩展。用户单击这一链接后,得到的是由ISAPI生成的页,而不是像通常那样链接到Web服务器的一个静态页。这样做有几个重要的优点:
能够通过把检测到的浏览器类型作为参数传递给ISAPI扩展来创建浏览器专用页。大多数浏览器都提供了唯一识别信息。
ISAPI扩展允许定制Web页的内容来反映特定用户的需求。
使用ISAPI扩展,允许创建基于某些规则(如星期中某天)的链接。例如,能够把星期一欢迎页和星期五会见页连接到同一个主页链接上。
显然,使用类似于ASP或老版本的其他技术也能得类似的结果,但事实证明,在Web站点通常不使用的许多方式中,你也能使用锚地技术。
注释 记住先在内部网上测试这个ISAPI扩展。你不能在本地打开扩展,所以如果作为浏览器中的文件来简单地打开测试Web页的话,链接就会失败。
现在看一下这个ISAPI扩展的输出。图13.2显示了第一次看到的Web页。如你所见,它含有一个简单标题和两个链接,ISAPI扩展中每个函数都有一个链接。
如果单击第一个链接,你会看到如下图所示的显示内容:
尽管这一页没有给出ISAPI扩展的明显的使用指令,但你却知道了它能做些什么。显然,在产品型扩展中可以提供更多的细节,可以包括一个参数列表(如果有的话)作为Default()函数页的一部分,有时,甚至可以包括一些与ISAPI扩展创建者进行联系的信息。
单击浏览字符串上的Back(后退)按钮,退回到图13.2所示的初始Web页。现在试一试第二个链接。在试第二个链接之前,在测试服务器上变更一下时间和日期,这样做是为了证实ISAPI扩展确实是按所预期的那样完成了工作。下图是GetTd()函数输出时间和日期的典型例子。如你所见,Web页上显示的是服务器上变更了的系统时间,而不是本地时间。