VCでWEB上のソースを所得するには?

解決


つぼ  2006-05-11 06:45:27  No: 61754

VC2005を使用して、WEB上のホームページのソースを取るにはどうしたらよいのでしょうか?
printf("%s\n",lpszBuf);でlpszbufの中を見ても何も表示されません。ビルドはできています。
ちなみにBolandを使用しているときはWEBのソースをとることができていました。

#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet.lib")

HINTERNET hInet;
HINTERNET hFile;
LPTSTR lpszBuf;
DWORD dwSize;
char *str3="TEST",*str4="http://www.yahoo.co.jp";
LPCWSTR hi = reinterpret_cast<LPCWSTR>(str3);
LPCWSTR hf = reinterpret_cast<LPCWSTR>(str4);

lpszBuf=(LPTSTR)GlobalAlloc(GPTR,1024);
hInet=InternetOpen(hi,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
hFile=InternetOpenUrl(hInet,hf,NULL,0,INTERNET_FLAG_RELOAD,0);
InternetReadFile(hFile,lpszBuf,1023,&dwSize);

・・・・        

他の方法でもいいので、VCでWEB上のソースを所得する方法をご指導ください。


michi  2006-05-11 07:47:30  No: 61755

インターネットうんぬんよりもひとつ思ったのは、

> char *str3="TEST",*str4="http://www.yahoo.co.jp";
> LPCWSTR hi = reinterpret_cast<LPCWSTR>(str3);
> LPCWSTR hf = reinterpret_cast<LPCWSTR>(str4);

なぜ、わざわざchar*からLPCWSTRへのキャストをしているかです。
reinterpret_castは本当に型のみを変換するだけで、
実際にデータをワイド文字に変換してくれてはいませんよ。


つぼ  2006-05-11 09:26:15  No: 61756

返信ありがとうございます。
キャストした理由としては、キャストをおこなわないと以下のようなエラー文がでてしまいます。

'const char [5]' から 'LPCWSTR' に変換できません。
1> 指示された型は関連がありません。変換には reinterpret_cast、C スタイル キャストまたは関数スタイルのキャストが必要です。

>実際にデータをワイド文字に変換してくれてはいませんよ。
ワイド文字をcharなどにいれることは可能なのでしょうか?


michi  2006-05-11 09:44:37  No: 61757

> 'const char [5]' から 'LPCWSTR' に変換できません。
つまりこの関数はワイド文字列を要求しているということです。

型が合わないからといってreinterpret_castを使うのは危険です。それは本当に単に型を変換しただけであって正しいデータに変換してくれてはいません。そういう使い方するとそもそもコンパイラが型チェックしてくれている意味がないです。(reinterpret_castが必要になることはありますが今回のような使い方はダメです)

今回の場合は正しいワイド文字列を関数に渡してください。

http://wisdom.sakura.ne.jp/programming/c/c63.html

UNICODE tchar.h TCHAR LPCTSTR wchar_tなどの用語で検索すればワイド文字についていろいろでてきますよ。


Blue  2006-05-11 10:14:24  No: 61758

ちなみに
> printf("%s\n",lpszBuf);でlpszbufの中を見ても何も表示されません。
では表示されないのは当然です。

lpszbuf は LPTSTR型(TCHAR*型)です。
printfの%sの指定はchar型文字列を表示します。TCHAR型文字列ではありません。

ということで、TCHAR文字列用の _tprintf を使うようにしてください。
(当然、書式指定文字列は _Tマクロを使います。)

Bolandでコンパイルしたときのソースをなるべく変更したくないのであれば、
メニューのプロジェクト→プロパティを選択し、
構成プロパティ→全般→プロジェクトの規定値の文字セットを
「Unicode文字セットを使用する」から「マルチバイト文字セットを使用する」に変更してコンパイルしてください。

# VC2005から文字コードの設定が変わり、今まで TCHAR の意味をシラナイで
# 使っていた人が次々と明るみに出ているようです。


Blue  2006-05-11 11:10:31  No: 61759

ところで、Yahooのトップページは euc-jp でソースが書かれているようですけど、普通にInternetReadFileWで大丈夫なんだろうか。。。

> 他の方法でもいいので、VCでWEB上のソースを所得する方法をご指導ください。
ということなので、勉強のために C++/CLI で。

// 参考:http://ukamen.hp.infoseek.co.jp/Programming1/WebAccess/
#using <System.dll>

using namespace System;

int main( array< String^ >^ args )
{
    IO::Stream^ stream = nullptr;
    IO::StreamReader^ textReader = nullptr;

    try
    {
        Net::WebRequest^ req = Net::HttpWebRequest::Create( L"http://www.yahoo.co.jp" );
        Net::WebResponse^ res = req->GetResponse();

        stream = res->GetResponseStream();
        textReader = gcnew IO::StreamReader( stream, Text::Encoding::GetEncoding( L"euc-jp" ) );

        String^ line;
        while ( line = textReader->ReadLine() )
        {
            Console::WriteLine( line );
        }
    }
    catch ( Exception^ ex )
    {
        Console::WriteLine( ex->Message );
    }
    finally
    {
        if ( textReader != nullptr ) textReader->Close();
        if ( stream != nullptr ) stream->Close();
    }

    return 0;
}


つぼ  2006-05-15 18:37:05  No: 61760

michiさん、Blueさん
解決しました。無事ソースを取ることができました。本当にありがとうございました。今回は急ぎのためあまり詳しく勉強できませんでしたが、文字列とWEBプログラミングについては今後勉強していきたいと思います。
y


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加