zoukankan      html  css  js  c++  java
  • 用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++引用即可。

    你也可以下载示例项目

  • 相关阅读:
    Matlab n阶矩阵行、列互换
    IfcGeographicElement
    集合系列 Set(七):LinkedHashSet
    集合系列 Set(六):HashSet
    集合系列 List(五):Stack
    集合系列 List(四):LinkedList
    集合系列 List(三):Vector
    集合系列 List(二):ArrayList
    集合系列(一):集合框架概述
    集合系列开篇:为什么要学集合?
  • 原文地址:https://www.cnblogs.com/0000/p/1521461.html
Copyright © 2011-2022 走看看