10

请告知 Delphi XE 中是否有 WinHTTP 包装器

按优先顺序:

  1. 开箱即用的德尔福装置
  2. 带有移植入口例程的第三方开源 pas 文件
  3. 一个 xxx_TLB.pas 包装器

解决方案:

由于评论不允许格式化代码,我将解决方案粘贴在问题中:

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;
function WinHttpQueryDataAvailable(hRequest: HINTERNET; var lpdwNumberOfBytesAvailable: DWORD): BOOL; 
  stdcall; external winhttpdll;
function WinHttpSetOption(hInternet: HINTERNET; dwOption: DWORD; lpBuffer: Pointer; dwBufferLength: DWORD): BOOL; 
  stdcall; external winhttpdll;
function WinHttpQueryOption(hInternet: HINTERNET; dwOption: DWORD; var lpBuffer: Pointer; var lpdwBufferLength: DWORD): BOOL; 
  stdcall; external winhttpdll;
function WinHttpWriteData(hRequest: HINTERNET; lpBuffer: Pointer; dwNumberOfBytesToWrite: DWORD; 
  var lpdwNumberOfBytesWritten: DWORD): BOOL; stdcall; external winhttpdll;
function WinHttpCheckPlatform(): BOOL; stdcall; external winhttpdll;

还有几个缺失的:

WinHttpCrackUrl
WinHttpCreateUrl
WinHttpSetStatusCallback
WinHttpTimeFromSystemTime
WinHttpTimeToSystemTime
4

2 回答 2

11

如果您想在应用程序中实现 HTTP 客户端访问,您可以考虑以下几种选择:

  • 使用提供的 Indy 组件;
  • 使用第三方组件,如 Synapse、ICS 或您自己的基于 WinSock 的包装器;
  • 使用 WinINet;
  • 使用 WinHTTP。

对于我们的 ORM,对于它的 HTTP/1.1 连接层,我们试图避免外部依赖,并且不需要所有 Indy 的特性和开销。

我们首先编写了自己的 WinSock 包装器,然后试用了 WinInet。在我们的测试基准中使用时,我们发现 WinINet 非常慢。

然后我们尝试了微软提供的新 API WinHTTP,我们发现它的速度非常快。与直接 WinSock 访问一样快,无需编写所有包装代码。

所以这是我们的 OpenSource WinHTTP 包装器,在名为 SynCrtSock 的单元中。测试从 Delphi 5 到 XE。

您将看到我们为 WinINet 和 WinHTTP 使用了相同的泛型类。事实上,这两个库非常接近。

有关详细信息,请参阅本文。有一个关于自动代理检索的说明。

编辑:使用即将推出的 Delphi XE2,您将能够交叉编译到 Mac OS X。在这种情况下,使用“抽象”类非常有意义,例如SynCrtSock. 在 Windows 下,它将使用 WinHTTP,但在 Mac OS X 下,它将调用套接字 API。要使您的代码编译,您只需调整类类型,而不是您的代码。

于 2011-07-17T19:05:56.113 回答
7
  • 项目
  • 导入类型库
  • Microsoft WinHTTP 服务,版本 5.1(版本 5.1)C:\Windows\system32\winhttp.dll

然后使用它:

var
   http: IWinHttpRequest;
   szUrl: WideString;
begin
   szUrl := 'http://stackoverflow.com/questions/6725348/winhttp-delphi-wrapper';

   http := CoWinHttpRequest.Create;
   http.open('GET', szUrl, False);
   http.send(EmptyParam);

   if (http.status = 200) then
       ShowMessage(http.responseText);

所以:

  • 它是开箱即用的 - 使用开箱即用的工具
  • 它是开源的——你可以随意修改源代码
  • 这是TLB
于 2011-07-17T18:17:34.847 回答