zoukankan      html  css  js  c++  java
  • 求高手指点:VC中wininet的代理服务器问题,耗了两天了,没有一点办法

    windows xp sp3 + ie6环境

    如何在CInternetSession下传文件时,设置要求用户名口令的代理服务器?
    如果安装了ie8,CInternetSession会自动采用ie的设置和用户保存的凭据,程序是完全透明的,但ie6下,相同的程序行为不同了,如何显式地设置代理服务器与用户名口令呢?

    下面是我目前不能工作的代码,这个代码在ie8的环境里完全不必有SetOption()的动作都能自动正常。

    如何实现代理服务器的设置?
    BOOL GetHttpFile(LPCTSTR psUrl, LPCTSTR psLocalFile, CString &sErrMg)
    {
        //通过http获得远程的update文件。
        char buf[65536];    
        CString sTemp;

        CInternetSession sess;
        char* sProxyServer = _T("http://192.168.1.9:8080");
        char* sProxyUserName = _T("bejlife\\username");
        char* sProxyPassword = _T("Password");

        INTERNET_PROXY_INFO proxyinfo;

        proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
        proxyinfo.lpszProxy = sProxyServer;
        proxyinfo.lpszProxyBypass = NULL;

        bool b = sess.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO), 0);


        CHttpFile* fileGet;
        try
        {
            
            fileGet=(CHttpFile*)sess.OpenURL(psUrl); //, 1, INTERNET_FLAG_TRANSFER_BINARY);
            if(!fileGet)
            {
                sess.Close();
                sErrMg = "不能打开远程文件!";
                return FALSE;
            }

            fileGet->SetOption(INTERNET_OPTION_PROXY_USERNAME, (LPVOID)sProxyUserName, lstrlen(sProxyUserName) + 10);
            fileGet->SetOption(INTERNET_OPTION_PROXY_PASSWORD, (LPVOID)sProxyPassword, lstrlen(sProxyPassword) + 10);
        }
        catch(CException* e)
        {
            fileGet = NULL;
        }    
        
        if(!fileGet)
        {
            sess.Close();
            sErrMg = "不能找到远程文件!";
            return FALSE;
        }
        int iBuffLen;

        DWORD dwStatus;
        DWORD dwBuffLen = sizeof(dwStatus);
        BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen);

        if(!( bSuccess && dwStatus>= 200&& dwStatus<300 ))
        {
            fileGet->Close();
            sess.Close();
            delete fileGet;
            sErrMg.Format("打开远程文件出错,错误码:%d", dwStatus);
            
            return FALSE;
        }


        CFile fileWrite; 
        if( ! fileWrite.Open(psLocalFile, CFile::modeWrite|CFile::modeCreate))
        {
            fileGet->Close();
            sess.Close();
            delete fileGet;
            sErrMg.Format("本地文件打开出错."); 
            return FALSE;
        }

        iBuffLen = fileGet->Read((void*)buf, sizeof(buf));

        while(iBuffLen != 0)
        {
            fileWrite.Write(buf, iBuffLen);
            iBuffLen = fileGet->Read((void*)buf, sizeof(buf));
        }
        fileWrite.Close();
        fileGet->Close();
        sess.Close();
        delete fileGet;
        sErrMg.Format("下载成功");

        return TRUE;

  • 相关阅读:
    制作计算器的代码(C#)
    Oracle如何实现创建数据库、备份数据库及数据导出导入操作
    XmlDocument类
    Android强大的开源库与系统架构工具
    IO
    胎压监测设备
    福施福、爱乐维、玛特纳各成分比较(已换算成同一单位)
    用车不容忽视的细节
    汽车必备车饰和常用物品
    j2ee指导型框架或示例
  • 原文地址:https://www.cnblogs.com/haoxiaobo/p/2315722.html
Copyright © 2011-2022 走看看