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

酒精 @ 2008-10-27 00:10 | 技术 4条评论

 

在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++引用即可。

 

你也可以下载示例项目

posted @ 2009-07-11 16:39  周骏  阅读(1627)  评论(0编辑  收藏  举报