| |||||||||||||||||||||
サイト内検索
カスタム検索
|
グローバル 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 にインストールしましょう。 | ||||||||||||||||||||
© 2008-2010 小山圭介 All Rights Reserved. |
|||||||||||||||||||||