用Visual Studio 2008创建VC++的ISAPI项目

工业酒精 撰写  

 

在VC++ 6.0和VS2003中都有ISAPI的项目向导,用其开发ISAPI是很方便的,但是从Visual Studio 2005开始这个模板就没有了。

 

如何在用Visual Studio 2008创建VC++的ISAPI项目,并且能够编译兼容32位和64位的操作系统的dll?

 

通常情况下我们安装的Visual Studio 2008的VC++都没有包含64位的编译器,所以在创建项目之前,最好先安装64位编译器。

 

 

可以通过控制面板->添加/删除程序->Visual Studio 2008->添加/删除功能->Visual C++->X64编译器和工具

 

 

接下来我们就可以创建我们ISAPI项目了。

 

1、打开Visual Studio 2008->文件菜单->新建->项目->其他语言->Visual C++->常规->空项目

 

2、打开解决方案资源管理器视图->选择项目->添加新建项->C++文件(.cpp)

3、根据第二步,再添加一个模块定义文件(.def)

 

4、打开模块定义文件(.def)文件,根据需要的ISAPI的不同种类定义不同的模块方法

 

  • ISAPI_Extension

    LIBRARY Your_ISAPI_Extension_Name
    EXPORTS
    GetExtensionVersion
    HttpExtensionProc

  • ISAPI_Filter

    LIBRARY Your_ISAPI_Filter_Name

    EXPORTS

    GetFilterVersion

    HttpFilterProc

 

5、(如果需要编译64位的ISAPI)打开生成菜单->配置管理器->活动解决方案平台:新建->键入或选择新平台:x64->从此处选择复制设置:WIN32

6、打开解决方案资源管理器视图->选择项目->属性->配置->所有配置->平台->所有平台

  • 常规->输出目录:$(SolutionDir)$(PlatformName)\$(ConfigurationName)
  • 常规->中间目录:$(PlatformName)\$(ConfigurationName)
  • 常规->配置类型:动态库(.dll)
  • 常规->MFC使用:使用标准 Windows 库
  • 常规->字符集:未设置
  • 常规->全程序优化:使用链接时间代码生成
  • C/C++->常规->调试信息格式:程序数据库(/Zi)
  • (如果需要编译64位的ISAPI)C/C++->常规->检测64位可移植性问题:是(/Wp64)

 

 

 

7、打开C++文件,输入你ISAPI相关的代码(这部分不做详细解释,以后的文章会详述),这里给段示例代码,用来更改HTTP Header中的Server属性

 

#include <windows.h>

#include <stdio.h>

#include <stdlib.h>

#include <httpfilt.h>

DWORD DoSendResponse(HTTP_FILTER_CONTEXT * pfc, HTTP_FILTER_SEND_RESPONSE * pResponse);

BOOL WINAPI __stdcall GetFilterVersion(HTTP_FILTER_VERSION *pVer)

{

pVer->dwFlags = ( SF_NOTIFY_ORDER_LOW | SF_NOTIFY_SEND_RESPONSE );

pVer->dwFilterVersion = HTTP_FILTER_REVISION;

strcpy(pVer->lpszFilterDesc, "Replace Server Header ISAPI filter, Version 1.0");

return TRUE;

}

DWORD WINAPI __stdcall HttpFilterProc(HTTP_FILTER_CONTEXT *pfc, DWORD NotificationType, VOID *pvData)

{

switch (NotificationType)

{

case SF_NOTIFY_SEND_RESPONSE :

return DoSendResponse(pfc, (HTTP_FILTER_SEND_RESPONSE *) pvData);

default :

break;

}

return SF_STATUS_REQ_NEXT_NOTIFICATION;

}
DWORD DoSendResponse(HTTP_FILTER_CONTEXT * pfc,HTTP_FILTER_SEND_RESPONSE * pResponse)

{

BOOL fServer = TRUE;

DWORD dwServerError;

fServer = pResponse->SetHeader(pfc, "Server:", "MyWebServer");

if ( !fServer )

{

dwServerError = GetLastError();

pfc->pFilterContext = (LPVOID)(DWORD64)pResponse->HttpStatus;

}

return SF_STATUS_REQ_NEXT_NOTIFICATION;

}

 

最后你就可以编译你的项目了,如果出现编译错误,可能Windows SDK,安装后增加相应的VC++引用即可。

 

你也可以下载示例项目


4 条评论

  1. 如何设置图片的过期时间IIS
    发表了 2008年11月11日 在 16:58 | 永久链接

    现在你这个完成的主要功能是什么?^_^
    你们的静态文件比如图片是用这个来设置其过期时间的吗?

  2. 发表了 2008年11月21日 在 13:34 | 永久链接

    只是一个模板,具体功能可以自己开发。

    写这个文章的目的不是说完成了什么功能。

    里面一些代码只是sample,举例而已。

  3. 无忧无虑
    发表了 2009年5月18日 在 15:41 | 永久链接

    楼主你写的这个是ISAPI Filter吧,是个好例子。最近我在尝试ISAPI Extension,不过在VS2008下没有成功,因为Microsoft把afxisapi.h之类的库给去掉了。我把VS2005下的相应库拷出来作为额外的库来编译,但还是有问题。我是参照http://blogs.msdn.com/jpsanders/archive/2007/12/10/chttpserver-not-included-in-visual-studio-2008.aspx做的,显示的错误是
    3>Linking...
    3>nafxcwd.lib(dbcore.obj) : error LNK2005: "public: int __thiscall CRecordset::IsEOF(void)const " (?IsEOF@CRecordset@@QBEHXZ) already defined in PartFile.obj

    PartFile.cpp中有一个继承自CRecordSet的类(来自afxdb.h),楼主有和建议?

  4. 发表了 2009年7月28日 在 14:39 | 永久链接

    ISAPI可难折腾了

个引用通告

  1. haohtml’s » Blog Archive » YSlow评分达到A级 发表在 2008年12月19日 于 14:30

    [...] YSlow第十三条:对于一般性网站来讲是鸡肋,所以纯粹为了加分,可看看扩展阅读二 [...]

发表评论

Your email is never shared. 标记为 * 的为必填项目

*
*