1

IIS6 用に作成された ISAPI フィルターがあります。次に、IIS6 フィルターをラップする IIS7 用のラッパーを作成する必要があります。C# で HTTP モジュールを記述し、アンマネージ dll メソッドを Pinvoke する予定です。

次のコードの C# 表現が必要です。

DWORD WINAPI HttpFilterProc(
   PHTTP_FILTER_CONTEXT pfc,
   DWORD notificationType,
   LPVOID pvNotification
);

    typedef struct _HTTP_FILTER_CONTEXT HTTP_FILTER_CONTEXT {
       DWORD cbSize;
       DWORD Revision;
       PVOID ServerContext;
       DWORD ulReserved;
       BOOL fIsSecurePort;
       PVOID pFilterContext;
       BOOL GetServerVariable;
       BOOL AddResponseHeaders;
       BOOL WriteClient;
       VOID * AllocMem;
       BOOL ServerSupportFunction;
    } HTTP_FILTER_CONTEXT, * PHTTP_FILTER_CONTEXT;

codeplex から PInvoke Assistant を使用しようとしましたが、機能させることができません。誰かが前にこのようなことをしたことがありますか? 誰でも上記の解決策を提供できますか?

訂正:正しい構造を追加

4

1 に答える 1

0

回答のコードに基づいて、次を使用する必要があります。

[DllImport(@"XyzISAPI.dll")]
public static extern uint HttpFilterProc(
    ref HttpFilterContext pfc, 
    uint notificationType, 
    IntPtr pvNotification
);

ネイティブ コードにはコンテキストへのポインタが渡されstruct、構造体を渡すことrefで簡単に一致させることができます。最後のパラメーターはLPVOIDであり、マネージ コードvoid*ではプレーンです。IntPtr

についてHTTP_FILTER_ACCESS_DENIEDは、次のように定義します。

[StructLayout(LayoutKind.Sequential)]
public struct HttpFilterAccessDenied
{
    IntPtr URL;
    IntPtr PhysicalPath;
    uint Reason;
}

次に、次のようなもののいずれかを取得できます。

HttpFilterAccessDenied hfad = (HttpFilterAccessDenied)Marshal.PtrToStructure(
    pvNotification, typeof(HttpFilterAccessDenied));

そして、structwithMarshal.PtrToStringUniまたはから文字列値を取得できますMarshal.PtrToStringAnsi

于 2012-04-27T12:52:52.243 に答える