グローバル HTTP モジュールの開発 (サンプルコード)

概要

ここでは IIS 7.0 ではじめて利用可能となった、グローバル HTTP モジュールの簡単なサンプル・プログラムを作成します。

開発環境は Visual C++ 2008 を想定しています。それ以前の環境ですと、ヘッダファイルが見つからないなどの エラーが発生する可能性がありますので気をつけてください。

ここでは統合開発環境を利用せずに Visual C++ 2008 のコマンドプロンプトを利用しています。 統合開発環境を利用する場合の方法は、また後ほど資料を作ろうと思います。

関連資料

  1. グローバル HTTP モジュールのインストール
  2. グローバル HTTP モジュールの動作確認

サンプルコード

コードの準備

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 にインストールしましょう。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説