カスタムの ISAPI Extension を利用する方法 (IIS7 on Windows Vista)

IIS の機能を本当にフルに使いたいときは ISAPI の出番です!

ISAPI とは IIS が公開しているプログラミングインターフェイスです。
ISAPI の種類は大きく分けて (a) ISAPI エクステンションと (b) ISAPI フィルターの二種類。 簡単に言うと ISAPI エクステンションはいわゆる普通の CGI と同様です。ISAPI フィルターは IIS の動作そのものを変える時に使います。

さらにどんなことができるのかはさておき、とりあえずここでは基本となる ISAPI エクステンションの作り方を学びましょう。

ISAPI は C 言語で書く DLL として実装されます。

簡単な ISAPI Extension の作り方

  1. 以下のコードを TestIsapiExt.cpp として保存します。
    #include <httpext.h>
    #include <windows.h>
    
    
    #define HELLOWORLD_MESSAGE ( "Hello, world" )
    
    
    BOOL WINAPI GetExtensionVersion( LPHSE_VERSION_INFO pVer ) {
    
         pVer->dwExtensionVersion = MAKELONG( 0, 1 );
         lstrcpynA( 
              pVer->lpszExtensionDesc, 
              "Hello world - isapi", 
              HSE_MAX_EXT_DLL_NAME_LEN );
    
         return TRUE;
         
    }
    
    
    DWORD WINAPI HttpExtensionProc( LPEXTENSION_CONTROL_BLOCK lpECB ) {
    
         lpECB->ServerSupportFunction(
              lpECB->ConnID,
              HSE_REQ_SEND_RESPONSE_HEADER,
              NULL, 
              NULL, 
              (LPDWORD) "Content-type: text/html\r\n\r\n");
    
         DWORD dwBytes = lstrlenA ( HELLOWORLD_MESSAGE );
    
           lpECB->WriteClient(
              lpECB->ConnID, 
              (LPVOID) HELLOWORLD_MESSAGE, 
              &dwBytes, 
              HSE_IO_SYNC );
    
         return HSE_STATUS_SUCCESS;
    
    }
    
    
    BOOL WINAPI TerminateExtension( DWORD dwFlags ) {
    
         return TRUE;
    
    }
    
  2. 以下の内容を TestIsapiExt.def として保存します。
    
    LIBRARY TestIsapiExt
    
    EXPORTS
    	GetExtensionVersion
    	HttpExtensionProc
    	TerminateExtension
    
    
  3. 以下の内容を makefile として保存します。
    
    TARGETNAME=TestIsapiExt
    DEF_FILE=TestIsapiExt.def
    
    OUTDIR=.\chk
    
    ALL : "$(OUTDIR)\$(TARGETNAME).dll"
    
    
    # nmake clean
    CLEAN :
    	-@erase "$(OUTDIR)"
    
    "$(OUTDIR)" :
        if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
    
    CPP_PROJ=\
    	/nologo\
    	/MT\
    	/W4\
    	/Fo"$(OUTDIR)\\"\
    	/Fd"$(OUTDIR)\\"\
    	/c\
    	/Zi
    		
    LINK32=link.exe
    
    LINK32_FLAGS=\
    	/nologo\
    	/subsystem:windows\
    	/pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\
    	/debug\
    	/RELEASE\
    	/machine:I386\
    	/out:"$(OUTDIR)\$(TARGETNAME).dll"\
    	/DLL\
    	/DEF:"$(DEF_FILE)"
    	
    LINK32_OBJS= \
    	"$(OUTDIR)\$(TARGETNAME).obj"
    
    "$(OUTDIR)\$(TARGETNAME).dll" : "$(OUTDIR)" $(LINK32_OBJS)
        $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS)
    
    
    .cpp{$(OUTDIR)}.obj:
       $(CPP) $(CPP_PROJ) $<
    
    
  4. Visual Studio Command Prompt から nmake を実行する。
    
    > nmake -a
    
    Microsoft (R) Program Maintenance Utility Version 9.00.30729.01
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
            if not exist ".\chk/" mkdir ".\chk"
            cl  /nologo /MT /W4 /Fo".\chk\\" /Fd".\chk\\" /c /Zi "TestIsapiExt.cpp"
    TestIsapiExt.cpp
    TestIsapiExt.cpp(64) : warning C4100: 'dwFlags' : unreferenced formal parameter
            link.exe  /nologo /subsystem:windows /pdb:".\chk\TestIsapiExt.pdb" /debug /RELEASE 
            /machine:I386 /out:".\chk\TestIsapiExt.dll" /DLL /DEF:"TestIsapiExt.def" 
            ".\chk\TestIsapiExt.obj"
       Creating library .\chk\TestIsapiExt.lib and object .\chk\TestIsapiExt.exp
    
    
    
    これで chk ディレクトリに TestIsapiExt.dll が作成されます。
  5. TestIsapiExt.dll を C:\inetpub\wwwroot にコピーする。

ISAPI を有効にする

  1. コントロールパネルのPrograms and Features を開き Turn Windows features on or offISAPI Extensions がチェックされていることを確認する。

  2. IIS マネージャでハンドラマッピングの設定を開く

  3. ISAPI-dll を選び、Edit Feature Permissions... をクリックする

  4. Execute をチェックして OK をクリックする

  5. IIS Manager でサーバーを選択して、ISAPI and CGI Restrictions を選択して Open Feature をクリックする

  6. Add... をクリックする

  7. 作成した ISAPI Extension (DLL) のパスとディスクリプションを入力及び Allow extension path to execute をチェックして、OK をクリックする


    この設定で ISAPI Extension が動作するはずです。

  8. ブラウザから動作を確認する

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

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