Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа с Internet

9.7K
22 февраля 2007 года
oltzowwa
105 / / 15.02.2007
Привет всем! Помогите, пожалуйста. Мне нужно простым способом обеспечить соединение с интернетом для скачивания страниц. Я использую wininet, функции InternetOpen и InternetConnect. Но каждый раз работает по разному: то всё OK, то "Доступ к кэшу запрещён", то комп жутко зависает до тех пор, пока провод из модема не вытащу.

А мне нужно, чтобы устойчиво работало. И чтобы с любого компа можно было скачивать. Может лучше использовать другой компонент?
257
22 февраля 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=oltzowwa]Привет всем! Помогите, пожалуйста. Мне нужно простым способом обеспечить соединение с интернетом для скачивания страниц. Я использую wininet, функции InternetOpen и InternetConnect. Но каждый раз работает по разному: то всё OK, то "Доступ к кэшу запрещён", то комп жутко зависает до тех пор, пока провод из модема не вытащу.

А мне нужно, чтобы устойчиво работало. И чтобы с любого компа можно было скачивать. Может лучше использовать другой компонент?[/quote]
покажи код: без него тебе вряд ли кто-то сможет сказать в чем проблема.
также поищи в исходниках там есть несколько примеров скачивания файлов, например http://sources.codenet.ru/download/641/kachalka.html. попробуй также воспользоваться поиском по форуму и есстественно http://google.ru.
9.7K
23 февраля 2007 года
oltzowwa
105 / / 15.02.2007
Вот код:
Код:
BEGIN
    hHttpSession := InternetOpen('Get Page',        
                                 INTERNET_OPEN_TYPE_PROXY,  
                                 PChar('ami.nstu.ru:3128'),
                                 PChar('http://localhost; ami.nstu.ru; *.ami.nstu.ru; *.nstu.ru; *.interface.nsk.su'),
                                 0);
    httpConnect:=InternetConnect(hHttpSession,
                                 PChar(MainStr), //интернет сервер, например, google.ru
                                 80,      //порт
                                 PChar(User),    //пользователь
                                 PChar(Password),//Пароль
                                 INTERNET_SERVICE_HTTP  //тип сервиса доступа
                                 ,0,1);
    if Assigned(httpConnect) then
    begin
      try
      hReqUrl := HttpOpenRequest(httpConnect,
                                 nil,
                                 PChar(ObjectName),
                                 nil,
                                 PChar(MainStr),
                                 nil,
                                 INTERNET_FLAG_KEEP_CONNECTION,
                                 1);
      If Assigned(hReqUrl) Then
      Begin
        try
        If HttpSendRequest(hReqUrl,nil,0,nil,0) Then
        Begin
            try
            repeat
                InternetReadFile(hReqUrl,@Buffer,sizeof(Buffer),nRead);
                strRead:=strRead+string(Buffer);
            until nRead=0;
            finally
            end;
        End
        Else
        Begin
             ShowMessage('Ошибка. Страница не скачена.');
             Exit;
        End;
        finally InternetCloseHandle(hReqUrl);
        end;
      End
      else
      Begin
          ShowMessage('Ошибка. Страница не скачена.');
          Exit;
      End;
      finally
      InternetCloseHandle(httpConnect);
      InternetCloseHandle(hHttpSession);
      end;
    end;
  END;

В функции InternetOpen(..) вместо параметра INTERNET_OPEN_TYPE_PROXY можно указать INTERNET_OPEN_TYPE_PRECONFIG на случай, если извесно, что соединение есть с инетом или не надо проходить аутентификацию.

До переустановки WS на моем компе всё работало вне зависимости от параметра в InternetOpen(..). Даже в отсутствии подключения модем набирал номер и устанавливал соединение. А страницу скачивала программа, но после сильно зависала.

Сейчас ничего такого нет. strRead содержит страницу "ОШИБКА
Доступ к кэшу запрещён".

Может нужно брать информацию из реестра о прокси сервере ? Но я не знаю как.
9
24 февраля 2007 года
Lerkin
3.0K / / 25.03.2003
Вот ссылочка с примерами. Все толково разжевано.
9.7K
21 марта 2007 года
oltzowwa
105 / / 15.02.2007
Спасибо тем, кто помог, чем смог.
Вот окончательный вариант:
Код:
var
NetHandle        : HINTERNET;
ConnectHandle  : HINTERNET;
UrlHandle          : HINTERNET;
Buffer              : array[1..1024] of char;
BytesRead        : cardinal;
Url                   : string;
Adress             : Ansistring;
F                    : System.TextFile;
begin

