В Solution Explorer (Поиск решения) откройте узел проекта ATLServerAppIsapi. Затем откройте файл ATLServerAppIsapi.def. Обратите внимание, что этот проект экспортирует три стандартные функции из динамически подключаемой библиотеки (DLL) расширения интерфейса прикладного программирования Internet-сервера (ISAPI). Вот эти функции.
Кроме того, обратите внимание, что реализация каждой их этих функций находится в файле ATLServerAppIsapi.cpp. В каждом случае для работы с деталями просто используется объект theExtension. Типом данного объекта является ExtensionType, который определяется с помощью шаблона CIsapiExtension. Этот шаблон берет на себя всю скучную и вызывающую периодические ворчания работу, связанную с реализацией полнофункционального расширения интерфейса прикладного программирования Internet-сервера (ISAPI), в том числе и такие детали, как организация пула потоков и диспетчеризация запросов.
typedef CIsapiExtension <> ExtensionType;
// расширение ISAPI ATL Server ExtensionType theExtension;
// Делегировать экспорт ISAPI в theExtension
// extern "C"
DWORD WINAPI HttpExtensionProc (LPEXTENSION_CONTROL_
BLOCK IpECB)
{
return theExtension.HttpExtensionProc (IpECB}; }
extern "C"
BOOL WINAPI GetExtensionVersion (HSE_VERSION_INFO* pVer)
// ЛОГИЧЕСКИЙ МЕТОД
{
return theExtension.GetExtensionVersion (pVer); }
extern "C"
BOOL WINAPI TerminateExtension (DWORD dwFlags) // ЛОГИЧЕСКИЙ МЕТОД
{
return theExtension.TerminateExtension (dwFlags);
}
Структура EXTENSION_CONTROL_BLOCK, передаваемая в качестве параметра в показанную выше функцию HttpExtensionProc, содержит несколько примечательных членов. Самые важные члены этой структуры показаны в следующем определении типа. Конечно, проект ALTServerAppIsapi часто оставляют как он есть. И все же обратите внимание, что эту информацию об HTTP-запросе вполне можно использовать для выполнения нестандартной фильтрации.
typedef struct _EXTENSION_CONTROL_BLOCK {
HCONN ConnID; //in - уникальный номер от HTTP-сервера
DWORD dwHttpStatusCode; //out - состояние завершения
LPSTR IpszMethod; //in - требуемый метод
LPSTR IpszQueryString; //in - запрос информации
LPBYTE IpbData; //in - данные, посланные клиентом LPSTR IpszContentType; //in - совместимый тип данных
BOOL { WINAPI * WriteClient ) // записать ответ клиенту ( HCONN ConnID,
LPVOID Buffer, // Буфер LPDWORD IpdwBytes, DWORD dwReserved );
BOOL ( WINAPI * ReadClient ) // чтение запроса из HTTP ( HCONN ConnID, LPVOID IpvBuffer, LPDWORD IpdwSize );
} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;