Вызов WinHttpCreateUrl с установленным флагом ICU_REJECT_USERPWD, работающим в Windows 7, но не в Windows XP (с использованием Virtual PC) - PullRequest
0 голосов
/ 12 июля 2011

Я получаю неожиданные ошибки при запуске приложения, которое я разрабатываю в Windows XP (в Virtual PC из Windows 7). Я компилирую его с помощью Visual Studio 2010 в 64-разрядной версии Windows 7 Professional.

Я отследил проблему до того, что URL-адреса не были созданы должным образом под XP. Вот небольшой испытательный стенд, который я собрал, чтобы показать это -

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 .

Если я установлю значение flags равным zero , тогда оно отлично работает в обеих операционных системах. Я пытаюсь понять, почему ICU_REJECT_USERPWD вызывает сбой в XP.

Я понимаю, что мне не нужно устанавливать этот флаг для этого примера, но это всего лишь некоторый тестовый код, который я собрал, чтобы отобразить проблему.

Большое спасибо за любую помощь в решении этой проблемы (или любому, кто указывает, что я делаю неправильно ...)

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Что, если вы установите для component.nScheme значение INTERNET_SCHEME_HTTP, а для component.nPort значение 80? Документация только указывает, что строковые точки могут быть NULL, а 0 не соответствует действительному значению для nScheme, например.

Кроме того, когда вы устанавливаете dwSchemeLength и dwHostNameLength, вы не согласны с добавлением завершающего NULL. Я не уверен, если вы действительно должны это делать; документация, кажется, не указывает, но я думаю, что, возможно, нет.

Что если вы установите для dwSchemeLength значение 4, а для dwHostNameLength значение 10? Если это не сработает, попробуйте установить их на 5 и 11.

Я предполагаю, что в структуре не все в порядке; это может помочь начать.

0 голосов
/ 13 июля 2011

Я не могу заставить WinHttpCrackURL работать с флагом ICU_REJECT_PASSWORD в XP. Начиная с примера 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, несмотря на то, что написано в документации.

...