2

我找到了以下代码片段,并尝试使用它创建一个 ISAPI .DLL。

#include <windows.h>
#include <httpfilt.h>
#include "tchar.h"
#include "strsafe.h"

// Portion of HttpOnly
DWORD WINAPI HttpFilterProc(
   PHTTP_FILTER_CONTEXT pfc,
   DWORD dwNotificationType,
   LPVOID pvNotification) {

   // Hard coded cookie length (2k bytes)
   CHAR szCookie[2048];
   DWORD cbCookieOriginal = sizeof(szCookie) / sizeof(szCookie[0]);
   DWORD cbCookie = cbCookieOriginal;

      HTTP_FILTER_SEND_RESPONSE *pResponse = 
         (HTTP_FILTER_SEND_RESPONSE*)pvNotification;

      CHAR *szHeader = "Set-Cookie:";
      CHAR *szHttpOnly = "; HttpOnly";
      if (pResponse->GetHeader(pfc,szHeader,szCookie,&cbCookie)) {
         if (SUCCEEDED(StringCchCat(szCookie,
                                    cbCookieOriginal,
                                    szHttpOnly))) {
            if (!pResponse->SetHeader(pfc,
                                      szHeader,
                                      szCookie)) {
                        // Fail securely - send no cookie!
                        pResponse->SetHeader(pfc,szHeader,"");
               }
            } else {
               pResponse->SetHeader(pfc,szHeader,"");
          }
   }

   return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

我使用 VS 2010 Express 创建了一个新的 C++ 项目。构建项目时出现以下错误:

------ Build started: Project: ISAPIHttpOnly, Configuration: Debug Win32 ------
  HttpOnly.cpp
c:\documents and settings\bob\my documents\visual studio 2010\projects\isapihttponly\isapihttponly\httponly.cpp(25): error C2664: 'StringCchCatW' : cannot convert parameter 1 from 'CHAR [2048]' to 'STRSAFE_LPWSTR'
          Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我不确定如何解决这个问题。:S

4

1 回答 1

4

您的程序正在被编译为 Unicode,然后STRSAFE_LPWSTR(来自 中的第一个参数的类型)对不是 Unicode 的数组类型StringCchCat失败。char

为了解决这个问题,你有两种选择,一种是将错误的字符串声明为TCHAR数组,这样就可以将其预处理为wchar_t数组。但是你必须在你的代码中改变很多东西,比如文字字符串需要TEXT("")宏等等。

但看起来,您的程序并没有使用 Unicode 字符串,因此另一种选择是将您的程序编译为多字节,然后您不需要更改代码中的任何内容,因为StringCchCat会有一个STRSAFE_LPSTR参数,这将是预处理为char *.

要编译为多字节,只需转到Project Settings-> General-> Character Set

于 2012-11-26T01:12:45.730 回答