博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
创建ISAPI扩展(转)
阅读量:2496 次
发布时间:2019-05-11

本文共 3122 字,大约阅读时间需要 10 分钟。

创建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/

你可能感兴趣的文章
64位进程和32位进程通信问题,接收端收不到 SendMessage发送的消息
查看>>
20159320《网络攻防实践》第5周教材总结
查看>>
git的入门摸索和入门研究
查看>>
单例模式
查看>>
黑马程序员——————> 多线程
查看>>
Bootstrap系列 -- 41. 带表单的导航条
查看>>
Python---时间函数
查看>>
maven必知必会
查看>>
最小生成树
查看>>
获取网址中参数的方式
查看>>
golang log日志
查看>>
一些应该记住的东西(持续更新?再也不会更新了)
查看>>
常用的机器学习&数据挖掘知识点【转】
查看>>
bzoj 1911: [Apio2010]特别行动队 2011-12-26
查看>>
JIRA-6.3.6安装与破解
查看>>
Cron表达式【一】
查看>>
weblogic安全漫谈
查看>>
DEDECMS全版本gotopage变量XSS ROOTKIT 0DAY
查看>>
出路在哪里?出路在于思路!智者无敌
查看>>
Linux基础系列:常用命令(5)_samba服务与nginx服务
查看>>