Šta je novo?

WinInet & Delphi

soulfly

Čuven
Učlanjen(a)
01.03.2002
Poruke
527
Poena
619
Imam sledeci kod:

uses Wininet;

Function TfDLPage.GetInetFile(const 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;
sAppName := ExtractFileName(Application.ExeName);
hSession := InternetOpen(PChar(sAppName),
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;

procedure TfDLPage.cmdDLFileClick(Sender: TObject);
var
FileOnNet, LocalFileName: string;
begin
FileOnNet:= 'http://website.com/index.htm'; <<----
LocalFileName:='probni.htm';
if GetInetFile(FileOnNet,LocalFileName) = True then
ShowMessage('Download uspesan.')
else
ShowMessage('Greska...');
end;

--------------------------------------------------------

Program treba da preuzme root url sajta, znaci bez npr. index.htm. Kako da izvedem da se prvo otvori taj neki url, pri tome odredi koja je prva (default) stranica i onda ona download-uje?
Gledao sam dokumentaciju za WinInet, ali ne znam sta bi trebalo, mozda neki dodatni flag u pozivu InternetOpenUrl?
U VB-u .NET to radi dosta jednostavno:
dim req as httpwebrequest = http.webrequest.create(urlzaobradu)
dim resp as httpwebresponse = req.getresponse
pageresp = resp.responseuri.tostring()
Samo kad bi svi imali framework.
(Vidim da se tabovi koji postoje u kodu ne prikazuju...)
 
Cekaj, zar ti nije jednostavnije da imas TWebBrowser objekat, zadas mu URL (svejedno da li je root ili sa imenom fajla) i ono sta je objekat dobio od http servera se nalazi u Document propertiju?

TWebBrowser je wrapper oko SHDOCVW.DLL fajla i njega ima svaki windows koji ima InternetExplorer 4 ili veci. Cak i da ga nema, za deployment ti treba samo taj dll i lako se ukljuci u instalaciju.
 
Ok, hvala za savet. Ipak me i dalje interesuje da li postoji nacin da se to uradi samo pomocu wininet-a, kad vec imam tu f-ju za download.
E, taj properti je Document : IDispatch;
Ranije sam citao da je cela Automation stvar sa IDispatch-om, koji prosiruje IUnknown, uvedena u COM zbog scriptiing klijenata (?). On u stvari (Automation) daje COM-u jezicku nezavisnost (ovo ima vise smisla). Zbog toga je, npr. ovaj properti tog "tipa"? Sta uopste to znaci da treba da se uradi kada ja hocu da mu pristupim, a on je "tipa" interfejs?
IUnknown ima tri metoda: QueryInterface, AddRef i Release. Ako dobro pretpostavljam, AddRef se zapravo poziva sa:
Browser : TWebBrowser;
a Release sa:
Browser.Free;
Posto QueryInterface sluzi za "navigaciju" izmedju razlicitih interfejsa koje objekat podrzava, pretpostavljam da on u ovom slucaju nije bitan?
IDispatch prosiruje IUnknown i predstavlja objekat za tu automatizaciju, dodaje jos 4 metoda, od kojih najrazumnije zvuci Invoke, pri cijem pozivu klijent mora da posalje parametre kao niz varianta... mislim, primena?
Kako da pristupim IDispatch-u, tj. Document propertiju? Da li kroz Object tip podataka? Da li je pre tog pristupa ovo dovoljno:
Browser := TWebBrowser.Create(ime_parent_forme);
ili treba jos neki Create(OLE)Object?
 
Veoma je jednostavno, u stvari.
Kod:
var
    page : OleVariant;
begin
    page := WebBrowser.Document;
    page.Navigate(nekiurl...);
end;
Malo je teze snimiti to sto se dobije. Radim na tome... :type:
 
Poslednja izmena:
Nije baš najbrža reakcija, ali ću da stavim ovde i malo koda, ko zna, možda nekom zatreba ,) .
Znači, što se tiče snimanja otovrene stranice to ide ovako:
Kod:
type
  TWebBrowserSaveStyle = (wbsAll, wbsBodyHTML, wbsBodyText);
...
procedure TWebBrowserWrapper.InternalSaveBodyHTMLToStream(
  const Stream: TStream);
var
  HTMLStr: string;
  Doc: IHTMLDocument2;
  BodyElement: IHTMLElement;
begin
  Assert(Assigned(WebBrowser.Document));
  if WebBrowser.Document.QueryInterface(IHTMLDocument2, Doc) = S_OK then
  begin
    BodyElement := Doc.body;
    if Assigned(BodyElement) then
    begin
      HTMLStr := BodyElement.innerHTML;
      Stream.WriteBuffer(HTMLStr[1], Length(HTMLStr));
    end;
  end;
end;
-----------------------------------------------------------
procedure TWebBrowserWrapper.SaveToFile(const FileName: string;
  const Style: TWebBrowserSaveStyle);
var
  FileStream: TFileStream;
begin
  FileStream := TFileStream.Create(FileName, fmCreate);
  try
    SaveToStream(FileStream, Style);
  finally
    FileStream.Free;
  end;
end;
-----------------------------------------------------------
procedure TWebBrowserWrapper.SaveToStream(const Stream: TStream;
  const Style: TWebBrowserSaveStyle);
begin
  if Assigned(WebBrowser.Document) then
  begin
    case Style of
      wbsAll:      InternalSaveDocumentToStream(Stream);
      wbsBodyHTML: InternalSaveBodyHTMLToStream(Stream);
      wbsBodyText: InternalSaveBodyTextToStream(Stream);
    end;
  end;
end;
Ima i fina mogućnost recimo uzimanja samo body teksta uz pomoć IHTMLElementa. To sve može u jednu klasu, itd.
 
Poslednja izmena:
Nazad
Vrh Dno