InternetOpenUrl 的 Unicode 版本 returns 错误 12002
Unicode version of InternetOpenUrl returns error 12002
基本上我正在将我的程序从多字节转换为 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()
行收到以下错误:
在 returns error 12002
之后设置断点 - 在查找此错误后,MSDN 的描述如下:
12002 ERROR_INTERNET_TIMEOUT
The request has timed out.
如果请求超时,我假设传递给函数的 url 可能以某种方式出现了格式错误。之后,我在 windows 调试器中的那个参数处插入了一个断点。似乎传递给该参数的唯一字符串是 'h'
... 那是 st运行ge 因为我回顾我的代码并将整个 url 传递给函数作为一个 const wchar_t*
就像它根据我的参数所需要的那样。
之后,我插入了 MessageBoxW()
以显示传递给函数的 url
字符串的值,就在之前。输出(足够令人惊讶)与我最初传递给 url
变量的字符串完全相同...
所以我的问题如下:
"What the ****?"
P.S。非常感谢对此场景的所有输入。
你在 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());
基本上我正在将我的程序从多字节转换为 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()
行收到以下错误:
在 returns error 12002
之后设置断点 - 在查找此错误后,MSDN 的描述如下:
12002 ERROR_INTERNET_TIMEOUT
The request has timed out.
如果请求超时,我假设传递给函数的 url 可能以某种方式出现了格式错误。之后,我在 windows 调试器中的那个参数处插入了一个断点。似乎传递给该参数的唯一字符串是 'h'
... 那是 st运行ge 因为我回顾我的代码并将整个 url 传递给函数作为一个 const wchar_t*
就像它根据我的参数所需要的那样。
之后,我插入了 MessageBoxW()
以显示传递给函数的 url
字符串的值,就在之前。输出(足够令人惊讶)与我最初传递给 url
变量的字符串完全相同...
所以我的问题如下:
"What the ****?"
P.S。非常感谢对此场景的所有输入。
你在 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());