在调用InternetGetProxyInfo()之前应该进行什么初始化?

时间:2013-12-25 15:22:45

标签: c++ wininet

我将Internet Explorer配置为使用本地PAC文件: ie proxy settings

它运作得很好。但是,当我尝试拨打InternetGetProxyInfo()时,它会以ERROR_CAN_NOT_COMPLETE失败。可能是什么问题?

#ifndef WINVER              // Allow use of features specific to Windows XP or later.
#define WINVER 0x0501       // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINNT        // Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif                      

#include <winsock2.h>
#include <windows.h>
#include <wininet.h>
#include <tchar.h>

#define URL "http://www.yandex.ru/"
#define HOST "www.yandex.ru"

int _tmain(int argc, _TCHAR* argv[])
{
    char proxyBuffer[1024];
    char *str = proxyBuffer;
    DWORD nb = 1024;
    DWORD dw;
    BOOL b;
    pfnInternetGetProxyInfo pIGPI;                // Function-pointer instance

    /* code from MSDN: */    
    {
        HMODULE hModJS;                               // Handle for loading the DLL

        hModJS = LoadLibrary( TEXT("jsproxy.dll") );
        if (!hModJS)
        {
        _tprintf( TEXT("\nLoadLibrary failed to load jsproxy.dll with error: %d\n"),
        GetLastError( ) );
        return( FALSE );
        }

        pIGPI = (pfnInternetGetProxyInfo)
        GetProcAddress( hModJS, "InternetGetProxyInfo" );
        if (!pIGPI)         
        {
        _tprintf( TEXT("\nGetProcAddress failed to find InternetGetProxyInfo, error: %d\n"),
        GetLastError( ) );
        return( FALSE );
        }

        // The pIGPI function pointer can now be used to call InternetGetProxyInfo.
    }

    InternetInitializeAutoProxyDll(0); /* wininet.dll version of this function */
    SetLastError(0);
    b = pIGPI(URL,sizeof(URL),HOST,sizeof(HOST), &str, &nb);
    dw = GetLastError();

    SetLastError(0);
    b = pIGPI(URL,sizeof(URL)-1,HOST,sizeof(HOST)-1, &str, &nb);
    dw = GetLastError();

    return 0;
}

请不要告诉我使用其他API,这是一个教育性的,不实用的问题。

1 个答案:

答案 0 :(得分:2)

有两种方式:

  • easy:使用虚拟网址调用InternetOpenUrl(),让wininet初始化jsproxy:

    #define URL "https://yandex.ru:777"
    #define HOST "yandex.ru"
    HINTERNET hInternet = InternetOpen(_T("try-wininet"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET hUrl = InternetOpenUrl(hInternet, _T("http://0.0.0.0"), NULL, 0, 0, 20);
    InternetCloseHandle(hUrl);
    InternetCloseHandle(hInternet);
    InternetGetProxyInfo(URL,sizeof(URL)-1,HOST,sizeof(HOST)-1, &str, &nb);
    GlobalFree(str);
    
  • 很难:在jsproxy中调用InternetInitializeAutoProxyDll()。但是要准备参数,您必须自己做所有事情:从注册表中读取设置,解析它们,检测并下载PAC文件,并提供包含AutoProxyHelperVtbl等功能的GetIPAddress()实现, IsInNet()等。

当没有配置PAC脚本时,

InternetGetProxyInfo()失败,尽管在对话框的底部设置了一些代理服务器。在这种情况下,您应该致电InternetQueryOption(NULL, INTERNET_OPTION_PROXY,...)