InternetQueryOption вылетает в Windows XP

Следующий код более или менее просто скопирован из документации MSDN. В Windows Vista и Windows 7 работает нормально, но в XP вылетает с нарушением прав доступа при вызове InternetQueryOption,
Кто-нибудь понял, в чем может быть проблема?

int main(int argc, char* argv[])
{

HINTERNET hInternet = InternetOpen("x", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
//
// 1. Set
//
{
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[2];
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[0].Value.pszValue = "http://myserver/get_proxy_info.dll";
Option[1].dwOption = INTERNET_PER_CONN_FLAGS;
Option[1].Value.dwValue = PROXY_TYPE_AUTO_PROXY_URL;

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 2;
List.dwOptionError = 0;
List.pOptions = Option;

if(!InternetSetOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, nSize))
printf("InternetQueryOption failed! (%d)\n", GetLastError());
}
//
// 2. Query
//
{
INTERNET_PER_CONN_OPTION_LIST    List;
INTERNET_PER_CONN_OPTION         Option[5];
unsigned long                    nSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);

Option[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
Option[1].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
Option[2].dwOption = INTERNET_PER_CONN_FLAGS;
Option[3].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
Option[4].dwOption = INTERNET_PER_CONN_PROXY_SERVER;

List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST);
List.pszConnection = NULL;
List.dwOptionCount = 5;
List.dwOptionError = 0;
List.pOptions = Option;

printf("InternetQueryOption:\n");
if(!InternetQueryOption(hInternet, INTERNET_OPTION_PER_CONNECTION_OPTION, &List, &nSize))
printf("InternetQueryOption failed! (%d)\n", GetLastError());
if(Option[0].Value.pszValue != NULL)
printf("%s\n", Option[0].Value.pszValue);

if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) == PROXY_TYPE_AUTO_PROXY_URL)
printf("PROXY_TYPE_AUTO_PROXY_URL\n");

if((Option[2].Value.dwValue & PROXY_TYPE_AUTO_DETECT) == PROXY_TYPE_AUTO_DETECT)
printf("PROXY_TYPE_AUTO_DETECT\n");

INTERNET_VERSION_INFO      Version;
nSize = sizeof(INTERNET_VERSION_INFO);

InternetQueryOption(hInternet, INTERNET_OPTION_VERSION, &Version, &nSize);

if(Option[0].Value.pszValue != NULL)
GlobalFree(Option[0].Value.pszValue);

if(Option[3].Value.pszValue != NULL)
GlobalFree(Option[3].Value.pszValue);

if(Option[4].Value.pszValue != NULL)
GlobalFree(Option[4].Value.pszValue);

}

}

В Windows XP он нарушает доступ к памяти, пытаясь получить доступ к чему-то, стоящему за NULL указатель.

    wininet.dll!PROXY_SERVER_LIST::CopyString(void) Unknown
wininet.dll!PROXY_INFO::GetProxySettings(struct INTERNET_PROXY_INFO_EX *,int)   Unknown
wininet.dll!PROXY_INFO_GLOBAL::GetProxySettings(struct INTERNET_PROXY_INFO_EX *,int)    Unknown
wininet.dll!QueryPerConnOptions(void *,int,struct INTERNET_PER_CONN_OPTION_LISTA *) Unknown
wininet.dll!_InternetQueryOptionA@16()  Unknown
>   InternetQueryOption.exe!main(int argc=1, char * * argv=0x003e2e60) Line 55  C++
InternetQueryOption.exe!__tmainCRTStartup() Line 278    C

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]