
07.01.2013, 15:06
|
 |
Always hardcore!
|
|
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
|
|
Инди, как показала практика с одним моим парсером, любит падать и виснуть в самый неподходящий момент.
Решил переходом на WinHTTP, который имеет на порядок меньше ограничений, да и работает шустрее (WinAPI таки).
Пример кода (winhttp.pas брать тут):
Код:
uses
WinHTTP;
function LoadFile(server, url: WideString): WideString;
begin
var
hInet, hConn, hReq: Pointer;
buf: array of char;
bufSize, bufRead, p: cardinal;
begin
hInet := WinHttpOpen('UserAgent/1.0',0,nil,nil,0);
hConn := WinHttpConnect(hInet, PWideChar(server), INTERNET_DEFAULT_HTTP_PORT, 0);
hReq := nil;
repeat
if hReq <> nil then WinHttpCloseHandle(hReq);
repeat hReq := WinHttpOpenRequest(hConn, 'GET', PWideChar(url), 'HTTP/1.1', nil, nil, 0) until hReq <> nil;
while not WinHttpSendRequest(hReq, nil, 0, nil, 0, 0, 0) do;
until WinHttpReceiveResponse(hReq, nil);
bufSize := 0;
p := 0;
while WinHttpQueryDataAvailable(hReq, bufSize) do begin
SetLength(buf,p+bufSize);
if bufSize = 0 then break;
bufRead := 0;
WinHttpReadData(hReq, @buf[p], bufSize, bufRead);
inc(p,bufRead);
end;
WinHttpCloseHandle(hReq);
WinHttpCloseHandle(hConn);
WinHttpCloseHandle(hInet);
SetLength(buf,p+1);
Result := UTF8Decode(UTF8String(PChar(@buf[0])));
end;
procedure TForm1.Button1Click(Sender: TButton);
begin
MessageBoxW(0,PWideChar(LoadFile('delphisources.ru','/forum/index.php')),nil,0);
// Используем MessageBoxW для нормального отображения UTF-8
end;
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
|