下面是我的一段下载文件的代码: 

…… 
CInternetSession *m_pSession = new CInternetSession(); 
CHttpFile* pFile = (CHttpFile*)(m_pSession->OpenURL(sUrl,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE )); 
DWORD dwRet; 
pFile->QueryInfoStatusCode(dwRet); 
if (dwRet == HTTP_STATUS_OK) 
…… 
else 
…… 

我的电脑上 dwRet = 200 正确,但有的别的电脑 dwRet = 404,说 找不到sUrl,但是我跟进去 sUrl 没错,可以用IE浏览器打开! 
求各位帮忙,到底是什么原因有的电脑OpenURL不成功,以及解决方法!!!

解决方案 »

  1.   

    sUrl没有出错,在我的电脑上和出错的那台电脑上都是一样的“http://qianqiu01.pown.cn/bmp/登陆界面.png”,这个是一个游戏的自动更新,我的电脑可以下到这个图片,但另一台就会在OpenURL那里出错。
    对了,那台出错的电脑上有一些比较小的文件还是可以下到的,比如下载列表文件,但大一点的文件就会出错,我电脑上从来没出现过这个问题,真是囧死了……
      

  2.   

    晕啊,问题的原因找到了,但是更奇怪了!!!
    是因为OpenURL(sUrl,……)的sUrl里有汉字!!!
    但是为什么我的电脑没问题,有的电脑就会出错呢?晕啊!!!
      

  3.   

    如果是中文操作系统应该没有问题,其他语言就不太清楚了建议使用UNICODE版本的程序。
      

  4.   

    问题解决了!O(∩_∩)O哈哈~
    问题产生的原因是因为,在有的电脑上OpenURL中的sUrl包含汉字时自身进行的URL编码会出错(虽然还不找到是什么原因)。
    在网上找到了URL编码程序,在OpenURL之前先把下载文件名进行一遍URL编码,就OK了。
    URL编码程序:
    inline BYTE toHex(const BYTE &x)
    {
    return x > 9 ? x + 55: x + 48;
    }
    CString URLEncode(CString sIn)
    {
    CString sOut;
    const int nLen = sIn.GetLength() + 1;
    register LPBYTE pOutTmp = NULL;
    LPBYTE pOutBuf = NULL;
    register LPBYTE pInTmp = NULL;
    LPBYTE pInBuf =(LPBYTE)sIn.GetBuffer(nLen);
    BYTE b = 0;
    //alloc out buffer
    pOutBuf = (LPBYTE)sOut.GetBuffer(nLen*3 - 2);//new BYTE [nLen  * 3];
    if(pOutBuf)
    {
    pInTmp   = pInBuf;
    pOutTmp = pOutBuf;
    // do encoding
    while (*pInTmp)
    {
    if(isalnum(*pInTmp))
    *pOutTmp++ = *pInTmp;
    else
    if(isspace(*pInTmp))
    *pOutTmp++ = '+';
    else
    {
    *pOutTmp++ = '%';
    *pOutTmp++ = toHex(*pInTmp>>4);
    *pOutTmp++ = toHex(*pInTmp%16);
    }
    pInTmp++;
    }
    *pOutTmp = '\0';
    //sOut=pOutBuf;
    //delete [] pOutBuf;
    sOut.ReleaseBuffer();
    }
    sIn.ReleaseBuffer();
    return sOut;
    }
    感谢 http://blog.csdn.net/zhengyun_ustc/ 这个BLOG的作者!