2011-05-23 28 views
2

自從我第一次啓動Delphi以來,我一直在想如何使用HTTP請求。 我不想使用任何替代HTTP庫,因爲我習慣於使用WinHTTP(DLL,而不是lib)。通過Delphi引用WinHTTP.dll

所以任何人都可以嘗試向我解釋如何通過Delphi引用/使用它? 在Visual Basic.NET中,您只需從選用板中選擇組件即可。

回答

1

您可以在Delphi代碼中使用任何DLL的導出函數。舉個例子,你這是怎麼使用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; 
4

我已經寫了WinHttp.dll和WinINet.dll的端口。

參見TWinHttpTWinINetSynCrtSock.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