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

Posted

技术标签:

【中文标题】在调用 InternetGetProxyInfo() 之前应该进行哪些初始化?【英文标题】:What initialization should be made prior to calling InternetGetProxyInfo()? 【发布时间】:2013-12-25 15:22:44 【问题描述】:

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

它工作得很好。但是当我尝试调用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,这是一个教育问题,而不是实际问题。

【问题讨论】:

Have you seen this? @sftrabbit 是的“第一次”。如您所见,我两次调用 pIGPI()。 我发现wininet.dll中的InternetInitializeAutoProxyDll()只是一个存根。 但是wininet.dll 知道如何使用正确的参数在jsproxy.dll 中调用InternetInitializeAutoProxyDll() 【参考方案1】:

有两种方式:

简单:使用虚拟 URL 调用 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);

hard:在 jsproxy 中调用 InternetInitializeAutoProxyDll()。但是要准备参数,您必须自己做所有事情:从注册表中读取设置,解析它们,检测并下载 PAC 文件并提供 AutoProxyHelperVtbl 的实现,其中包含 GetIPAddress()IsInNet()、等等。

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

【讨论】:

以上是关于在调用 InternetGetProxyInfo() 之前应该进行哪些初始化?的主要内容,如果未能解决你的问题,请参考以下文章

在webservice的一次调用中能循环调用接口方法

返回函数调用与仅在递归期间再次调用函数有啥区别?

在 foreach 中调用类仅最后一次调用有效

在 JSX 中调用 javascript 函数:为啥在没有 () 的情况下调用函数?

c语言中,在一个自定义函数里面只能调用一个自定义函数吗?可以调用多个吗?如果可以怎么调用?

为啥 C# 编译器会在最后一个方法调用是条件调用时删除一串方法调用?