Result := '';
NetHandle := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
 if Assigned(NetHandle) then
 begin
   ConnectHandle:= InternetConnect(NetHandle,
                             PChar(SiteURL),//URL ñàéòà. Â èìåíè ñàéòà íå äîëæíî áûòü ñèìâîëîâ «/»
                             INTERNET_DEFAULT_HTTP_PORT,//=80
                             PChar(user),
                             PChar(password),
                             INTERNET_SERVICE_HTTP, 0, 0);
   if Assigned(ConnectHandle) then
   begin
//hReqUrl := HttpOpenRequest(httpConnect, nil, PChar(ObjectName), nil, PChar(MainStr),nil , INTERNET_FLAG_KEEP_CONNECTION, 1);

    UrlHandle := HTTPOpenRequest(ConnectHandle,
                             nil,//ìåòîä GET
                             PChar(fURL),//èìÿ ôàéëà, ê êîòîðîìó îñóùåñòâëÿåòñÿ äîñòóï
                             nil, PChar(SiteURL), nil,
                            INTERNET_FLAG_KEEP_CONNECTION and
                            (INTERNET_FLAG_PRAGMA_NOCACHE or INTERNET_FLAG_RELOAD)
                             //and INTERNET_FLAG_KEEP_CONNECTION
                             , 0);
    if Assigned(UrlHandle) then
     // UrlHandle ïðàâèëüíûé? Íà÷èíàåì çàãðóçêó
     begin
          If HttpSendRequest(UrlHandle,nil,0,nil,0) Then
        begin
          FillChar(Buffer, SizeOf(Buffer), 0);
          BytesRead := 0;
          repeat
           InternetReadFile(UrlHandle, @Buffer, SizeOf(Buffer), BytesRead);
           Result := Result + Buffer;
           FillChar(Buffer, SizeOf(Buffer), 0);

          until BytesRead = 0;
          InternetCloseHandle(UrlHandle);
       end;
     end
     else
     begin
         // UrlHandle íåïðàâèëüíûé. Ãåíåðèðóåì èñêëþ÷èòåëüíóþ ñèòóàöèþ.
         raise Exception.CreateFmt('Cannot open URL %s', [Url]);
     end;
   InternetCloseHandle(ConnectHandle);
   end
   else raise Exception.Create('Cannot Connect');
   InternetCloseHandle(NetHandle);
end
else
   //NetHandle íåäîïóñòèìûé. Ãåíåðèðóåì èñêëþ÷èòåëüíóþ ñèòóàöèþ
   raise Exception.Create('Unable to initialize Wininet');

if result = '' then
begin
   result:='Âûáðàí àâòîíîìíûé ðåæèì';
end;

Adress:='';
Adress:=DoDir(allUrl);
AssignFile(F,Adress);
Rewrite(F);
Write(F,result);
CloseFile(F);

end;

Протестировано и на одиночном компе с обычным модемом, и на компе, находящемся в локальной сети.

Считаю, что тему можно закрыть.
9.7K
22 марта 2007 года
oltzowwa
105 / / 15.02.2007
Так же после скачивания для сбережения трафика можно отключить соединение с INETом
Например, с модемом:
 
Код:
//Возвращает состояние соединения
  //( var lpdwFlags:Cardinal; dwReserved:Cardinal ):BOOLEAN;
  lpdwFlags := INTERNET_CONNECTION_MODEM;
  flag:=InternetGetConnectedState(@lpdwFlags,0);
  if flag then
     //Отсоединяет модем от линии.
     InternetAutodialHangup(0);


Можно использовать вместо INTERNET_CONNECTION_MODEM:
INTERNET_CONNECTION_CONFIGURED
INTERNET_CONNECTION_LAN
INTERNET_CONNECTION_MODEM
INTERNET_CONNECTION_MODEM_BUSY
INTERNET_CONNECTION_OFFLINE
INTERNET_CONNECTION_PROXY
INTERNET_RAS_INSTALLED
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог