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;
}

VS2010Expressを使用して新しい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

これを解決するには、2つの選択肢があります。1つは、誤った文字列を配列として宣言し、TCHAR配列に前処理できるようにすることwchar_tです。TEXT("")ただし、文字通りのトリングにはマクロが必要になるなど、コード内の多くのことを変更する必要があります。

しかし、見たところ、プログラムはUnicode文字列を使用するように行われていなかったため、他の選択肢はプログラムをマルチバイトとしてコンパイルすることです。パラメータStringCchCatがあるため、コード内で何も変更する必要はありません。STRSAFE_LPSTRに前処理されchar *ます。

マルチバイトとしてコンパイルするには、Project Settings-> General->に移動しCharacter Setます。

于 2012-11-26T01:12:45.730 に答える