ホームページのソースを読み出すプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シノニム

ホームページのソースを読み出すプログラム

#1

投稿記事 by シノニム » 15年前

いつもお世話になっております
先日ネットワークプログラムの件で質問させていただき、みなさんにこころよく協力していただきました

とりあえずチャットプログラムを・・・と思ったんですが、チャット以前にネットワークの知識がないので、『猫でもわかるネットワークプログラミング』という参考書を購入し、読み進めているところです

が・・・早くも第2章でつまづきまして・・・
タイトルの通りのコンソールアプリを(ソースは参考書に載っていたのでそれを打ち込んだ)作ったんですが、実行はできるものの上手く動作していないようで、質問させていただきました

ソースは以下の通りです
#include <stdio.h>
#include <windows.h>
#include <wininet.h>

#pragma comment(lib, "wininet.lib"    )        // WinInet.Lib


int main()
{
    HINTERNET hInet, hUrl;
    char szBuf[128], szUrl[128], *lpszSrc;
    DWORD dwRead, dwTotal = 0;
    HGLOBAL hMem;

    // 目的のURLの入力
    printf("URL -> ");
    gets_s(szUrl);

    // インターネット(WinInet)開始
    hInet = InternetOpen((LPCWSTR)"test_winInet", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); // チェック1
    if (hInet == NULL)
    {
        perror("オープンエラー\n");
        return -2;
    }

    // HTTPセッションの開始、指定のURLオープン
    hUrl = InternetOpenUrl(hInet, (LPCWSTR)szUrl, NULL, 0, 0, 0); // チェック2
    if (hUrl == NULL)
    {
        perror("URLオープンエラー\n");
        InternetCloseHandle(hInet);
        return -3;
    }

    // lpszSrsに1バイトのみ確保
    hMem = GlobalAlloc(GHND, 1);
    lpszSrc = (char *)GlobalLock(hMem);

    // 読み出すものがなくなるまで読み出す
    while (1)
    {
        InternetReadFile(hUrl, szBuf, (DWORD)sizeof(szBuf) - 1, &dwRead);
        szBuf[dwRead] = '\0';

        // 読み出すものがなくなったのでループ脱出
        if (dwRead == 0)    break;

        // 必要バイト数の計算
        dwTotal += dwRead;

        // 確保領域の大きさ変更
        hMem = GlobalReAlloc(hMem, dwTotal + 1, GMEM_MOVEABLE);
        if (hMem == NULL)
        {
            perror("再アロケート失敗\n");
        }
        lpszSrc = (char *)GlobalLock(hMem);
        if (lpszSrc == NULL)
        {
            perror("メモリ確保に失敗\n");
            break;
        }

        strcat(lpszSrc, szBuf);

    }    // while (1)


    // ソースの表示
    printf("%s\n", lpszSrc);

    // メモリの解放
    GlobalUnlock(hMem);
    GlobalFree(hMem);

    // インターネットハンドルの解放
    InternetCloseHandle(hUrl);
    InternetCloseHandle(hInet);

    return 0;
}
チェック1の第1引数と、チェック2の第2引数はエラーが出たため自分なりにキャストしてみました

OS:windowsXP
C++

どなたかお力添えをお願いします

softya

Re:ホームページのソースを読み出すプログラム

#2

投稿記事 by softya » 15年前

その無理矢理なキャストが動かない原因です。
VisualStudioは2005からUNICODEで使うことがデフェルトになりました。
『猫でもわかるネットワークプログラミング』たぶんマルチバイト文字(SJIS)でのコーディング例になっていると思います。

UNICODEについてはこちら。
http://yy2.sakura.ne.jp/006_vccp_unicod ... icode.html
で、真ん中辺りに出てくるプロパティに文字セットってのがあると思いますが、これをマルチバイト文字に切り替えることで元のままコンパイルがとおり動くようになると思います。
まぁ、今後のためにはUNICODEでのプログラミングを覚えた方が良いので、UNICODEにも挑戦してみて欲しいですが、そちらはまぁまず動いてからと言うことで。

シノニム

Re:ホームページのソースを読み出すプログラム

#3

投稿記事 by シノニム » 15年前

softyaさんありがとうございます!
おかげでちゃんと動作するようになりました

UNICODEでのプログラミングですか・・・とりあえずこのようなミスをすることがなくなって、時間があるときにでも少し触ってみようと思います。ご意見と指摘、ありがとうございました

dic

Re:ホームページのソースを読み出すプログラム

#4

投稿記事 by dic » 15年前

その本アルゴリズム自体に問題あったよ

チェックしてみましたが、きちんと動くようですね
修正してるようですね 画像

閉鎖

“C言語何でも質問掲示板” へ戻る