ホスタブルウェブコア (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