Nie wiem jak jest z Indy, bo Indy ssie, polecam użyć Synapse. Nie mam niestety doświadczenia w samodzielnym używaniu
protokołu TCP w zestawie tych modułów. Jednak zrobiłem test z komponentem THttpSend w bibliotece i wszystko działą ok.
Robisz tak (dla modułu httpsend). Pobierasz Synapse i do katalogu z projektem wrzucasz następujące pliki *.pas z kodem:
blcksock.pas
httpsend.pas
sswin32.pas
synacode.pas
synafpc.pas
synaip.pas
synautil.pas
synsock.pas
Następnie kod mojej dllki o nazwie synatest.dll wygląda następująco:
library synatest;
uses
httpsend;
procedure DownloadToFile(const URL : PChar; const FileName : PChar);
const
Location_Prefix = 'Location:' + #32;
Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.6.30 Version/10.60';
var
SynHttp : THttpSend;
I, Position : integer;
Str, DirectLink : PChar;
begin
SynHttp := THttpSend.Create;
try
SynHttp.UserAgent := Opera_UserAgent;
SynHttp.HTTPMethod('GET', Url);
DirectLink := '';
case SynHttp.ResultCode of
301, 302 :
begin
for I := 0 to SynHttp.Headers.Count - 1 do
begin
Str := PChar(SynHttp.Headers[I]);
Position := Pos(Location_Prefix, Str);
if Position > 0 then
begin
DirectLink := PChar(Copy(Str, Position + Length(Location_Prefix), MaxInt));
Break;
end;
end;
DownloadToFile(DirectLink, FileName);
end;
else
SynHttp.Document.SaveToFile(FileName);
end;
finally
SynHttp.Free;
end;
end;
exports
DownloadToFile;
begin
end.
Czyli standard. Trzeba pamiętać aby nie używać typów string tylko PChar. Następnie moja aplikacja konsolowa wygląda tak:
program main_app;
{$APPTYPE CONSOLE}
uses
Windows;
var
H : THandle;
DownloadToFile : procedure(const URL : PChar; const FileName : PChar);
begin
H := LoadLibrary('synatest.dll');
if H <> 0 then
begin
DownloadToFile := GetProcAddress(H, 'DownloadToFile');
if @DownloadToFile <> nil then
begin
DownloadToFile('http://www.google.com/index.html', 'D:\test.html');
end;
end;
end.
I wszystko działa ok. Nie wiem jak będzie z Indy, bo to dziwny pakiet i sprawiający problemy, ale powinno też zadziałać.
Jeżeli jednak nie zadziała dalej to potwierdza "doskonałośc" Indy i sugeruje aby zainteresować się Synapse. Pod adresem
http://www.ararat.cz/synapse/doku.php/download jest do pobrania cały pakiet z dokumentacją i przykładami. I są w nim
również komponenty pozwalające napisać klient - server TCP. Jednak jak już wspomniałem nie mam doświadczenia z nimi.