グローバル HTTP モジュールの開発 (サンプルコード)
概要
ここでは IIS 7.0 ではじめて利用可能となった、グローバル HTTP モジュールの簡単なサンプル・プログラムを作成します。
開発環境は Visual C++ 2008 を想定しています。それ以前の環境ですと、ヘッダファイルが見つからないなどの エラーが発生する可能性がありますので気をつけてください。
ここでは統合開発環境を利用せずに Visual C++ 2008 のコマンドプロンプトを利用しています。 統合開発環境を利用する場合の方法は、また後ほど資料を作ろうと思います。
関連資料
サンプルコード
コードの準備
ghttpmod.h として以下を保存します。
#pragma once #include <windows.h> #include <httpserv.h> HRESULT __stdcall RegisterModule( DWORD dwServerVersion, IHttpModuleRegistrationInfo * pModuleInfo, IHttpServer * pGlobalInfo );
ghttpmod.cpp として以下を保存します。
#define _WINSOCKAPI_ #include "ghttpmod.h" #include "myglobalmod.h" HRESULT __stdcall RegisterModule( DWORD dwServerVersion, IHttpModuleRegistrationInfo * pModuleInfo, IHttpServer * pGlobalInfo ) { ::OutputDebugString( TEXT("RegisterModule\n") ); MyGlobalModule * pGlobalModule = new MyGlobalModule; if ( !pGlobalModule ) { return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); } // Set the global notifications and exit. return pModuleInfo->SetGlobalNotifications( pGlobalModule, GL_PRE_BEGIN_REQUEST ); }
myglobalmod.h として以下を保存します。
#pragma once #include <windows.h> #include <httpserv.h> class MyGlobalModule : public CGlobalModule { public: GLOBAL_NOTIFICATION_STATUS OnGlobalPreBeginRequest ( IPreBeginRequestProvider* pProvider ); VOID Terminate(); MyGlobalModule(); ~MyGlobalModule(); private: VOID WriteDebugTrace ( LPTSTR pszTrace ); };
myglobalmod.cpp として以下を保存します。
#define _WINSOCKAPI_ #include "myglobalmod.h" MyGlobalModule::MyGlobalModule(){ WriteDebugTrace ( TEXT( "MyGlobalModule::MyGlobalModule()" ) ); } MyGlobalModule::~MyGlobalModule(){ WriteDebugTrace ( TEXT( "MyGlobalModule::~MyGlobalModule()" ) ); } GLOBAL_NOTIFICATION_STATUS MyGlobalModule::OnGlobalPreBeginRequest ( IPreBeginRequestProvider * pProvider ){ WriteDebugTrace ( TEXT( "MyGlobalModule::OnGlobalPreBeginRequest()" ) ); IHttpContext* pIContext = pProvider->GetHttpContext(); if( !pIContext ) { WriteDebugTrace ( TEXT("pIContext == NULL!!") ); return GL_NOTIFICATION_CONTINUE; } IHttpRequest* pIRequest = pIContext->GetRequest(); if( !pIRequest ) { WriteDebugTrace ( TEXT("pIRequest == NULL!!") ); return GL_NOTIFICATION_CONTINUE; } HTTP_REQUEST* pRawHttpRequest = pIRequest->GetRawHttpRequest(); if( !pRawHttpRequest ) { WriteDebugTrace ( TEXT("pRawHttpRequest == NULL!!") ); return GL_NOTIFICATION_CONTINUE; } ::OutputDebugStringW( pRawHttpRequest->CookedUrl.pFullUrl ); return GL_NOTIFICATION_CONTINUE; } VOID MyGlobalModule::Terminate(){ WriteDebugTrace ( TEXT( "Terminate()" ) ); delete this; } VOID MyGlobalModule::WriteDebugTrace ( LPTSTR pszTrace ) { ::OutputDebugString ( (LPCTSTR) pszTrace ); }
ghttpmod.def として以下を保存します。
LIBRARY ghttpmod EXPORTS RegisterModule
makefile として以下を保存します。
TARGETNAME=ghttpmod DEFFILE=ghttpmod OUTDIR=.\chk LINK32=link.exe ALL : "$(OUTDIR)\$(TARGETNAME).dll" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" CPP_PROJ=\ /MT\ /W4\ /Fo"$(OUTDIR)\\"\ /Fd"$(OUTDIR)\\"\ /c\ /Gz\ /DUNICODE\ /D_UNICODE\ /D_WIN32_WINNT=0x0600\ /DWIN32 LINK32_FLAGS=\ /subsystem:windows\ /pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\ /debug\ /RELEASE\ /machine:I386\ /out:"$(OUTDIR)\$(TARGETNAME).dll"\ /DLL\ /DEF:$(DEFFILE).def LINK32_OBJS= \ "$(OUTDIR)\$(TARGETNAME).obj"\ "$(OUTDIR)\myglobalmod.obj" "$(OUTDIR)\$(TARGETNAME).dll" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS) .c{$(OUTDIR)}.obj:: $(CPP) $(CPP_PROJ) $< .cpp{$(OUTDIR)}.obj:: $(CPP) $(CPP_PROJ) $<
グローバルモジュールのビルド
上記コードを nmake でビルドすると、ghttpmod.dll という DLL ができます。
makefile や nmake でのビルド方法に慣れていない人は、当サイトの情報 makefile の書き方 等を見てください。また、ビルドするためには新しい Windows SDK がインストールされている環境でビルドする必要があります。 Visual C++ 2008 なら大丈夫のはずです。
それでは、ここで作成したグローバル HTTP モジュール DLL (ghttpmod.dll) を IIS 7.0 にインストールしましょう。