ホスタブルウェブコア (HWC) による IIS7 コア機能のホスト

概要

このページでは以下の構成のウェブサーバーを、IIS7 のホスタブルウェブコア (Hostable Web Core, HWC) を利用して、自前の EXE にて実行するサンプルを示します。

非常に簡単に Web サーバーの機能が実装できることがわかると思います。

設定ファイルのパスC:\Temp\HostedWebTest.config
Web のドキュメントルートC:\Temp\wwwroot
ポート番号8888
システムルートC:\Windows
表. このサンプルの設定・環境
(異なる箇所は読み替えてください)

サンプルコード

ディレクトリ C:\Temp\wwwroot に HTML ファイル index.htm を配置する。

以下のファイルを hostedweb.cpp として保存する。

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <hwebcore.h>


#define MYHOST_INET_PATH L"C:\\Windows\\System32\\inetsrv\\"
#define MYHOST_DLL_PATH  MYHOST_INET_PATH WEB_CORE_DLL_NAME
#define MYHOST_CONF_PATH L"C:\\Temp\\HostedWebTest.config"
#define MYHOST_INST_NAME L"MyTest!"



int __cdecl main( int argc, char* argv[] ) {


     HINSTANCE     hDLL;
     HRESULT          hr = S_OK;

     PFN_WEB_CORE_ACTIVATE pfnWebCoreActivate = NULL;
     PFN_WEB_CORE_SHUTDOWN pfnWebCoreShutdown = NULL;


     //
     // ウェブコア DLL をロードする
     //

     printf ( "Loading DLL..." ); 
     
     hDLL = ::LoadLibraryW( MYHOST_DLL_PATH );

     if ( !hDLL ) {
          printf( "Failed. gle = %u\n", GetLastError() );
          return 0;
     }

     printf( "OK\n" );


     //
     // "WebCoreActivate" のアドレスを取得する
     //

     printf ( "Getting WebCoreActivate address..." );
     
     pfnWebCoreActivate = 
          (PFN_WEB_CORE_ACTIVATE) GetProcAddress( 
               hDLL, 
               WEB_CORE_ACTIVATE_DLL_ENTRY );

     if ( !pfnWebCoreActivate ) {
          printf( "Failed. gle = %u\n", GetLastError() );
          FreeLibrary( hDLL );
          return 0;
     }

     printf( "OK\n" );


     //
     // "WebCoreShutdown" のアドレスを取得する
     //

     printf ( "Getting WebCoreShutdown address..." );
     
     pfnWebCoreShutdown = 
          (PFN_WEB_CORE_SHUTDOWN) GetProcAddress( 
               hDLL, 
               WEB_CORE_SHUTDOWN_DLL_ENTRY );

     if ( !pfnWebCoreShutdown ) {
          printf( "Failed. gle = %u\n", GetLastError() );
          FreeLibrary( hDLL );
          return 0;
     }

     printf( "OK\n" );


     //
     // ウェブコアをアクティブ化する	
     //

     printf( "Activating the Web core..." );

     hr = pfnWebCoreActivate( MYHOST_CONF_PATH , L"", MYHOST_INST_NAME );

     if ( FAILED(hr) ) {
          printf( "Failed. HRESULT = %x\n", hr );
          FreeLibrary( hDLL );
          return 0;
     }

     printf ( "OK\n" );


     //
     // ホスタブルウェブが実行中、ユーザーの入力を待つ
     //
     
     printf( "Press any key to shutdown the Web core...\n" );
     _getch();


     //
     // シャットダウンする
     //
     
     printf( "Shutting down the Web core..." );

     hr = pfnWebCoreShutdown( 0L );

     if ( FAILED(hr) ) {
          printf( "Failed. HRESULT = %x\n", hr );
     }
     else {
          printf( "OK\n" );
     }


     //
     // DLL を解放する
     //
     
     FreeLibrary( hDLL );

     return 1;

}

以下の内容を makefile として保存する。


TARGETNAME=hostedweb
OUTDIR=.\chk
LINK32=link.exe

ALL : "$(OUTDIR)\$(TARGETNAME).exe"


CPPFLAGS=\
	/nologo\
	/MT\
	/W4\
	/Fo"$(OUTDIR)\\"\
	/Fd"$(OUTDIR)\\"\
	/c\
	/Zi\
	/Gz\
	/DWIN32\
	/DUNICODE\
	/D_UNICODE\
	/D_CRTBLD\
	/D_WIN32_WINNT=0x0600
		
LINK32_FLAGS=\
	/nologo\
	/subsystem:console\
	/pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\
	/machine:I386\
	/out:"$(OUTDIR)\$(TARGETNAME).exe"\
	/DEBUG
	
LINK32_OBJS= \
	"$(OUTDIR)\$(TARGETNAME).obj"

"$(OUTDIR)\$(TARGETNAME).exe" : "$(OUTDIR)" $(LINK32_OBJS)
    $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS)

"$(OUTDIR)" :
    if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"

.c{$(OUTDIR)}.obj:
   $(CPP) $(CPPFLAGS) $< 

.cpp{$(OUTDIR)}.obj:
   $(CPP) $(CPPFLAGS) $<

構成ファイルは、%SYSTEMROOT%\System32\inetsrv\config にある applicationHost.config をコピーして、 C:\Temp に HostedWebTest.config という名前で作成します。

HostedWebTest.config 内の system.applicationHost 要素を以下の内容で書き換えます。

<system.applicationHost>
	<applicationPools>
		<add name="MyAppPool" />
	</applicationPools>
	<listenerAdapters>
		<add name="http" />
	</listenerAdapters>
	<sites>
		<site name="My Web Site" id="12345">
			<application path="/">
				<virtualDirectory
					path="/"
					physicalPath="c:\Temp\wwwroot" />
			</application>
			<bindings>
				<binding 
					protocol="http" 
					bindingInformation="*:8888:" />
			</bindings>
		</site>
		<applicationDefaults applicationPool="MyAppPool" />
		<virtualDirectoryDefaults allowSubDirConfig="true" />
	</sites>
	<webLimits />
</system.applicationHost>

Visual C++ 2008 の Visual Studio 2008 Command Prompt を開きます。hostedweb.cpp でインクルードしている hwebcore.h は Visual Studio 2005 以前の Visual Studio 付属の SDK には含まれていませんのでご注意ください。

上記、hostedweb.cpp と makefile を保存したディレクトリに移動して、nmake でビルドします。 nmake すると chk というサブディレクトリができ、その中に hostedweb.exe という実行可能ファイルが出来上がります。

動作確認します。chk ディレクトリに移動して hostedweb.exe を実行します。

> hostedweb.exe
Loading DLL...OK
Getting WebCoreActivate address...OK
Getting WebCoreShutdown address...OK
Activating the Web core...OK
Press any key to shutdown the Web core...

この状態で、ブラウザから localhost (自ホスト) のポート 8888 番に HTTP リクエストを要求します。

上図のように、C:\Temp\wwwroot に配置した HTML ファイルが返されれば成功です。

hostedweb.exe を実行中のコマンドプロンプトにて、任意のキーを押し、終了処理が確かに実行されることを確認します。

...
Press any key to shutdown the Web core...
Shutting down the Web core...OK

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

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