0

运行我在 Windows XP 中开发的应用程序(在 Windows 7 的 Virtual PC 下)时,我遇到了意外错误。我在 Windows 7 64 位专业版中使用 Visual Studio 2010 编译它。

我已将问题归结为在 XP 下未正确创建 URL。以下是我为展示这一点而拼凑的一个小型试验台——

URL_COMPONENTS components;
memset( &components, 0, sizeof( URL_COMPONENTS ));
components.dwStructSize = sizeof( URL_COMPONENTS );
components.lpszScheme = L"http";
components.dwSchemeLength = 4;
components.lpszHostName = L"google.com";
components.dwHostNameLength = 10;
components.nScheme = INTERNET_SCHEME_HTTP;
components.nPort = 80;
DWORD len = 0;
DWORD flags = ICU_REJECT_USERPWD;
if( !WinHttpCreateUrl( &components, flags, NULL, &len )) {
    WChar buf[256];
    wsprintf( buf, L"Error code %08X", GetLastError( ));
    MessageBox( NULL, buf, L"FAILURE", NULL );
}

我希望它将len设置为正确的大小并给出错误代码0x7A以指示ERROR_INSUFFICIENT_BUFFER。这就是在 Windows 7 下发生的情况。我在 Windows XP 下实际得到的是0x57的错误代码,表示ERROR_INVALID_PARAMETER

如果我将标志的值设置为零,那么它在两个操作系统上都可以正常工作。我试图解决的是为什么ICU_REJECT_USERPWD导致它在 XP 下失败。

我意识到我不需要为这个例子设置那个标志,但这只是我为了显示问题而放在一起的一些测试代码。

非常感谢您对这个问题的任何帮助(或任何指出我做错了什么的人......)

4

2 回答 2

1

如果将 components.nScheme 设置为 INTERNET_SCHEME_HTTP,并将 components.nPort 设置为 80,会怎样?例如,文档仅指定字符串点可能为 NULL,并且 0 不会映射到 nScheme 的有效值。

此外,当您设置 dwSchemeLength 和 dwHostNameLength 时,您在包含终止 NULL 方面是不一致的。我不确定您是否真的应该这样做;文档似乎没有指定,但我猜可能没有。

如果将 dwSchemeLength 设置为 4,将 dwHostNameLength 设置为 10,会怎样?如果这不起作用,请尝试将它们设置为 5 和 11。

我的猜测是结构不太对劲。这可能有助于开始。

于 2011-07-12T19:16:14.823 回答
0

I can't get WinHttpCrackURL to work with the ICU_REJECT_PASSWORD flag on XP. Starting with the msdn example http://msdn.microsoft.com/en-us/library/aa384092(v=vs.85).aspx

ICU_DECODE and ICU_ESCAPE work fine if you set the buffers. However passing in ICU_REJECT_PASSWORD always results in a fail and GetLastError returns 0x00000057 which is ERROR_INVALID_PARAMETER.

I'm guessing that flag is not actually supported on XP despite what the documentation says.

于 2011-07-13T01:03:23.183 回答