共用方式為


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,不會執行任何特殊作業。

價值 意義
ICU_DECODE
將「逸出編碼」(%xx)的字元轉換成其非逸出形式。 這不會譯碼其他編碼,例如UTF-8。 只有當使用者提供 URL_COMPONENTS 結構中的緩衝區,將元件複製到中時,才能使用此功能。
ICU_ESCAPE
將某些字元逸出至其逸出序列(%xx)。 要逸出的字元是非 ASCII 字元,或必須逸出以在 HTTP 要求中表示的 ASCII 字元。 只有當使用者提供 URL_COMPONENTS 結構中的緩衝區,將元件複製到中時,才能使用此功能。
ICU_REJECT_USERPWD
拒絕 URL 作為包含內嵌認證的輸入(使用者名稱、密碼或兩者)。 如果函式因為 URL 無效而失敗,則後續呼叫 GetLastError 會傳回 ERROR_WINHTTP_INVALID_URL

[in, out] lpUrlComponents

接收 URL 元件的 URL_COMPONENTS 結構的指標。

傳回值

如果函式成功,則傳回 true TRUE,否則會 傳回 FALSE。 若要取得擴充的錯誤資訊,請呼叫 GetLastError。 傳回的錯誤碼包括下列各項。

錯誤碼 描述
ERROR_WINHTTP_INTERNAL_ERROR
發生內部錯誤。
ERROR_WINHTTP_INVALID_URL
URL 無效。
ERROR_WINHTTP_UNRECOGNIZED_SCHEME
無法辨識 URL 配置,或不受支援。
ERROR_NOT_ENOUGH_MEMORY
記憶體不足,無法完成要求的作業。 (Windows 錯誤碼)

言論

即使 WinHTTP 在異步模式中使用 (也就是說,WINHTTP_FLAG_ASYNC 已在 winHttpOpen中設定 時),此函式仍會同步運作。 傳回值表示成功或失敗。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

必要元件是由 URL_COMPONENTS 結構的成員表示。 每個元件都有值的指標,並且具有儲存預存值長度的成員。 如果元件的值和長度都等於零,則不會傳回該元件。 如果元件的指標 NULL,且其對應長度成員的值非零,則 pwszUrl 字串 中對應元件之第一個字元的位址會儲存在指標中,而元件的長度則儲存在長度成員中。

如果指標包含使用者提供的緩衝區位址,長度成員必須包含緩衝區的大小。 WinHttpCrackUrl 函式會將元件複製到緩衝區中,而長度成員會設定為所複製元件的長度,尾端字串終止符減 1。 如果使用者提供的緩衝區不夠大,WinHttpCrackUrl 會傳回 FALSE而 getLastError 會傳回 ERROR_INSUFFICIENT_BUFFER

若要讓 WinHttpCrackUrl 正常運作,URL_COMPONENTS 結構的大小必須儲存在該結構的 dwStructSize 成員中。

如果針對 pwszUrl 傳入 URL 的因特網通訊協定不是 HTTP 或 HTTPS,則 WinHttpCrackUrl 會傳回 false,而且 getLastError getLastError 表示
ERROR_WINHTTP_UNRECOGNIZED_SCHEME

WinHttpCrackUrl 在嘗試破解 URL 之前,不會檢查 URL 的有效性或格式。 因此,如果傳入的字串,例如 “”http://server?Bad=URL"“ ,則函式會傳回不正確的結果。

Windows XP 和 Windows 2000 的附註,請參閱 WinHttp 起始頁的 Run-Time 需求 一節。
 

例子

此範例示範如何將 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 或更新版本。

另請參閱

關於 windows HTTP 服務 Microsoft

處理統一資源定位器

WinHTTP 版本

WinHttpCreateUrl