创建ISAPI扩展(转)

创建ISAPI扩展: 好了,现在让我们看一下我们的第一个ISA。这个例子中将利用ISAPIExtension Wizard(ISAPI扩展向导)来创建一个简单的ISAPI扩展。全部目的在于让你熟悉概念并介绍一些使用ISAPI的技术。例子程序接收来自客户机的一个串,稍作修改,然后用一个新页显示客户机发送来的这个串。下面介绍的过程将带着你一步步地创建示例ISA。你可以使用同样的过程来做需要创建的任何ISA扩展。我们假定你已经启动Visual C++ 并且使用的是6.0版。
WEB链接 在创建自己的ISAPI扩展或过滤器时,最好的资源就是其它程序员编写的免费软件。alt.comp.freeware新闻组中列出了相当多的这样的软件。例如,在写本书的时候,AAIT Incorporated就推出了一个新的免费软件,称为CGI Expert(CGI专家)。它同时支持CGI、Win-CGI、ISAPI以及NSAPI接口。显然谁都想用免费产品,但是就像使用其它产品一样,一定要小心。不过它们确实对如何创建自己的定制扩展提供了极好的想法(或者可以提供一种解决方案使得你自己不必去编程了)。
1. 使用File(文件)|New(新建)命令显示如下图所示的New(新建)对话框。请注意,我已经选择了ISAPI Extension Wizard(ISAPI 扩展向导)。
0652312274790421.JPG
2. 在工程名称域中键入想创建的ISA的名字。这个例子中使用的是DispStr,不过可以使用你想使用的任何名称。
3. 单击OK,就会看到如下图所示的ISAPI Extension Wizard(ISAPI扩展向导)Step 1 of 1(第一步)对话框。在这里可以为你的ISA选择各种特性。注意对话框中有三个主要区域。选中第一个复选框,就可以创建过滤器;选中第二个复选框,就可以创建扩展。第三个区域定义如何将MFC与你的应用程序链接起来。
0652312275117982.JPG
4. 选中扩展选项,而不是过滤器选项。在Extension Description (扩展描述)域中,你应对你的ISA提供简短扼要的说明。该说明将以一个字符串的形式出现,你可在DLL中需要时使用它。当某人打开你的ISA的Properties(属性)对话框时,该说明并不出现在对话框中,所以需要给DLL的版本信息再添加点附加文本。
5. 在Extension Description(扩展描述)域输入Display a string from the client(显示来自客户机的串)。
6. 单击Finish(完成)就会看到如下图所示的New Project Information (新建工程信息)对话框。
0652312275639150.JPG
7. 单击OK,ISAPI Extension Wizard(ISAPI 扩展向导)就完成了所需的程序框架的创建。
现在,为了使扩展具有实用功能,还要对ISAPI Extension Wizard(ISAPI 扩展向导)创建的框架做三件事。首先是为添加的新函数创建一个分析映射 ( Parsemap) 。在DispStr.cpp文件的顶部可以找到该分析映射。程序列表13.1 列出了应该给该分析映射加入的代码,以便我们能够从HTML页面访问这个新增函数。
0652312280380587.JPG
尽管只需要增加两行代码就能使这个例子工作,但我们真正关心的却是下面三行代码。ON_PARSE_COMMAND()宏允许定义一个新函数。注意,应提供函数名、所提供函数所在的类以及该函数使用的参数的类型。ON_PARSE_COMMAND()宏需要一个参数项,尽管你实际上可能并不需要任何参数就能使该函数正常运行。注意,因为缺省函数不需要任何参数,所以使用了ITS_EMPTY值。由于我们的新函数,DispStr棗需要一个字符串指针,所以它带有一个参数ITS_PSTR。
然后下一行是ON_PARSE_COMMAND_PARAMS()宏。你必须告诉VisualC++如何处理你的函数的参数。例如,如果我们想强制用户为函数提供一个串值,就应在ON_PARSE_COMMAND_PARAMS()宏中,简单的放上String。因为实际上并不一定要求用户提供一个字符串才能使用函数工作,所以这里提供了一个缺省值 。注意如果你需要一个参数而用户没有提供的话,查询就会失败。最后还要用DEFAULT_PARSE_COMMAND() 宏告诉Visual C++用哪个函数作为缺省函数。由于这个例子的Default函数挺合适,所以就没有更改这个缺省的设置。
其次,你需要给DispStr.H文件增加一个函数项。除非通过修改类说明来包含你的新函数,否则Visual C++对此将会一无所知,于是DLL也不会被编译。幸运的是,我们只要增加程序列表13.2中黑体显示的那一行代码就可以了。程序列表13.2列出了该行代码周围的代码行,以便于你知道新的一行应添加在什么地方。
0652312280848841.JPG
0652312281058358.JPG
可以看出,增加函数调用声明很简单。不过现在你可能还不清楚声明的CHttpServerContext* pCtxt部分是从哪里来的。我们确实没有在前面的任何分析映射宏中对它进行说明。实际上 pCtxt 参数是缺省地传递给函数的。记住前面已经介绍过CHttpServer类可以为每个用户请求创建一个CHttpServerContext对象,这就是该参数的来源。你得到的是指向与用户对函数的调用相联的CHttpServerContext对象的指针。这也是对函数的多个调用进行区分的办法──每个调用都有一个完全不同的对象与之相关联。
制作这个DLL函数还剩最后一件事──给DispStr.CPP文件添加函数代码。这个例子是将函数代码放在已有的Default()函数代码之后。程序列表13.3 显示的是这个例子使用的非常短的函数。这里没有什么花里胡哨的东西,其全部目的在于说明如何完成这件任务。
0652312281819894.JPG
0652312282547932.JPG
这个函数本身很容易理解。我们做的第一件事是告诉Visual C++启动一个Web页,这就像给文档加入和 标记一样。我们做的第二件事是输出一个标题,就像给文档加入标记一样。重载缺省标题的唯一途径是重载WriteTitle()函数,这是一件想干就能干成的事。现在有了标题,就该创建内容了。需要使用流操作符来发送信息。注意这个例子很轻松自如地使用了第8章介绍的所有标记。对标准HTML 文档能做的事也同样能够对ISAPI扩展做。待会儿将会说明这些标记是如何一起工作从而产生了Web页的。另外还应注意我们将从Web页得到的字符串发送回新Web页,甚至不必将值转换为文本,就可以使它们工作了。这个例子中使用的最后一个函数调用是EndContent(),它告诉Visual C++已经完成发送信息的任务了,这就象在文档末尾加上一样。
现在你就可以编译我们创建的ISAPI扩展了。一旦编译成功,就可以将DLL移到Web 服务器上。有好几个逻辑位置可以存放该DLL,不过最常用的两个位置是Scripts目录或一个特殊的Controls目录。我通常将自己的所有控件都放在Controls目录中以便于查找,不过实际的存放位置并不重要。唯一的原则是用户应该能够通过Web站点来访问包含该DLL的目录,而且你应该用Web服务器提供的Internet服务管理器将该目录标记为可执行的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10294527/viewspace-123234/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10294527/viewspace-123234/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值