Po kliknięciu w button rozpoczyna się pobieranie pliku w Webbrowserze.
W jaki sposób mogę pobrać adres "aktualnie pobieranego pliku" z WebBrowsera ?
@kAzek
Nie rozumiem... czy w WebBrowser jest wyświetlana jakaś strona na której jest button i który klikasz aby zacząć pobieranie pliku i chcesz się dowiedzieć jaki plik pobierasz?
chodzi o to że stronka jest np taka:
www.mojastrona.pl
i na niej jest button, lecz po kliknięciu na button plik jest pobierany zamiast z:
mojastrona.pl
to np z jakiegoś IP typu:
68.543.12.88/plik.rar
i ja chce pobrać właśnie to IP, wraz z całą ścieżką do pliku...
czyli chce znać adres "aktualnie pobieranego pliku"...
sam button nie ma w sobie schowanego linku, gdyż podmienia link jakiś skrypt w JAVA
Java nie ma nic wspólnego z JavaScriptem.
tak czy inaczej chciałbym pobrać link do pliku z wyskakującego okienka zapisu/otwarcia pliku
@kAzek
W "normalnym" WebBrowser się nie da... ale obczaj to:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, SHDocVw, ActiveX, MSHTML, UrlMon;
const
IID_IDownloadManager: TGUID = '{988934A4-064B-11D3-BB80-00104B35E7F9}';
SID_SDownloadManager: TGUID = '{988934A4-064B-11D3-BB80-00104B35E7F9}';
type
IDownloadManager = interface(IUnknown)
['{988934A4-064B-11D3-BB80-00104B35E7F9}']
function Download(pmk: IMoniker; pbc: IBindCtx; dwBindVerb: DWORD;
grfBINDF: DWORD; pBindInfo: PBindInfo; pszHeaders: PWideChar;
pszRedir: PWideChar; uiCP: UINT): HRESULT; stdcall;
end;
TBeforeFileDownloadEvent = procedure(Sender: TObject; const FileSource: WideString;
var Allowed: Boolean) of object;
TWebBrowser = class(SHDocVw.TWebBrowser, IServiceProvider, IDownloadManager)
private
FFileSource: WideString;
FOnBeforeFileDownload: TBeforeFileDownloadEvent;
function QueryService(const rsid, iid: TGUID; out Obj): HRESULT; stdcall;
function Download(pmk: IMoniker; pbc: IBindCtx; dwBindVerb: DWORD;
grfBINDF: DWORD; pBindInfo: PBindInfo; pszHeaders: PWideChar;
pszRedir: PWideChar; uiCP: UINT): HRESULT; stdcall;
protected
procedure InvokeEvent(ADispID: TDispID; var AParams: TDispParams); override;
published
property OnBeforeFileDownload: TBeforeFileDownloadEvent read FOnBeforeFileDownload write FOnBeforeFileDownload;
end;
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
procedure BeforeFileDownload(Sender: TObject; const FileSource: WideString; var Allowed: Boolean);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TWebBrowser }
function TWebBrowser.Download(pmk: IMoniker; pbc: IBindCtx; dwBindVerb,
grfBINDF: DWORD; pBindInfo: PBindInfo; pszHeaders, pszRedir: PWideChar;
uiCP: UINT): HRESULT;
var
Allowed: Boolean;
begin
Result := E_NOTIMPL;
if Assigned(FOnBeforeFileDownload) then
begin
Allowed := True;
if pszRedir <> '' then
FFileSource := pszRedir;
FOnBeforeFileDownload(Self, FFileSource, Allowed);
if not Allowed then
Result := S_OK;
end;
end;
procedure TWebBrowser.InvokeEvent(ADispID: TDispID; var AParams: TDispParams);
begin
inherited;
if ADispID = 250 then
FFileSource := OleVariant(AParams.rgvarg^[5]);
end;
function TWebBrowser.QueryService(const rsid, iid: TGUID; out Obj): HRESULT;
begin
Result := E_NOINTERFACE;
Pointer(Obj) := nil;
if Assigned(FOnBeforeFileDownload) and IsEqualCLSID(rsid, SID_SDownloadManager) and
IsEqualIID(iid, IID_IDownloadManager) then
begin
if Succeeded(QueryInterface(IID_IDownloadManager, Obj)) and
Assigned(Pointer(Obj))
then
Result := S_OK;
end;
end;
{TForm}
procedure TForm1.BeforeFileDownload(Sender: TObject; const FileSource: WideString;
var Allowed: Boolean);
begin
//tu masz nazwe pliku, mozesz tez zablokowac pobieranie
if Application.MessageBox(PAnsiChar('Czy pozwolic na pobranie pliku: ' + string(FileSource)),
nil, MB_ICONQUESTION or MB_YESNO) <> IDYES then
Allowed:= False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WebBrowser1.OnBeforeFileDownload := BeforeFileDownload;
WebBrowser1.Navigate('http://7-zip.org.pl/');
end;
end.
To dodaje dodatkowe zdarzenie OnBeforeFileDownload gdzie jako jeden z parametrów masz ścieżkę do pobieranego pliku, nawet na Twoje potrzeby można by tu skrócić nawet wyciąć IDownloadManager ale po co tak daje większe możliwości i jest to zrobione ładniej.
PS: Kod implementacji IDownloadManager nie jest mój tylko znaleziony jakiś czas temu nawet nie pamiętam gdzie.
EDIT:
Teraz zobaczyłem że to ma być w vb.NET... no niestety nie umiem przetłumaczyć tego na VB chyba że ktoś inny to przetłumaczy...
zlecę napisanie takiego programu
Nie napisałeś podstawowej informacji - ile płacisz?