お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"[Wininet]InternetSetStatusCallback"



 usesにWininetを加えてください。Wininet.dllはInternet Explorerで使われ
ているDLLです。

procedure MyCallback(hInet: HINTERNET; dwcontex, dwInternetStatus: DWORD;
  lpvStatusInformation: Pointer; dwStatusInformationLength: DWORD); stdcall;
begin
  case dwInternetStatus of
    INTERNET_STATUS_RESOLVING_NAME:
      Form1.ListBox1.Items.Add('IPアドレスの取得中');
    INTERNET_STATUS_NAME_RESOLVED:
      Form1.ListBox1.Items.Add('IPアドレスを取得終了');
    INTERNET_STATUS_CONNECTING_TO_SERVER:
      Form1.ListBox1.Items.Add('サーバへ接続中');
    INTERNET_STATUS_CONNECTED_TO_SERVER:
      Form1.ListBox1.Items.Add('サーバへ接続終了');
    INTERNET_STATUS_SENDING_REQUEST:
      Form1.ListBox1.Items.Add('要求発行中');
    INTERNET_STATUS_REQUEST_SENT:
      Form1.ListBox1.Items.Add('要求発行終了');
    INTERNET_STATUS_RECEIVING_RESPONSE:
      Form1.ListBox1.Items.Add('サーバの応答を待機中');
    INTERNET_STATUS_RESPONSE_RECEIVED:
      Form1.ListBox1.Items.Add('サーバの応答終了');
    INTERNET_STATUS_REDIRECT:
      Form1.ListBox1.Items.Add('自動リダイレクトによる要求の転送中');
    INTERNET_STATUS_CLOSING_CONNECTION:
      Form1.ListBox1.Items.Add('サーバから切断中');
    INTERNET_STATUS_CONNECTION_CLOSED:
      Form1.ListBox1.Items.Add('サーバから切断終了');
    INTERNET_STATUS_HANDLE_CREATED:
      Form1.ListBox1.Items.Add('新規ハンドルが作成された');
    INTERNET_STATUS_HANDLE_CLOSING:
      Form1.ListBox1.Items.Add('ハンドルがクローズされた');
    INTERNET_STATUS_REQUEST_COMPLETE:
      Form1.ListBox1.Items.Add('非同期捜査が終了した');
  end;
  Sleep(500);  //ローカルでやる場合、これが無いと速すぎです。
  Form1.ListBox1.Update;
end;

function GetFileFromInternet(const AUrl:string; AStream:TStream): boolean;
var
  hSession, hConnect: hInternet;
  Buf: array[0..1023] of Char;
  ReadCount: Cardinal;
begin
  Result := False;
  hSession := InternetOpen(nil, INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if Integer(InternetSetStatusCallback(hSession, @MyCallback))
         = INTERNET_INVALID_STATUS_CALLBACK then
    begin
      ShowMessage('Fail ' + IntToStr(GetLastError));
      Exit;
    end;
    hConnect := InternetOpenUrl(hSession, PChar(AUrl), nil, 0, 0,
                  Integer(@MyCallBack));
    try
      while True do //ストリームに書き込み
      begin
        if not InternetReadFile(hConnect, @Buf, SizeOf(Buf), ReadCount) then
          Break;
        if ReadCount = 0 then
          Break
        else
        begin
          AStream.Write(Buf, ReadCount);
          Result := True;
        end;
      end;
    finally
      InternetCloseHandle(hConnect);
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

■使い方■
 FormにListBoxとMemoとButtonを1つ置いて下さい。

procedure TForm1.Button6Click(Sender: TObject);
var
  M: TMemoryStream;
begin
  ListBox1.Items.Clear;
//  if InternetAttemptConnect(0) = ERROR_SUCCESS then
  begin
    M := TMemoryStream.Create;
    try
      if GetFileFromInternet('http://www.inprise.co.jp/index.html', M) then
      begin
        M.Position := 0;
        Memo1.Lines.LoadFromStream(M);
      end else
        Memo1.Lines.Text := '失敗';
    finally
      M.Free;
    end;
  end;
end;

                                      00/06/09 (Fri) ぶんぶん鈴木

Original document by ぶんぶん鈴木    氏 ID:(EZA00106)


ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum