WinHttpCrackUrl 函式 (winHTTP.h)
WinHttpCrackUrl 函式會將URL分隔成其元件元件,例如主機名和路徑。
語法
WINHTTPAPI BOOL WinHttpCrackUrl(
[in] LPCWSTR pwszUrl,
[in] DWORD dwUrlLength,
[in] DWORD dwFlags,
[in, out] LPURL_COMPONENTS lpUrlComponents
);
參數
[in] pwszUrl
包含要分隔之標準 URL 的字串指標。 WinHttpCrackUrl 在嘗試破解之前,不會檢查此 URL 是否有效或正確格式。
[in] dwUrlLength
pwszUrl 字串的長度,以字元為單位。 如果 dwUrlLength 設為零,WinHttpCrackUrl 假設 pwszUrl 字串串 null 終止,並根據該假設決定 pwszUrl 字串串的長度。
[in] dwFlags
控制作業的旗標。 此參數可以是下列一或多個旗標的組合(值可以是位 OR』d。 或者,參數可以是 0,不會執行任何特殊作業。
價值 | 意義 |
---|---|
|
將「逸出編碼」(%xx)的字元轉換成其非逸出形式。 這不會譯碼其他編碼,例如UTF-8。 只有當使用者提供 URL_COMPONENTS 結構中的緩衝區,將元件複製到中時,才能使用此功能。 |
|
將某些字元逸出至其逸出序列(%xx)。 要逸出的字元是非 ASCII 字元,或必須逸出以在 HTTP 要求中表示的 ASCII 字元。 只有當使用者提供 URL_COMPONENTS 結構中的緩衝區,將元件複製到中時,才能使用此功能。 |
|
拒絕 URL 作為包含內嵌認證的輸入(使用者名稱、密碼或兩者)。 如果函式因為 URL 無效而失敗,則後續呼叫 GetLastError 會傳回 ERROR_WINHTTP_INVALID_URL。 |
[in, out] lpUrlComponents
接收 URL 元件的 URL_COMPONENTS 結構的指標。
傳回值
如果函式成功,則傳回 true TRUE,否則會 傳回 FALSE。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。 傳回的錯誤碼包括下列各項。
錯誤碼 | 描述 |
---|---|
|
發生內部錯誤。 |
|
URL 無效。 |
|
無法辨識 URL 配置,或不受支援。 |
|
記憶體不足,無法完成要求的作業。 (Windows 錯誤碼) |
言論
即使 WinHTTP 在異步模式中使用 (也就是說,
必要元件是由 URL_COMPONENTS 結構的成員表示。 每個元件都有值的指標,並且具有儲存預存值長度的成員。 如果元件的值和長度都等於零,則不會傳回該元件。 如果元件的指標
如果指標包含使用者提供的緩衝區位址,長度成員必須包含緩衝區的大小。
WinHttpCrackUrl 函式會將元件複製到緩衝區中,而長度成員會設定為所複製元件的長度,尾端字串終止符減 1。 如果使用者提供的緩衝區不夠大,
若要讓 WinHttpCrackUrl 正常運作,URL_COMPONENTS 結構的大小必須儲存在該結構的 dwStructSize 成員中。
如果針對 pwszUrl 傳入
ERROR_WINHTTP_UNRECOGNIZED_SCHEME。
WinHttpCrackUrl 在嘗試破解 URL 之前,不會檢查 URL 的有效性或格式。 因此,如果傳入的字串,例如 “”http://server?Bad=URL"“ ,則函式會傳回不正確的結果。
例子
此範例示範如何將 URL 分成其元件、更新元件,然後重新建構 URL。
URL_COMPONENTS urlComp;
LPCWSTR pwszUrl1 =
L"http://search.msn.com/results.asp?RS=CHECKED&FORM=MSNH&v=1&q=wininet";
DWORD dwUrlLen = 0;
// Initialize the URL_COMPONENTS structure.
ZeroMemory(&urlComp, sizeof(urlComp));
urlComp.dwStructSize = sizeof(urlComp);
// Set required component lengths to non-zero
// so that they are cracked.
urlComp.dwSchemeLength = (DWORD)-1;
urlComp.dwHostNameLength = (DWORD)-1;
urlComp.dwUrlPathLength = (DWORD)-1;
urlComp.dwExtraInfoLength = (DWORD)-1;
// Crack the URL.
if (!WinHttpCrackUrl( pwszUrl1, (DWORD)wcslen(pwszUrl1), 0, &urlComp))
{
printf("Error %u in WinHttpCrackUrl.\n", GetLastError());
}
else
{
// Change the search information.
// New info is the same length.
urlComp.lpszExtraInfo = L"?RS=CHECKED&FORM=MSNH&v=1&q=winhttp";
// Obtain the size of the new URL and allocate memory.
WinHttpCreateUrl( &urlComp, 0, NULL, &dwUrlLen);
LPWSTR pwszUrl2 = new WCHAR[dwUrlLen];
// Create a new URL.
if(!WinHttpCreateUrl( &urlComp, 0, pwszUrl2, &dwUrlLen))
{
printf("Error %u in WinHttpCreateUrl.\n", GetLastError());
}
else
{
// Show both URLs.
printf("Old URL: %S\nNew URL: %S\n", pwszUrl1, pwszUrl2);
}
// Free allocated memory.
delete [] pwszUrl2;
}
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows XP,Windows 2000 Professional with SP3 [僅限傳統型應用程式] |
支援的最低伺服器 | Windows Server 2003、Windows 2000 Server with SP3 [僅限傳統型應用程式] |
目標平臺 | 窗戶 |
標頭 | winhttp.h |
連結庫 | Winhttp.lib |
DLL | Winhttp.dll |
可轉散發 | Windows XP 和 Windows 2000 上的 WinHTTP 5.0 和 Internet Explorer 5.01 或更新版本。 |