Internet版本的InternetOpenUrl返回错误12002

时间:2015-03-28 00:39:43

标签: c++ unicode wininet

基本上我将我的程序从多字节转换为unicode,这样我就可以将其商业广告给其他国家的人们(基本上是一个直播应用程序)。在转换期间,我遇到了很多问题。但最近,我遇到了一个刚刚睁开眼睛的人。

我有以下代码(包括来自Remy Lebeau的答案中的函数):

void get_user_request(const wchar_t *url)
{
    LPVOID hi, hu;

    hi = InternetOpenW(SUBSCRIBER_USER_AGENT, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);

    if(hi==NULL)
    {
        WinInetError(L"InternetOpenW");
    }
    else
    {
        hu = InternetOpenUrlW(hi, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);

        if(hu==NULL)
        {
           WinInetError("InternetOpenUrlW");
        }
        else
        {
            MessageBoxW ( 0, "We're in", 0, 0 );
            InternetCloseHandle(hu);
        }
        InternetCloseHandle(hi);
    }
}

编辑1开始

我这样称呼函数:

get_user_request(request_url);

其中request_url是:

WCHAR *request_url; // its a global variable
request_url = L"http://example-site.com/user/<user-id>/";

我通过将请求所需的字符串连接到它来分配值,连接有点像这样:

wsprintfW ( request_url, L"?id=%s", string);

在此连接之前。 request_url也会像这样连接到wstring:lstrcatW(request_url, myWString.c_Str());

编辑1结束

基本上,在我转换为unicode之前;这个功能运行正常。转换后。我在hu = InternetOpenUrlW()行上收到以下错误:

在返回error 12002后立即设置断点 - 查看此错误后,MSDN中的说明如下:

12002 ERROR_INTERNET_TIMEOUT The request has timed out.

如果请求超时,我认为传递给函数的url可能以某种方式出错。之后,我在我的Windows调试器中在该参数中插入了一个断点。似乎传递给该参数的唯一字符串是'h' ...这很奇怪,因为我回顾我的代码并将整个url作为const wchar_t*传递给函数,就像它一样根据我的参数。

之后,我插入MessageBoxW()以显示传递给函数的url字符串的值,就在之前。输出(令人惊讶的是),是我最初传递给url变量的完全相同的字符串......

所以我的问题如下:

“什么****?”

P.S。非常感谢所有对此场景的输入。

1 个答案:

答案 0 :(得分:0)

get_user_request()内部的错误处理错误,您request_url的连接也是错误的。代码看起来应该更像这样:

void DisplayWinInetError(LPCWSTR FuncName)
{
    DWORD dwErrorCode = GetLastError();
    DWORD dwLen;

    std::wostringstream ErrorMsg;
    ErrorMsg << FuncName << L" failed!";

    if (dwErrorCode == ERROR_INTERNET_EXTENDED_ERROR)
    {
        dwLen = 0;
        if (!InternetGetLastResponseInfo(&dwErrorCode, NULL, &dwLen) &&
            (GetLastError() == ERROR_INSUFFICIENT_BUFFER))
        {
            ++dwLen;
            std::vector<wchar_t> msg(dwLen);
            if (InternetGetLastResponseInfo(&dwErrorCode, &msg[0], &dwLen))
                ErrorMsg << L'\n' << std::wstring(&msg[0], dwLen);
            else
                ErrorMsg << L"\nUnable to retrieve WinInet error message! Error: " << GetLastError();
        }
        else
            ErrorMsg << L"\nUnable to retrieve WinInet error message! Error: " << GetLastError();
    }
    else
    {
        ErrorMsg << L" WinInet Error: " << dwErrorCode;

        LPWSTR lpMsg = NULL;
        dwLen = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_ARGUMENT_ARRAY | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwErrorCode, 0, (LPWSTR)&lpMsg, 0, NULL);
        if (dwLen > 0)
        {
            ErrorMsg << L'\n' << std::wstring(lpMsg, dwLen);
            LocalFree(lpMsg);
        }
        else
            ErrorMsg << L"\nUnable to retrieve System error message! Error: " << GetLastError();
    }

    MessageBoxW(NULL, ErrorMsg.str().c_str(), L"WinInet error", MB_OK);
}

void get_user_request(LPCWSTR url)
{
    HINTERNET hInet, hUrl;

    hInet = InternetOpenW(SUBSCRIBER_USER_AGENT, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if (hInet == NULL)
    {
        DisplayWinInetError(L"InternetOpenW");
    }
    else
    {
        MessageBoxW(NULL, url, "Opening url", MB_OK);

        hUrl = InternetOpenUrlW(hInet, url, NULL, 0, INTERNET_FLAG_RELOAD, 0);
        if (hUrl == NULL)
        {
            DisplayWinInetError(L"InternetOpenUrlW");
        }
        else
        {
            MessageBoxW(NULL, "We're in", L"OK", MB_OK);

            // ...

            InternetCloseHandle(hUrl);
        }

        InternetCloseHandle(hInet);
    }
}

std::wstring request_url = L"http://example-site.com/user/<user-id>/?id=" + string;
get_user_request(request_url.c_str());