2012-04-26 12 views
1

IIS6用に記述されたISAPIフィルタがあります。 IIS7のラッパーを作成してIIS6フィルターをラップする必要があります。私はC#でHTTPモジュールを作成し、アンマネージドdllメソッドをPinvokeする予定です。ISAPI関連のメソッドと構造体を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; 

、次のコードのC#の表現を必要とする私は、CodePlexのからのPInvokeアシスタントを使用してみましたが、私はそれを動作させることができないのです。 これまで誰もこのようなことをしていませんか? 誰でも上記の解決法を提供できますか?

訂正:ネイティブコードは、コンテキストstructへのポインタを渡され

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

とによって構造体を渡す:正しい構造では、次の使用する必要があなたの答えのコードに

答えて

0

ビルを追加しましたrefはそれを照合する簡単な方法です。最終的なパラメータはLPVOIDです。これはvoid*であり、管理コードではIntPtrです。

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

あなたは、このような人々の1入手することができます:

HTTP_FILTER_ACCESS_DENIEDについては、このようにそれを定義

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

をそして、あなたはstructから文字列値を手に入れることができますMarshal.PtrToStringUniまたはMarshal.PtrToStringAnsiである。

+0

ありがとうございました。これは、デバッグ時にPInvokeStackImbalance例外を解決しました。しかし、私はまだpvNotificationがゼロとして返されている。私は他の詳細を確認し、ここで更新します。 – GorillaCoder

+0

私はあなたの答えを投票することができません。 – GorillaCoder

+0

'' IntPtr.Zero'は 'pvNotification'パラメータに何も渡されないときに渡されます。あなたは投票に値するほどの評判はありませんが、あなたはそれを受け入れることができます。 –

関連する問題