2

I am developing a plugin for NSIS (Unicode) and I am trying to use InternetCrackUrl() to get the hostname of a URL (ie: http://www.google.com/test.html -> www.google.com) but instead of lpszHostName just returning "www.google.com", it returns "www.google.com/test.html".

Here is my code:

void __declspec(dllexport) Example(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) {
    g_hwndParent=hwndParent;

    EXDLL_INIT();

    LPWSTR szURI = new WCHAR[string_size];
    URL_COMPONENTS urlComp;

    // Sets szURI to "http://www.xyz.com/test.html"
    popstring(szURI);

    wstring strUri = szURI;

    ZeroMemory(&urlComp, sizeof(urlComp));
    urlComp.dwStructSize = sizeof(urlComp);

    // Set required component lengths to non-zero so that they are cracked.
    urlComp.dwHostNameLength = static_cast<DWORD>(-1);
    urlComp.dwSchemeLength = static_cast<DWORD>(-1);
    urlComp.dwUrlPathLength = static_cast<DWORD>(-1);
    urlComp.dwExtraInfoLength = static_cast<DWORD>(-1);

    if (!InternetCrackUrlW(strUri.c_str(), strUri.length(), 0, &urlComp)) {
        return _T("InternetCrackUrl failed");
    }

    // urlComp.lpszHostName = www.xyz.com/test.html
}

Any ideas?

4

2 回答 2

7

如果您不提供自己的缓冲区,InternetCrackUrl 将返回指向您作为输入传递的原始字符串中的字符的指针。它不会复制字符串。

因此,lpszHostName 将指向第一个字符,而 dwHostNameLength 将为您提供构成主机名的字符数。

于 2012-07-05T23:27:10.163 回答
0

这是预期的行为。因为当您说 www.google.com 时,它会转换为http://www.google.com/test.html。该 URL 实际上是 www.google.com/test.html ,这是返回的内容。为了得到你需要的东西,你需要做一些字符串操作。

您可以使用 std::string 类的 strrchr 函数或 find_first_of 方法。

于 2012-06-07T04:25:41.717 回答