2012-04-26 2 views
1

У меня есть фильтр ISAPI, написанный для IIS6. Теперь мне нужно написать оболочку для IIS7, чтобы обернуть фильтр IIS6. Я планирую написать HTTP-модуль в C# и Pinvoke неуправляемые методы dll.Как преобразовать методы и структуры, связанные с ISAPI, в C#

мне нужно 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; 

Я попытался с помощью PInvoke Assistant из CodePlex, но я не могу заставить его работать. Кто-нибудь сделал что-нибудь подобное раньше? Может ли кто-нибудь предоставить решение выше?

Исправления: Правильная структура добавлено

ответ

0

здания на коде в вашем ответе вы должны использовать следующее:

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

Нативный код передается указатель на контекст struct и пропускание-структуры с помощью ref - это простой способ сопоставить это. Конечным параметром является LPVOID, который равен void*, и это простой в управляемом коде.

Что касается HTTP_FILTER_ACCESS_DENIED, определим его следующим образом:

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

Вы можете получить один из тех, кто так:

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

И тогда вы можете разжиться строковых значений из struct с Marshal.PtrToStringUni или Marshal.PtrToStringAnsi.

+0

Спасибо. Это решило исключение PInvokeStackImbalance при отладке. Но у меня все еще есть pvNotification, возвращаемая как Zero. Я буду проверять другие детали, а затем обновлять здесь. – GorillaCoder

+0

Я не могу проголосовать за ваш ответ. – GorillaCoder

+0

'IntPtr.Zero' будет передан, когда в параметре' pvNotification' ничего не будет передано. У вас недостаточно репутации для голосования, но вы можете согласиться. –

Смежные вопросы