Конференция "Сети" » Чтение файла по HTTP с помощью wininet. [D7, WinXP]
 
  • d@nger (13.05.08 13:40) [0]
    Здравствуйте! В своей программе реализовал проверку выхода новой версии программы. На сайте выложил текстовый файл с номером новой версии, который считывает программа и сравнивает с текущей версией и сообщает пользователю результат. Реализовал я это с помощью модуля wininet, и все вроде как работает, НО есть маленькая проблемка. Для проверки я делаю следующее. Запускаю программу и проверяю наличие новой версии...программа говорит что есть. Тогда выключаю интернет соединение и проверяю еще раз.... программа запомнив последний ответ выдает мне его снова, хотя я предусмотрел ответ на отсутствие интернет соединения. Тогда я закрываю программу и открываю снова...теперь программа отвечает правильно...то же самое происходит и на оборот... в конце процедуры я закрываю сессию...почему так происходит, никак не могу взять в толк... подскажите что не так... (код постом ниже)...
  • d@nger (13.05.08 13:41) [1]

    function TFmain.OpenInternet(Name: WideString): pointer;
    begin
     result:=InternetOpen(@Name[1],INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0);
    end;

    function Tfmain.Connect(hInternet : pointer): pointer;
    begin
     result:=nil;
     if hInternet=nil  then exit;
     result:=InternetConnect(hInternet, 'credcalc.narod.ru', INTERNET_DEFAULT_HTTP_PORT,
       'anonymous', nil, INTERNET_SERVICE_HTTP, 0, 0);
    end;

    function Tfmain.NewRequest(fURL : WideString; hConnect: pointer): pointer;
    begin
     result := nil;
     if hConnect = nil then exit;
     result := HTTPopenRequestW(hConnect, nil, @fURL[1], nil, nil, nil,
                               INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD, 0);
    end;

    function tfmain.SendRequest(hRequest: pointer): boolean;
    begin
     result := false;
     if hRequest = nil then exit;
     result := HTTPsendRequestW(hRequest,nil, 0, nil, 0);
    end;

    function tfmain.DataAvailable(hRequest: pointer; out Size : cardinal): boolean;
    begin
     result := wininet.InternetQueryDataAvailable(hRequest, Size, 0, 0);
    end;

    function HttpQueryInfoW(hRequest: HINTERNET; dwInfoLevel: DWORD;
     lpvBuffer: Pointer; var lpdwBufferLength: DWORD;
     lpdwReserved: pointer): BOOL; stdcall;
               external 'wininet.dll' name 'HttpQueryInfoW';

    function tfmain.SizeQuery(hRequest: pointer; out Size:cardinal):boolean;
    var RSize:cardinal;
    begin
     RSize:=4;
     result := HttpQueryInfoW(hRequest, HTTP_QUERY_CONTENT_LENGTH or HTTP_QUERY_FLAG_NUMBER,
                      @Size,RSize, nil);
     if not result then Size:=0;
    end;

    procedure tfmain.CloseURL(hURL : pointer);
    begin
     InternetCloseHandle(hURL);
    end;

    function tfmain.ReadURL(fURL : WideString; var openresurs:boolean): WideString;
    var hInternet,hConnect,hRequest:pointer;
       I,L,Size,ReadedSize:cardinal;
       B:boolean;
       Buff:ANSIString;
    begin
     result:='';
     openresurs:=true;
    //  fpleasewait.Panel1.Caption:='';
     hInternet:=OpenInternet('CredCalc Update');
     if not assigned(hinternet) then begin openresurs:=false; exit;end;
     hConnect:=Connect(hInternet);
     if not assigned(hConnect) then begin openresurs:=false; exit;end;
     hRequest:=NewRequest(furl, hConnect);
     if not assigned(hrequest) then begin openresurs:=false; exit;end;
     openresurs:=SendRequest(hRequest);
     if NOT openresurs then
     begin
      if hRequest<>nil then CloseURL(hRequest);
      if hConnect<>nil then CloseURL(hConnect);
      if hInternet<>nil then CloseURL(hInternet);
      exit;
     end;

     SizeQuery(hRequest, Size);
     inc(Size);
     SetLength(Buff, Size);
     B:=false;
     I:=1;

     while true do
     begin
       DataAvailable(hRequest, L);
       if L = 0 then break;
       if (I + L) > Size then SetLength(Buff, I + L);
       B := wininet.InternetReadFile(hRequest, @Buff[I], L, ReadedSize);
       if NOT B then break;
       inc(I, ReadedSize);
     end;

     Buff[I]:=#0;
     showmessage('ded');
     CloseURL(hRequest);
     CloseURL(hConnect);
     CloseURL(hInternet);
     {$Ifdef FILE_DEBUG_OUTPUT}
     SetFile('tmp.txt', 'error');
     {$ENDIF}
     if B then
     begin
       result := WideString(Buff);
       {$Ifdef FILE_DEBUG_OUTPUT}
       SetFile('tmp.txt', result);
       {$ENDIF}
     end else result:='';
    end;

  • piople © (15.05.08 05:08) [2]
    А что мешает перед попыткой проверить файл отправить Ping твоего сервера? Если все норм то ты проверяешь файл, в противном случае - "Невозможно соедениться с сервером".
  • Slym © (15.05.08 05:23) [3]
    piople ©   (15.05.08 5:08) [2]
    тупиковый ход: HTTPProxy, SOCKS, freecap - через них пинг может не проканать, это раз.... Два это: хост не обязан отвечать на пинги, но может поддерживать HTTP сервер
  • Slym © (15.05.08 05:26) [4]
    я понимаю что процедурный язык, что ООП всякие, но зачем так часто и не по месту? Оформи все в одну функцию (даже не в метод), закрывай все хендлы в конце проседуры... может и заработает как надо
  • piople © (15.05.08 05:30) [5]

    > HTTPProxy, SOCKS, freecap

    Исходник посмотрите и увидите что поддерждку прокси он все равно не реализовывал


    >  Два это: хост не обязан отвечать на пинги

    Опять же в сырцах он коннектится на 'credcalc.narod.ru' он пингуется )
  • TForumHelp © (25.05.08 15:32) [6]
    попробуй так

    function GetInetFile(fileURL, FileName: String): boolean;
    const BufferSize = 1024;
    var
     hSession, hURL: HInternet;
     Buffer: array[1..BufferSize] of Byte;
     BufferLen: DWORD;
     f: File;
     sAppName: string;
    begin
    Result:=False;
    hSession := InternetOpen(PChar('IE'),
                   INTERNET_OPEN_TYPE_PRECONFIG,
                  nil, nil, 0);
    try
     hURL := InternetOpenURL(hSession,
               PChar(fileURL),
               nil,0,0,0);
     try
      AssignFile(f, FileName);
      Rewrite(f,1);
      repeat
       InternetReadFile(hURL, @Buffer,
                        SizeOf(Buffer), BufferLen);
       BlockWrite(f, Buffer, BufferLen)
      until BufferLen = 0;
      CloseFile(f);
      Result:=True;
     finally
      InternetCloseHandle(hURL)
     end
    finally
     InternetCloseHandle(hSession)
    end
    end;

    function CheckInetUrlExist(url: string): boolean;
    var
     NetHandle: HINTERNET;
     UrlHandle: HINTERNET;
    begin
     Result := False;
     NetHandle := InternetOpen(PChar('IE'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
     if Assigned(NetHandle) then begin
     UrlHandle := InternetOpenUrl(NetHandle, PChar(Url), nil, 0, INTERNET_FLAG_RELOAD, 0);
     if Assigned(UrlHandle) then begin
     Result := True;
     End;
     End;
     InternetCloseHandle(NetHandle);
     InternetCloseHandle(UrlHandle);
    end;

 
Конференция "Сети" » Чтение файла по HTTP с помощью wininet. [D7, WinXP]
Есть новые Нет новых   [134432   +20][b:0][p:0.003]