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;
Работа с Internet
А мне нужно, чтобы устойчиво работало. И чтобы с любого компа можно было скачивать. Может лучше использовать другой компонент?
А мне нужно, чтобы устойчиво работало. И чтобы с любого компа можно было скачивать. Может лучше использовать другой компонент?[/quote]
покажи код: без него тебе вряд ли кто-то сможет сказать в чем проблема.
также поищи в исходниках там есть несколько примеров скачивания файлов, например http://sources.codenet.ru/download/641/kachalka.html. попробуй также воспользоваться поиском по форуму и есстественно http://google.ru.
Код:
В функции InternetOpen(..) вместо параметра INTERNET_OPEN_TYPE_PROXY можно указать INTERNET_OPEN_TYPE_PRECONFIG на случай, если извесно, что соединение есть с инетом или не надо проходить аутентификацию.
До переустановки WS на моем компе всё работало вне зависимости от параметра в InternetOpen(..). Даже в отсутствии подключения модем набирал номер и устанавливал соединение. А страницу скачивала программа, но после сильно зависала.
Сейчас ничего такого нет. strRead содержит страницу "ОШИБКА
Доступ к кэшу запрещён".
Может нужно брать информацию из реестра о прокси сервере ? Но я не знаю как.
Вот ссылочка с примерами. Все толково разжевано.
Вот окончательный вариант:
Код:
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;
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;
Протестировано и на одиночном компе с обычным модемом, и на компе, находящемся в локальной сети.
Считаю, что тему можно закрыть.
Например, с модемом:
Код:
//Возвращает состояние соединения
//( var lpdwFlags:Cardinal; dwReserved:Cardinal ):BOOLEAN;
lpdwFlags := INTERNET_CONNECTION_MODEM;
flag:=InternetGetConnectedState(@lpdwFlags,0);
if flag then
//Отсоединяет модем от линии.
InternetAutodialHangup(0);
//( 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