2

NSIS(Unicode)のプラグインを開発していて、InternetCrackUrl()を使用してURLのホスト名を取得しようとしています(例:http ://www.google.com/test.html- > www.google.com)ただし、lpszHostNameが「www.google.com」を返す代わりに、「www.google.com/test.html」を返します。

これが私のコードです:

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
}

何か案は?

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であり、これが返されます。必要なものを取得するには、文字列操作を行う必要があります。

strrchr関数またはstd::stringクラスのfind_first_ofメソッドを使用できます。

于 2012-06-07T04:25:41.717 に答える