在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++引用即可。
你也可以下载示例项目