Web ページを TEXT 形式で表示

DOS モードで URL を指定して Web ページを TEXT 形式で表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの作成

  1. Win32 コンソールアプリケーション(InetGet)を作成します。
    フォルダーを作成して、ページの後部から InetGet.dsp をプロジェクトに格納して下さい。
    ソースプログラム(main.cpp)をプロジェクトに格納します。
    ダブルクリックで起動すると InetGet.vcproj に変換されます。
  2. ビルドを実行して InetGet.exe を作成します。
    [スタート][ファイル名を指定して実行] または [コマンド プロンプト] から次のようにタイプします。
    InetGet.exe にパスを通して下さい。(フルパスで指定、またはカレントディレクトリに設定)
    InetGet.exe http://www.yahoo.co.jp/
  3. www.yahoo.co.jp の index.html が TEXT 形式で表示されたら完成です。
    他のホームページも試してみて下さい。
    InetGet.exe http://www.yahoo.co.jp/
    InetGet.exe http://google.com/
    InetGet.exe http://dictionary.goo.ne.jp/
    InetGet.exe http://www.eonet.ne.jp/~maeda/

プログラムの説明

  1. Win32 コンソールアプリケーションモードでプログラミングしてみました。
    iostream.h と windows.h と wininet.h をインクルードして、wininet.lib をリンクします。
    hInet はインターネットハンドルで、hFile はインターネットファイルハンドルです。
    szBuf[1024] は入力バッファで dwSize に転送されたバイト数が格納されます。
        #include <iostream.h>
        #include <windows.h>
        #include <wininet.h>
    
        #pragma once
        #pragma comment(lib,"wininet.lib")
    
        HINTERNET   hInet = NULL;       //インターネットハンドル
        HINTERNET   hFile = NULL;       //インターネットファイルハンドル
        char        szBuf[1024];        //入力バッファ
        DWORD       dwSize;             //入力サイズ
        
  2. main() 関数でコマンドラインから指定された URL を受け取ります。
    Sleep(5000); はメッセージを確認するための時間です。
        int main( int argc, char *argv[] )
        {
            // パラメータチェック
            if(argc<2)
            {   cout << "コマンドラインパラメータとしてURLを入力してください。" << endl;
                cout << "例: InetGet.exe http://www.yahoo.co.jp/" << endl;
                Sleep(5000);
                return -1;
            }
        
  3. InternetOpen() でインターネットハンドラを作成します。
        // インターネットハンドラを作成
        hInet = InternetOpen(
            "WinInetSample",            //エージェント名(通常はブラウザバージョン等)
            INTERNET_OPEN_TYPE_DIRECT,  //接続タイプ(ここでは直接接続を使用)
            NULL,NULL,0);               //プロクシを使わない場合以下のパラメータは使用しない
        if (hInet==NULL)
        {   cout << "Internet Open Error" << endl;
            Sleep(5000);
            return -1;
        }
        
  4. InternetOpenUrl() でインターネット上のファイルを開きます。
        // インターネット上のファイルを開く
        hFile = InternetOpenUrl(
            hInet,                      //パイプに使うインターネットハンドル
            argv[1],                    //開くファイルの URL
            NULL,                       //送信するHTTPプロトコルヘッダを指定できるが、ここでは不使用
            0,                          //上記ヘッダの文字長
            INTERNET_FLAG_RELOAD,       //キャッシュを無視してインターネット上から再取得する
            0);
        if(hFile==NULL)
        {   InternetCloseHandle(hInet);
            cout << "Internet Open Url Error" << endl;
            Sleep(5000);
            return -1;
        }
        
  5. InternetReadFile() で1023バイトずつ転送します。
    dwSize が実際に転送されたバイト数で '\0' を付け加えて画面に表示します。
    dwSize がゼロになれば転送の終了です。
    cout バッファをフラッシュして終了です。
        while(TRUE == InternetReadFile(hFile,szBuf,1023,&dwSize))
        {   if (dwSize==0)  break;      //データが無くなったとき
            szBuf[dwSize] = '\0';       //表示のため、終端をつける
            cout << szBuf;              //出力
        }
        cout.flush();
        
  6. 使用したハンドラをクローズします。
    Sleep(5000); は表示された TEXT を確認するための時間です。
        // 使用したハンドラを破棄
        InternetCloseHandle(hFile);
        InternetCloseHandle(hInet);
    
        Sleep(5000);
        return 0;
        
  7. C# で同じようなプログラムを掲載しています。
    Web ページを TEXT 形式で表示
    また Cpp/CLI でも同様のアプリケーションを掲載しています。
    Web ページを TEXT 形式で表示

Apache のファイルを取得

  1. VAIO に構築した Apache を起動して確認します。
    1. [スタート][プログラム][Apache HTTP Server][Control Apache Server] から起動して下さい。
    2. IE を起動して http://localhost/ を実行すると Apache のページが表示されます。
      http://127.0.0.1/ (c:\Program File/Apache Group/Apache/htdocs)
    3. http://localhost/home/ で私のテストページが表示されます。
      (localhost/ = c:\Program File/Apache Group/Apache/htdocs)
    4. http://localhost/home/info.php で沢山の PHP 情報が表示されます。
  2. apache-tomcat(Java の Apache)を起動して確認します。
    1. 自宅マシンに構築した apache-tomcat にアクセスしてみます。
      "C:\tomcat\bin\tomcat7w.exe" を管理者として実行して下さい。
    2. 次のコマンドでファイルが取得出来ました。
      192.168.24.53 は apache-tomcat を構築したパソコンのIPアドレスです。
      Msg2Serv はサーブレットのファイル(Msg2Serv.class)です。
      InetGet.exe http://localhost:8080/hoge/hello.htm
      InetGet.exe http://192.168.24.53:8080/hoge/hello.htm
      InetGet.exe http://192.168.24.53:8080/hoge/jsp/HelloWorld.jsp
      InetGet.exe http://localhost:8080/
      InetGet.exe http://localhost:8080/applet/Msg2Serv
  3. 古い形式の InetGet.dsp です。形式が変わり無くなりそうなので、今のうちに記録しておきます。
    # Microsoft Developer Studio Project File - Name="InetGet" - Package Owner=<4>
    # Microsoft Developer Studio Generated Build File, Format Version 6.00
    # ** 編集しないでください **
    
    # TARGTYPE "Win32 (x86) Console Application" 0x0103
    
    CFG=InetGet - Win32 Debug
    !MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。
    !MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください
    !MESSAGE 
    !MESSAGE NMAKE /f "InetGet.mak".
    !MESSAGE 
    !MESSAGE NMAKE の実行時に構成を指定できます
    !MESSAGE コマンド ライン上でマクロの設定を定義します。例:
    !MESSAGE 
    !MESSAGE NMAKE /f "InetGet.mak" CFG="InetGet - Win32 Debug"
    !MESSAGE 
    !MESSAGE 選択可能なビルド モード:
    !MESSAGE 
    !MESSAGE "InetGet - Win32 Release" ("Win32 (x86) Console Application" 用)
    !MESSAGE "InetGet - Win32 Debug" ("Win32 (x86) Console Application" 用)
    !MESSAGE 
    
    # Begin Project
    # PROP AllowPerConfigDependencies 0
    # PROP Scc_ProjName ""
    # PROP Scc_LocalPath ""
    CPP=cl.exe
    RSC=rc.exe
    
    !IF  "$(CFG)" == "InetGet - Win32 Release"
    
    # PROP BASE Use_MFC 0
    # PROP BASE Use_Debug_Libraries 0
    # PROP BASE Output_Dir "Release"
    # PROP BASE Intermediate_Dir "Release"
    # PROP BASE Target_Dir ""
    # PROP Use_MFC 0
    # PROP Use_Debug_Libraries 0
    # PROP Output_Dir "Release"
    # PROP Intermediate_Dir "Release"
    # PROP Target_Dir ""
    # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
    # ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
    # ADD BASE RSC /l 0x411 /d "NDEBUG"
    # ADD RSC /l 0x411 /d "NDEBUG"
    BSC32=bscmake.exe
    # ADD BASE BSC32 /nologo
    # ADD BSC32 /nologo
    LINK32=link.exe
    # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
    # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
    
    !ELSEIF  "$(CFG)" == "InetGet - Win32 Debug"
    
    # PROP BASE Use_MFC 0
    # PROP BASE Use_Debug_Libraries 1
    # PROP BASE Output_Dir "Debug"
    # PROP BASE Intermediate_Dir "Debug"
    # PROP BASE Target_Dir ""
    # PROP Use_MFC 0
    # PROP Use_Debug_Libraries 1
    # PROP Output_Dir "Debug"
    # PROP Intermediate_Dir "Debug"
    # PROP Ignore_Export_Lib 0
    # PROP Target_Dir ""
    # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
    # ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
    # ADD BASE RSC /l 0x411 /d "_DEBUG"
    # ADD RSC /l 0x411 /d "_DEBUG"
    BSC32=bscmake.exe
    # ADD BASE BSC32 /nologo
    # ADD BSC32 /nologo
    LINK32=link.exe
    # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
    # ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
    
    !ENDIF 
    
    # Begin Target
    
    # Name "InetGet - Win32 Release"
    # Name "InetGet - Win32 Debug"
    # Begin Group "Source Files"
    
    # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
    # Begin Source File
    
    SOURCE=.\main.cpp
    # End Source File
    # End Group
    # Begin Group "Header Files"
    
    # PROP Default_Filter "h;hpp;hxx;hm;inl"
    # End Group
    # Begin Group "Resource Files"
    
    # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
    # End Group
    # End Target
    # End Project
    

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

超初心者のプログラム入門(Win32API C++)