Ссылка на WinHTTP.dll через Delphi - PullRequest
2 голосов
/ 23 мая 2011

Мне было интересно, как использовать HTTP-запросы с тех пор, как я впервые запустил Delphi. Я не хочу использовать никакие альтернативные библиотеки HTTP, потому что я привык использовать WinHTTP (DLL, а не lib).

Так может кто-нибудь попытаться объяснить мне, как ссылаться на него через Delphi? В Visual Basic.NET все, что вам нужно сделать, это выбрать компонент из палитры.

Ответы [ 2 ]

4 голосов
/ 23 мая 2011

Я написал порт для WinHttp.dll и WinINet.dll.

См. TWinHttp и TWinINet классы, определенные в SynCrtSock.pas . Они позволяют прямой доступ к этим библиотекам

Вот низкоуровневое преобразование, используемое TWinHTTP:

{ TWinHTTP }

const
  winhttpdll = 'winhttp.dll';

  WINHTTP_ACCESS_TYPE_DEFAULT_PROXY = 0;
  WINHTTP_FLAG_REFRESH = $00000100;
  WINHTTP_FLAG_SECURE = $00800000;
  WINHTTP_ADDREQ_FLAG_COALESCE = $40000000;
  WINHTTP_QUERY_FLAG_NUMBER = $20000000;

function WinHttpOpen(pwszUserAgent: PWideChar; dwAccessType: DWORD;
  pwszProxyName, pwszProxyBypass: PWideChar; dwFlags: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpConnect(hSession: HINTERNET; pswzServerName: PWideChar;
  nServerPort: INTERNET_PORT; dwReserved: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpOpenRequest(hConnect: HINTERNET; pwszVerb: PWideChar;
  pwszObjectName: PWideChar; pwszVersion: PWideChar; pwszReferer: PWideChar;
  ppwszAcceptTypes: PLPWSTR; dwFlags: DWORD): HINTERNET; stdcall; external winhttpdll;
function WinHttpCloseHandle(hInternet: HINTERNET): BOOL; stdcall; external winhttpdll;
function WinHttpAddRequestHeaders(hRequest: HINTERNET; pwszHeaders: PWideChar; dwHeadersLength: DWORD;
  dwModifiers: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpSendRequest(hRequest: HINTERNET; pwszHeaders: PWideChar;
  dwHeadersLength: DWORD; lpOptional: Pointer; dwOptionalLength: DWORD; dwTotalLength: DWORD;
  dwContext: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpReceiveResponse(hRequest: HINTERNET;
  lpReserved: Pointer): BOOL; stdcall; external winhttpdll;
function WinHttpQueryHeaders(hRequest: HINTERNET; dwInfoLevel: DWORD; pwszName: PWideChar;
  lpBuffer: Pointer; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpReadData(hRequest: HINTERNET; lpBuffer: Pointer;
  dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; stdcall; external winhttpdll;

В том же модуле у вас также есть класс THttpApiServer, реализующий HTTP-сервер, использующий быстрый http.sys сервер в режиме ядра.

Из моих тестов я обнаружил, что классы TWinHttp / THttpApiServer являются более быстрым решением HTTP, с гораздо меньшими издержками, чем компоненты Indy или Synapse, и с некоторыми приятными функциями, такими как собственный HTTPS.

Для тех, кто не знает о WinHttp.dll, он намного быстрее, чем WinINet.dll (который может быть очень медленным). В результате, TWinHttp на намного быстрее, чем TWinINet, и так же быстро, как прямой вызов низкого уровня на WinSocks .

1 голос
/ 23 мая 2011

Вы можете использовать экспортированные функции любой библиотеки DLL в коде Delphi. Например, вот как вы используете функцию WinHttpConnect:

unit Unit1;

interface

uses WinInet;

...

function WinHttpConnect(hSession: HINTERNET; pswzServerName: PChar;
  nServerPort: INTERNET_PORT; dwReserved: cardinal): HINTERNET; stdcall;

...

implementation

...

function WinHttpConnect; external 'Winhttp.dll' name 'WinHttpConnect';

...

Вам даже не нужно добавлять uses WinInet. Если вы этого не сделаете, вы должны знать, что

type
  HINTERNET = pointer;
  INTERNET_PORT = word;
...