Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#1

URL in die Bestandteile zerlegen

  Alt 3. Aug 2004, 15:35
Folgende Procedure zerlegt eine URL in Ihre Einzelbestandteile.
Entstanden ist der Code nach einer Anregung von MathiasSimmack.
Die Unit WinInet muss eingebunden werden.

Delphi-Quellcode:
type
   TEasyURLComponents = record
     Scheme, HostName: string;
     Port: Integer;
     User, Password, UrlPath, ExtraInfo: string;
   end;
procedure CrackURL(const URL: string; decode, escape: Boolean; var data: TEasyURLComponents );
var
  uc: TURLComponents;
  flags: Cardinal;
begin
  ZeroMemory(@uc, sizeof(uc));
  uc.dwStructSize := sizeof(TURLComponents);

  with data do
  begin
    SetLength(Scheme, 10);
    uc.lpszScheme := PChar(Scheme);
    uc.dwSchemeLength := Length(Scheme);

    SetLength(HostName, 200);
    uc.lpszHostName := PChar(HostName);
    uc.dwHostNameLength := Length(HostName);

    SetLength(User, 200);
    uc.lpszUserName := PChar(User);
    uc.dwUserNameLength := Length(User);

    SetLength(Password, 200);
    uc.lpszPassword := PChar(Password);
    uc.dwPasswordLength := Length(Password);

    SetLength(UrlPath, 1000);
    uc.lpszUrlPath := PChar(UrlPath);
    uc.dwUrlPathLength := Length(UrlPath);

    SetLength(ExtraInfo, 2000);
    uc.lpszExtraInfo := PChar(ExtraInfo);
    uc.dwExtraInfoLength:= Length(ExtraInfo);
  end;

  flags := 0;
  // Converts encoded characters back to their normal form.
  if decode then flags := flags or ICU_DECODE;

  // Converts all escape sequences (%xx) to their corresponding characters.
  if escape then flags := flags or ICU_ESCAPE;

  if not InternetCrackUrl(PChar(URL), Length(URL), flags, uc) then
    RaiseLastWin32Error;

  with data do
  begin
    SetLength(Scheme, uc.dwSchemeLength);
    SetLength(HostName, uc.dwHostNameLength);
    SetLength(User, uc.dwUserNameLength);
    SetLength(Password, uc.dwPasswordLength);
    SetLength(UrlPath, uc.dwUrlPathLength);
    SetLength(ExtraInfo, uc.dwExtraInfoLength);
    Port := uc.nPort;
  end;
end;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
Andreas
  Mit Zitat antworten Zitat