📄 isapi
字号:
<p>
一 个ISAPI 的DLL, 可 以 在 被 用 户 请 求 激 活 后 长 驻 内 存, 等 待 用 户 的 另 一 个 请 求, 还 可 以 在 一 个DLL 里 设 置 多 个 用 户 请 求 处 理 函 数, 此 外,ISAPI 的DLL 应 用 程 序 和WWW 服 务 器 处 于 同 一 个 进 程 中, 效 率 要 显 著 高 于CGI。
<p>
不 过ISAPI 的 平 台 兼 容 性 较 差, 目 前 只 能 用 于 微 软 自 己 的Windows 95 和NT 操 作 系 统 上, 服 务 器 平 台 也 仅 限 于IIS(Internet Information Server) 和MS personal web server 以 及NT workstation 上 的peer web server。
<h3>
五、ISAPI 的 实 现
</h3>
能 够 支 持ISAPI 开 发 的 平 台 只 有 微 软 的 几 个 平 台 组 合( 如NT+IIS,WIN95+MS personal web server)。 因 此 开 发ISAPI 只 能 这 几 个 平 台 上。 开 发 语 言 前 已 有 述, 这 里 向 大 家 推 荐Visual C++ 4.2 版, 它 的Wizard 提 供 了 专 门 制 作ISAPI 的 功 能 项。
<p>
下 面 是 个 简 单 的 例 子, 功 能 是 将 用 户 从 浏 览 器 上 的 输 入 简 单 地 回 显 给 用 户, 功 能 简 单, 但 是 具 备 一 个 典 型 的ISAPI 全 部 流 程。 源 程 序 如 下( 大 部 分 为Wizard 生 成 的 代 码):
<pre>
1. 主 程 序:
// ISAPI1.CPP - Implementation file for your Internet Server
#include "stdafx.h"
#include "isapi1.h"
///////////////////////////////////////////////////////////////////////
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.
CWinApp theApp;
///////////////////////////////////////////////////////////////////////
// command-parsing map
BEGIN_PARSE_MAP(CIsapi1Extension, CHttpServer)
/************* My codes begin here ***********/
ON_PARSE_COMMAND(RegisterUser,
CIsapi1Extension, ITS_PSTR ITS_PSTR ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("First Middle Last")
/************* My codes end here ***********/
END_PARSE_MAP(CIsapi1Extension)
///////////////////////////////////////////////////////////////////////
// The one and only CIsapi1Extension object
CIsapi1Extension theExtension;
///////////////////////////////////////////////////////////////////////
// CIsapi1Extension implementation
CIsapi1Extension::CIsapi1Extension()
{
}
CIsapi1Extension::~CIsapi1Extension()
{
}
BOOL CIsapi1Extension::GetExtensionVersion
(HSE_VERSION_INFO* pVer)
{
// Call default implementation for initialization
CHttpServer::GetExtensionVersion(pVer);
// Load description string
TCHAR sz[HSE_MAX_EXT_DLL_NAME_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN));
_tcscpy(pVer->lpszExtensionDesc, sz);
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// CIsapi1Extension command handlers
/****** My code begins here**********/
void CIsapi1Extension::RegisterUser
( CHttpServerContext* pctxt, LPCTSTR
pstrFirst, LPCTSTR pstrMiddle, LPCTSTR pstrLast )
{
// do processing here!
*pctxt << _T("Your name is:");
*pctxt << _T(pstrFirst);
*pctxt << _T("\n");
*pctxt << _T("Your Address is:");
*pctxt << _T(pstrMiddle);
*pctxt << _T("\n");
*pctxt << _T("Your E_mail is:");
*pctxt << _T(pstrLast);
}
/********* My codes end here **********/
// Do not edit the following lines,
which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CIsapi1Extension, CHttpServer)
//{{AFX_MSG_MAP(CIsapi1Extension)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif// 0
2. 主 头 文 件
// ISAPI1.H - Header file for your Internet Server
//isapi1 Extension
#include "resource.h"
class CIsapi1Extension : public CHttpServer
{
public:
CIsapi1Extension();
~CIsapi1Extension();
// Overrides
// ClassWizard generated virtual function overrides
// NOTE - the ClassWizard will add and remove member functions here.
//DO NOT EDIT what you see in these blocks of generated code !
//{{AFX_VIRTUAL(CIsapi1Extension)
public:
virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer);
//}}AFX_VIRTUAL
// TODO: Add handlers for your commands here.
/*********** My coded begin here ( 函 数 声 明) *********/
void RegisterUser( CHttpServerContext* pctxt,
LPCTSTR pstrFirst, LPCTSTR
pstrMiddle, LPCTSTR pstrLast );
/*********My codes end here
DECLARE_PARSE_MAP()
//{{AFX_MSG(CIsapi1Extension)
//}}AFX_MSG
};
3. 动 态 连 接 库 定 义 文 件
/*************************************/
/*ISAPI1.def */
/*************************************/
; ISAPI1.def : declares the module parameters for the DLL.
LIBRARY"ISAPI1"
EXPORTS
HttpExtensionProc
GetExtensionVersion
</pre>
在 上 述 程 序 中, 定 义 了 一 个CHttpServer 的 类CIsapi1Extension, 这 是 该 程 序 的 主 要 一 个 类, 通 过 它 实 现 与 用 户 交 互 的 功 能。 由ON_PARSE_COMMAND 段 实 现 函 数 映 射, 上 述 程 序 中 定 义 了 该DLL 中 的 一 个 成 员 函 数RegisterUser, 其 功 能 就 是 将 用 户 在 编 辑 框 中 输 入 的 信 息 发 送 回 用 户。 关 于 具 体 实 现 细 节, 可 以 参 看VC4.2 帮 助 文 档。
<p>
将 上 述 文 件 编 译 成DLL 后 放 入 服 务 器 主 机 内WWW 服 务 器 指 定 的 用 户 有 执 行 权 限 的Scripts 目 录 里, 该 目 录 的 逻 辑 名 应 和 交 互 主 页 里 的 一 致。 设 置 完 后, 通 过 浏 览 器 连 到 服 务 器 上, 浏 览 该 主 页, 并 输 入 信 息 到 编 辑 框 中。
</p>
<p><a href="/pcworld/default.htm"><img
src="/pics/magazine.jpg" alt="微电脑世界" border="0"
width="150" height="38"></a> <a
href="/c&c/c&c.html"><img src="/pics/c&c.jpg"
alt="国际电子报" border="0" width="152" height="38"></a>
<a href="/ccwexpo/default.htm"><img src="/pics/fair.jpg"
alt="展览" border="0" width="152" height="38"></a> </p>
<hr>
<p>中国计算机世界出版服务公司版权所有 </p>
</td>
</tr>
</table>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -