2011-07-12 47 views
0

(从Windows 7下的虚拟PC)上运行,我在Windows XP开发应用程序时,我已经得到意外的错误WinHttpCreateUrl。我正在使用Windows 7 64位专业版中的Visual Studio 2010进行编译。呼叫与ICU_REJECT_USERPWD标志设置在Windows 7中工作,但不能在Windows XP(使用Virtual PC)

我跟踪了这​​个问题,发现在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下失败。

我意识到我不需要在这个例子中可以设置标志,但是这仅仅是一些测试代码,我放在一起显示的问题。

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

回答

0

我不能让WinHttpCrackURL与对XP的ICU_REJECT_PASSWORD标志工作。 与MSDN例如 http://msdn.microsoft.com/en-us/library/aa384092(v=vs.85).aspx

ICU_DECODE和ICU_ESCAPE做工精细开始,如果你设置了缓冲区。 但是,传递ICU_REJECT_PASSWORD总是导致失败,并且GetLastError返回0x00000057,它是ERROR_INVALID_PARAMETER。

我猜这个标志在XP上实际上并不支持,尽管文档说了什么。

+0

我也尝试了MSDN示例代码。在Windows 7上使用ICU_REJECT_PASSWORD标志正常工作,但在XP下失败。我必须同意它在XP下不起作用。 – Rok

1

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

此外,当您设置dwSchemeLength和dwHostNameLength,你是在包含终止空不一致。我不确定你是否应该这样做;该文件似乎没有指定,但我想也许不会。

如果将dwSchemeLength设置为4,将dwHostNameLength设置为10,该怎么办?如果还是不行,请尝试将其设置为5和11

我的猜测是事情是不完全正确的结构;这可能有助于开始。

+0

和** dwSchemeLength **发现!这不是问题,但它确实需要修复(我在我的实际应用中使用了https,并没有正确改变例子的长度)。为了完成这个问题,我添加了额外的结构元素(它们已经在我的主应用程序中,但我删除了它们 - 可能不明智 - 使示例更清晰)。关于尝试使用包含空终止符的长度的好建议,但不幸的是,它并未解决问题。我也认为这与结构有关,但不能看到可能的结果。 – Rok

+1

好吧,下一个想法:MSDN文档提供了一个示例,首先解析URL,然后从破解的URL创建它:http://msdn.microsoft.com/en-us/library/aa384093(VS.85).aspx 。如果您修改此示例以使用您想要的标志,会发生什么情况?如果示例有效,请检查破解的URL结构以查看差异所在。 –

+0

这是一个好主意。尽管设置了ICU_REJECT_PASSWORD,它甚至不能在示例中工作。如果尝试获取缓冲区大小和/或尝试构建URL时失败,则失败。看起来这个标志只是不兼容XP。 – Rok

相关问题