0

Windows XP(Windows7のVirtualPCで)で開発しているアプリを実行すると、予期しないエラーが発生します。Windows764ビットProfessionalのVisualStudio2010を使用してコンパイルしています。

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を正しいサイズに設定し、 ERROR_INSUFFICIENT_BUFFERを示すために0x7Aのエラーコードを与えることを期待します。これは、Windows 7で発生することです。WindowsXPで実際に発生しているのは、ERROR_INVALID_PARAMETERを示す0x57のエラーコードです。

フラグの値をゼロに設定すると、両方のオペレーティングシステムで正常に機能します。私が解決しようとしているのは、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

XPでWinHttpCrackURLを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ではサポートされていないと思います。

于 2011-07-13T01:03:23.183 に答える