10

DelphiXEに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 に直接アクセスするのと同じくらい高速で、すべてのラッパー コードを記述する必要はありません。

SynCrtSock という名前のユニットの OpenSource WinHTTP ラッパーを次に示します。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 に答える