Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как скачать любой URL используя стандартные настройки сети

Delphi , Интернет и Сети , URL

Как скачать любой URL используя стандартные настройки сети


- Почему русские не выдвигаются в правительство Норвегии?
- А вы хотите, чтобы у вас был е-майл premier-ministr@gov.no?

Начиная с 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', [Url]);
    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.

Программа на Delphi!

Код содержит функцию DownloadFile для скачивания любого URL с использованием стандартных сетевых настроек, а также функции SetShareOnDisk и RemoveShareFromDisk для управления разделами на диске.

Давайте разбить каждый раздел:

DownloadFile

function DownloadFile(const Url: string): string;

Эта функция принимает URL в качестве входного параметра и скачивает его содержимое. Она использует API Wininet, которая является частью Windows, для выполнения скачивания. Функция возвращает скачанные файловые содержимое в виде строки.

Работа функции происходит следующим образом:

  1. Инициализируем функцию InternetOpen для создания сеанса интернета.
  2. Создаем новый.handle для URL с помощью InternetOpenUrl.
  3. Проверяем, является ли handle URL валидным, и начинаем скачивать содержимое.
  4. Читаем содержимое по частям (1024 байта за раз) и добавляем его к буферу.
  5. Повторяем шаг 4, пока не будет доступно больше данных.
  6. Закрываем handle URL и возвращаем скачанные файловые содержимое.

SetShareOnDisk

function SetShareOnDisk(HostName, LocalPath: string; NetName: TNetName; Remark: string; Access: word; RO_Passw, RW_Passw: TPassw): boolean;

Эта функция создает раздел на диске. Она принимает несколько параметров:

  1. HostName: имя хоста (например, "localhost").
  2. LocalPath: локальный путь к папке, которую нужно поделить.
  3. NetName: имя раздела.
  4. Remark: комментарий для раздела.
  5. Access: флаги доступа (0 = только чтение, 1 = чтение и запись).
  6. RO_Passw и RW_Passw: пароли для доступа с правами только чтения и чтения/записи соответственно.

Функция использует API NetShareAdd для создания раздела и устанавливает различные параметры, такие как имя раздела, путь, комментарий и флаги доступа.

RemoveShareFromDisk

function RemoveShareFromDisk(HostName, NetName, LocalPath: string): boolean;

Эта функция удаляет раздел с диска. Она принимает три параметра:

  1. HostName: имя хоста.
  2. NetName: имя раздела, который нужно удалить.
  3. LocalPath: локальный путь к папке, которую нужно удалить.

Функция использует API NetShareDel для удаления раздела и уведомляет оболочку о изменении с помощью SHChangeNotify.

В целом, этот код предоставляет полезный набор функций для работы с URL и разделами на диске.

Скачать любой URL используя стандартные настройки сети можно с помощью API Wininet, начиная от Internet Explorer 3.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: URL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:05:20/0.0040268898010254/0