커맨드를 처리하는 멤버 함수는 CHttpServerContex 클래스 변수를 기본적으로 받아야 한다.
<html>
<body>
<form method=get action="http://localhost/isapi/isapitest.dll">
<input type=hidden name="MfcISAPICommand" value="sum">
<input type=text name="param1" value="10">
<input type=text name="param2" value="20">
<input type=submit value="폼 테스트">
</form>
</body>
</html>
/*
or
<html>
<body>
<form method=post action="http://localhost/isapi/isapitest.dll?sum">
<input type=text name="param1" value="10">
<input type=text name="param2" value="20">
<input type=submit value="폼 테스트">
</form>
</body>
</html>
*/
#pragma once
// IsapiTest.h - IIS(Internet Information Server)에 대한 헤더 파일입니다.
// IsapiTest Extension
#include "resource.h"
class CIsapiTestExtension : public CHttpServer
{
public:
CIsapiTestExtension();
~CIsapiTestExtension();
// 재정의
public:
virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer);
virtual BOOL TerminateExtension(DWORD dwFlags);
// TODO: 여기에 명령 처리기를 추가합니다.
// 예:
// <<
void Upload(CHttpServerContext* pCtxt, void* pData, DWORD dwBytes);
// >>
// <
void Sum(CHttpServerContext* pCtxt, int iParam1, int iParam2);
// >
void Default(CHttpServerContext* pCtxt);
DECLARE_PARSE_MAP()
};
// IsapiTest.cpp - ISAPI가 구현되어 있는 파일입니다.
// IsapiTest Extension
#include "stdafx.h"
#include "IsapiTest.h"
// 유일한 CWinApp 개체입니다.
// 참고: DLL에서 더 이상 MFC를 사용하지 않도록 프로젝트를 수정한다면
// 이 개체를 제거할 수 있습니다.
CWinApp theApp;
// 명령 구문 분석 맵입니다.
BEGIN_PARSE_MAP(CIsapiTestExtension, CHttpServer)
// TODO: 여기에 ON_PARSE_COMMAND() 및 ON_PARSE_COMMAND_PARAMS()를
// 삽입하여 명령에 연결합니다.
// 예:
// <<
ON_PARSE_COMMAND(Upload, CIsapiTestExtension, ITS_RAW)
// >>
// <
ON_PARSE_COMMAND(Sum, CIsapiTestExtension, ITS_I4 ITS_I4)
ON_PARSE_COMMAND_PARAMS("param1 param2")
// >
ON_PARSE_COMMAND(Default, CIsapiTestExtension, ITS_EMPTY)
DEFAULT_PARSE_COMMAND(Default, CIsapiTestExtension)
END_PARSE_MAP(CIsapiTestExtension)
// 유일한 CIsapiTestExtension 개체입니다.
CIsapiTestExtension theExtension;
// CIsapiTestExtension을(를) 구현합니다.
CIsapiTestExtension::CIsapiTestExtension()
{
}
CIsapiTestExtension::~CIsapiTestExtension()
{
}
BOOL CIsapiTestExtension::GetExtensionVersion(HSE_VERSION_INFO* pVer)
{
// 초기화를 위해 기본 구현을 호출합니다.
CHttpServer::GetExtensionVersion(pVer);
// 설명 문자열을 로드합니다.
TCHAR sz[HSE_MAX_EXT_DLL_NAME_LEN+1];
ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
IDS_SERVER, sz, HSE_MAX_EXT_DLL_NAME_LEN));
_tcscpy(pVer->lpszExtensionDesc, sz);
return TRUE;
}
BOOL CIsapiTestExtension::TerminateExtension(DWORD dwFlags)
{
// 확장이 종료되고 있습니다.
//TODO: 각 인스턴스에 대한 리소스를 모두 정리합니다.
return TRUE;
}
// CIsapiTestExtension 명령 처리기입니다.
void CIsapiTestExtension::Default(CHttpServerContext* pCtxt)
{
StartContent(pCtxt);
WriteTitle(pCtxt);
*pCtxt << _T("이 기본 메시지는 인터넷을 통해 생성되었습니다.");
*pCtxt << _T(" 서버 DLL 마법사입니다. CIsapiTestExtension::Default()을(를) 편집하십시오.");
*pCtxt << _T(" 변경하는 구현입니다.\r\n");
EndContent(pCtxt);
}
// <
void CIsapiTestExtension::Sum(CHttpServerContext* pCtxt, int iParam1, int iParam2)
{
StartContent(pCtxt);
WriteTitle(pCtxt);
// 매개 변수를 더한다
int iRet = iParam1 + iParam2;
// 문자열 버퍼
TCHAR tszValue[100] = {0,};
// 문자열 데이터를 response로 출력한다
*pCtxt << _itot(iParam1, tszValue, 10) << _T(" + ") << _itot(iParam2, tszValue, 10);
*pCtxt << _T(" = ") << _itot(iRet, tszValue, 10);
EndContent(pCtxt);
}
// >
// <<
void CIsapiTestExtension::Upload(CHttpServerContext* pCtxt, void* pData, DWORD dwBytes)
{
}
// >>