Работа с Url в Delphi
Как получить активный url из браузера
Приводимая здесь функция показывает, как Ваше приложение может извлечь из браузера (ie или netscape) url , как, например, это делает аська.
Совместимость: delphi 4.x (или выше)
Не забудьте добавить ddeman в Ваш проект!
Собственно сам исходничек функции:
uses windows, ddeman, ......
function get_url(servicio: string): string;
var
cliente_dde: tddeclientconv;
temp:pchar; //<<-------------------------this is new
begin
result := '';
cliente_dde:= tddeclientconv.create( nil );
with cliente_dde do
begin
setlink( servicio,'www_getwindowinfo');
temp := requestdata('0xffffffff');
result := strpas(temp);
strdispose(temp); //<<-Предотвращаем утечку памяти
closelink;
end;
cliente_dde.free;
end;
procedure tform1.button1click(sender);
begin
showmessage(get_url('netscape'));
или
showmessage(get_url('iexplore'));
end;
Взять часть url, которая следует после названия сайта
{
internetcrackurl() takes a url as a parameter and breaks it down into components,
which are then accessible via the turlcomponents structure.
internetcrackurl() zerlegt eine url in seine komponenten, welche dann ьber die
turlcomponents struktur zugдnglich sind.
}
uses
wininet;
procedure tform1.button1click(sender: tobject);
var
aurlc: turlcomponents;
const
test_url = 'http://www.swissdelphicenter.ch/de/tipsindex.php';
begin
fillchar(aurlc, sizeof(turlcomponents), 0);
with aurlc do
begin
lpszscheme := nil;
dwschemelength := internet_max_scheme_length;
lpszhostname := nil;
dwhostnamelength := internet_max_host_name_length;
lpszusername := nil;
dwusernamelength := internet_max_user_name_length;
lpszpassword := nil;
dwpasswordlength := internet_max_password_length;
lpszurlpath := nil;
dwurlpathlength := internet_max_path_length;
lpszextrainfo := nil;
dwextrainfolength := internet_max_path_length;
dwstructsize := sizeof(aurlc);
end;
if internetcrackurl(pchar(test_url), length(test_url), 0, aurlc) then
begin
showmessage(aurlc.lpszurlpath);
end;
end;
Вывести типы url для internet explorer
uses registry;
procedure showtypedurls(urls: tstrings);
var
reg: tregistry;
s: tstringlist;
i: integer;
begin
reg := tregistry.create;
try
reg.rootkey := hkey_current_user;
if reg.openkey('softwaremicrosoftinternet explorertypedurls', false) then
begin
s := tstringlist.create;
try
reg.getvaluenames(s);
for i := 0 to s.count - 1 do
begin
urls.add(reg.readstring(s.strings));
end;
finally
s.free;
end;
reg.closekey;
end;
finally
reg.free;
end;
end;
procedure tform1.button1click(sender: tobject);
begin
showtypedurls(listbox1.items);
end;
Извлечь имя файла из строки url
function extracturlfilename(const aurl: string): string;
var
i: integer;
begin
i := lastdelimiter('/', aurl);
result := copy(aurl, i + 1, length(aurl) - (i));
end;
procedure tform1.button1click(sender: tobject);
var
s: string;
begin
s := extracturlfilename('http://www.delphimania.de/index.php');
showmessage(s); //index.php
end
Как захватить текущий url из окна internet explorer
Описываем две функции gettext и geturl:
function gettext(windowhandle: hwnd):string;
var
txtlength : integer;
buffer: string;
begin
txtlength := sendmessage(windowhandle, wm_gettextlength, 0, 0);
txtlength := txtlength + 1;
setlength (buffer, txtlength);
sendmessage (windowhandle,wm_gettext, txtlength, longint(@buffer[1]));
result := buffer;
end;
function geturl:string;
var
ie,toolbar,combo,
comboboxex,edit,
worker,toolbarwindow:hwnd;
begin
ie := findwindow(pchar('ieframe'),nil);
worker := findwindowex(ie,0,'workera',nil);
toolbar := findwindowex(worker,0,'rebarwindow32',nil);
comboboxex := findwindowex(toolbar, 0, 'comboboxex32', nil);
combo := findwindowex(comboboxex,0,'combobox',nil);
edit := findwindowex(combo,0,'edit',nil);
toolbarwindow := findwindowex(comboboxex, 0, 'toolbarwindow32', nil);
result := gettext(edit);
end;
Ну а затем пользуемся функцией geturl, например, можем в поле ввода по нажатию на кнопку выводит текущий url:
procedure tform1.button1click(sender: tobject);
begin
edit1.text := geturl;
end;
Как скачать любой url используя стандартные настройки сети
Начиная с internet explorer 3, microsoft поддерживает очень полезные api, wininet. Эти функции позволяют использовать все возможности ie, такие как настройки прокси, кэширование файлов и т.д.
Ниже приведён пример использования этих функций для скачивания файла с нужного url. Это может быть любой доступный url, ftp://, http://, gopher://, и т.д.
Более подробную информацию об этих функция можно посмотреть в msdn - win32 internet api functions.
function downloadfile(const url: string): string;
var
nethandle: hinternet;
urlhandle: hinternet;
buffer: array[0..1024] of char;
bytesread: cardinal;
begin
result := '';
nethandle := internetopen('delphi 5.x', internet_open_type_preconfig, nil, nil, 0);
if assigned(nethandle) then
begin
urlhandle := internetopenurl(nethandle, pchar(url), nil, 0, internet_flag_reload, 0);
{ urlhandle правильный? Начинаем загрузку }
if assigned(urlhandle) then
begin
fillchar(buffer, sizeof(buffer), 0);
repeat
result := result + buffer;
fillchar(buffer, sizeof(buffer), 0);
internetreadfile(urlhandle, @buffer, sizeof(buffer), bytesread);
until
bytesread = 0;
internetclosehandle(urlhandle);
end
else
begin
{ urlhandle неправильный. Генерируем исключительную ситуацию. }
raise exception.createfmt('cannot open url %s', );
end;
internetclosehandle(nethandle);
end
else
{ nethandle недопустимый. Генерируем исключительную ситуацию }
raise exception.create('unable to initialize wininet');
end;
//-------------------------------------------------
implementation
uses
sysutils,windows,shlobj;
function netshareadd(servername:pchar; //указатель на имя компьютера, например 'server'#0, если свой, то можно nil
level:word; //уровень структуры share_info, здесь 50
pshareinfo:pchar; //указатель на структуру share_info
parmerr:dword) //указатель на ???
:dword;stdcall;external 'svrapi.dll';//svrapi для win9x, netapi32 для nt
function netsharedel(servername:pchar;
netname:pchar;
reserved:dword):dword;stdcall;external 'svrapi.dll';
type
_share_info_50 = record //структура share уровня 50
netname: array [1..13] of char; //Как будет называться диск в сети
stype: byte; //тип =0 (stype_disktree) - шарить диски
flags: word; //флаги $0191,$0192,$0193....(доступ из сети)
remark: pchar; //указатель на комментарий, видимый из сети
path: pchar; //указатель на имя ресурса, например 'c:'#0
rw_password: array [1..9] of char; //пароль для полного доступа, если не нужен =#0
ro_password: array [1..9] of char; //пароль для доступа на чтение, если не нужен =#0
end;
//----------------------------
function setshareondisk(hostname,localpath:string; netname:tnetname;remark:string;
access:word;ro_passw,rw_passw:tpassw):boolean; var shareinfo:_share_info_50;
begin
result:=false;
strpcopy(@shareinfo.netname,netname);
shareinfo.stype:=0;
shareinfo.flags:=access;
shareinfo.remark:=pchar(remark);
shareinfo.path:=pchar(localpath);
strpcopy(@shareinfo.ro_password,ro_passw);
strpcopy(@shareinfo.rw_password,rw_passw);
shareresult:=netshareadd(pchar(hostname), 50,@shareinfo,$0000002a); //вызываем share
if shareresult <> 0 then //расшарить неудалось
exit;
shchangenotify(shcne_netshare,shcnf_path,pchar(localpath),nil); //сказать шеллу об изменениях
result:=true;
end;
//----------------------------
function removesharefromdisk(hostname, netname, localpath: string): boolean;
begin
result:=false;
shareresult:=netsharedel(pchar(hostname),pchar(netname),0); //удалить шару
if shareresult <> 0 then
exit;
shchangenotify(shcne_netunshare, shcnf_path,pchar(localpath),nil); //сказать шеллу об изменениях
result:=true;
end;
end.
Открыть url в новом окне, используя webbrowser
{
usually when you open a url in new window in twebbrowser it opens
the internet explorer. this tip creates a new instance of your
browser form and opens the new site in your browser.
}
procedure tform1.webbrowser1newwindow2(sender: tobject;
var ppdisp: idispatch; var cancel: wordbool);
var
newwindow: tform1;
begin
// a new instance of the form will be created
// eine neue instanz wird erstellt
newwindow := tform1.create(self);
newwindow.show;
ppdisp := newwindow.webbrowser1.defaultdispatch;
end;
Проверить существование определённого url
Данная функция позволяет Вам проверить существование определённого адреса(url) в интернете. Естественно она может пригодиться веб-мастерам, у которых на сайте много ссылок, и необходимо с определённой периодичнойстью эти ссылки проверять.
url может быть как с префиксом http:/ так и без него - эта функция добавляет префикс [url]http:// если он отсутствует (необходимо для функции internetopenurl которая так же поддерживает ftp:// и gopher://
Эта функция проверяет только два возвращаемых кода '200'(ОК) или '302' (Редирект), но Вы можете заставить проверять функцию и другие коды. Для этого достаточно модифицировать строчку "result := ".
uses wininet;
function checkurl(url: string): boolean;
var
hsession, hfile, hrequest: hinternet;
dwindex, dwcodelen: dword;
dwcode: array [1..20] of char;
res: pchar;
begin
if pos('http://', lowercase(url)) = 0 then
url := 'http://'+url;
result := false;
hsession := internetopen('ineturl:/1.0', internet_open_type_preconfig, nil, nil, 0);
if assigned(hsession) then
begin
hfile := internetopenurl(hsession, pchar(url), nil, 0, internet_flag_reload, 0);
dwindex := 0;
dwcodelen := 10;
httpqueryinfo(hfile, http_query_status_code, @dwcode, dwcodelen, dwindex);
res := pchar(@dwcode);
result := (res = '200') or (res = '302');
if assigned(hfile) then
internetclosehandle(hfile);
internetclosehandle(hsession);
end;
end;
Фильтровать все ссылки в tmemo
// for this tip you need memo1, listbox1, label1, button1.
procedure tform1.button1click(sender: tobject);
var
i, p: integer;
s: string;
begin
listbox1.clear;
for i := 0 to memo1.lines.count - 1 do
begin
if pos('http://', memo1.lines.strings) > 0 then
begin
s := '';
{if the current line contains a "http://", read on until a space is found
die aktuelle zeile wird nach der zeichenfolge "http://" durchsucht
und bei erfolg ab der gefundenen position ausgelesen, bis ein
leerzeichen auftritt...}
for p := pos('http://', memo1.lines.strings) to
length(memo1.lines.strings) do
if memo1.lines.strings
<> ' ' then
s := s + memo1.lines.strings
else
break;
{remove some characters if address doesn't end with a space
falls die gefundene adresse nicht mit einem leerzeichen abschlie?t,
werden hier noch anhangende textzeichen entfernt...}
while pos(s[length(s)], '..;!")]}?''>') > 0 do
delete(s, length(s), 1);
// add the address to the list...
//gefundene adresse in die liste aufnehmen...
listbox1.items.add(s);
end;
end;
// show the number of addresses in label1
// die zahl der gefundenen adressen in label1 anzeigen...
if listbox1.items.count > 0 then
label1.caption := inttostr(listbox1.items.count) +
' adresse(n) gefunden.'
else
label1.caption := 'keine adresse gefunden.';
end;
(* По материалам: http://www.swissdelphicenter.ch
http://http://www.sources.ru/ *)
procedure TForm.Button1
SetShareOnDisk (.............)
end;
Спасибо