首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinHttp Delphi包装器

WinHttp Delphi包装器
EN

Stack Overflow用户
提问于 2011-07-17 16:53:48
回答 2查看 10.1K关注 0票数 10

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

按优先次序:

  1. 开箱即用的特尔斐装置
  2. 具有移植入口例程的第三方开放源代码pas文件。
  3. xxx_TLB.pas包装器

解决方案:

由于注释不允许格式化代码,所以我在问题中粘贴解决方案:

代码语言:javascript
复制
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;

还有几个人失踪了:

代码语言:javascript
复制
WinHttpCrackUrl
WinHttpCreateUrl
WinHttpSetStatusCallback
WinHttpTimeFromSystemTime
WinHttpTimeToSystemTime
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-17 19:05:56

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

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

对于我们的ORM,对于它的HTTP1.1连接层,我们试图避免外部依赖,而不需要所有Indy的特性和开销。

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

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

下面是我们的OpenSource WinHTTP包装器,在单位名为SynCrtSock中。测试从德尔福5到XE。

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

这篇文章的详细内容。有一个关于自动代理检索的说明。

编辑:有了即将推出的德尔菲XE2,您将能够交叉编译到Mac。在本例中,使用“抽象”类(如SynCrtSock )是非常有意义的。在Windows下,它将使用WinHTTP,但在Mac下,它将调用socket。要编译代码,只需调整类类型,而不是代码。

票数 11
EN

Stack Overflow用户

发布于 2011-07-17 18:17:34

  • 项目
  • 导入类型库
  • 微软WinHTTP服务,版本5.1 (Version5.1) C:\Windows\system32\winhttp.dll

然后用它:

代码语言:javascript
复制
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
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6725348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档