CCHTMLOptimizerDlg *pWnd = (CCHTMLOptimizerDlg*)pVoid;
HINTERNET han,hanFile;
han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(han==NULL)
return 0;
hanFile = ::InternetOpenUrl(han,
_T("http://www.csspace.com/mainbody.html"),
NULL,
0,
INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_PRAGMA_NOCACHE,
0);
if(hanFile==NULL)
return 0;
FILE* fp = fopen("c:\\test.html","w");
if(fp==NULL){
return 0;
}
INTERNET_BUFFERS *internetBuffers;
const long BUFFER_SIZE = 4096;
char buffer[BUFFER_SIZE];
unsigned long lBytesReaded=0; while(true){
buffer[0] = '\0';
internetBuffers = new INTERNET_BUFFERS;
internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
internetBuffers->lpcszHeader = NULL;
internetBuffers->lpvBuffer = buffer;
internetBuffers->dwBufferLength = BUFFER_SIZE;
internetBuffers->Next = NULL;
internetBuffers->dwOffsetLow = lBytesReaded;
while(true){
::InternetReadFileEx(hanFile,internetBuffers,0,0);
CString str;
Sleep(500);
str.Format("操作指示: 字节数:%8d",lBytesReaded + BUFFER_SIZE - internetBuffers->dwBufferLength);
pWnd->pStuBar->SetText(str,4,0);
if(internetBuffers->dwBufferLength==0){
int len = strlen(buffer);
fwrite(buffer,1,len,fp);
lBytesReaded += len;
delete internetBuffers;
break;
}
}
}
fclose(fp);
pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
::InternetCloseHandle(han);为什么我都已经删除 internetBuffers 对象了,InternetReadFileEx读数据还是不成功(第二次,也就是 internetBuffers->dwOffsetLow = 4096了,而 internetBuffers->dwBufferLength返回总是0)

解决方案 »

  1.   

    以上问题以解决,只是又出现一新问题
    CCHTMLOptimizerDlg *pWnd = (CCHTMLOptimizerDlg*)pVoid;
    HINTERNET han,hanFile;
    han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    if(han==NULL)
    return 0;
    hanFile = ::InternetOpenUrl(han,
    _T("http://www.csspace.com/mainbody.html"),
    NULL,
    0,
    INTERNET_FLAG_PRAGMA_NOCACHE,
    0);
    if(hanFile==NULL)
    return 0;
    FILE* fp = fopen("c:\\test.txt","w");
    if(fp==NULL){
    return 0;
    }
    pWnd->pStuBar->SetText("操作指示: 正在下载资料...",4,0);
    INTERNET_BUFFERS *internetBuffers;
    const int BUFFER_SIZE = 2045;
    TCHAR buffer[BUFFER_SIZE];
    unsigned long lBytesReaded=0; buffer[0] = NULL;
    internetBuffers = new INTERNET_BUFFERS;
    internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
    internetBuffers->lpcszHeader = NULL;
    internetBuffers->lpvBuffer = buffer;
    internetBuffers->dwBufferLength = BUFFER_SIZE;
    internetBuffers->Next = NULL;
    internetBuffers->dwOffsetLow = 0;
    while(true){
    ::InternetReadFileEx(hanFile,internetBuffers,0,0);
    fwrite(buffer,1,internetBuffers->dwBufferLength,fp);
    memset(buffer,0,BUFFER_SIZE);
    lBytesReaded += internetBuffers->dwBufferLength;
    internetBuffers->dwOffsetLow = lBytesReaded;
    if(internetBuffers->dwBufferLength==0)
    break;
    }
    delete internetBuffers;
    fclose(fp);
    pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
    ::InternetCloseHandle(han);这里的 BUFFER_SIZE 不能随便设,设为不同的值都有可能出现不同的结果(结果是读到的数据量不对,一个文件有40K可能只读取12K 或 6K 或 10K,此时只能尝试其它值,如 4095 或 1023 设为双数时通常会有上面的错误(只读到12K或...)还有,如果正常,读取的数据文本文件的换行是 0d 0d 0a 是怎么回事(此时我没试过读取NT服务器上的网页,可能是我读取的服务器的类型的原因),读取二进制文件有问题,得到的数据不正确
    为什么CSDN的人气这么好,却没有人看我的贴子????真是气到家了,连发三张帖子都没人看
      

  2.   

    InternetOpen有个参数,表明是按二进制读还是按照文本方式读,你好好
    看一下。我使用过,一点问题都没有。而且你读取的时候使用while(true)
    循环也有问题,我记得有一个flag可以表示文件是否读完。至于BUFFER_SIZE
    的定义,肯定是你的程序写的有问题,我用过,可以设置为任意大小的数据。
      

  3.   

    是高人都上!
    还有,我发觉用FTP方式读取文件时在InternetSetFilePointer时返回为-1,可是GetLastError()值却是0,这是为什么?
      

  4.   

    to EetyChen(三刀主):
     我觉得应该是参数有误,我那 hanFile 如果前面的InternetOpen 参数不为INTERNET_OPEN_TYPE_PRECONIFG 则会打开不成功,返回也是 0 
    0 = ERROR_SURCESS
    hanFile为NULL
      

  5.   

    其实什么问题也没有,呵呵,我这个人就是太粗心
    以下是最终代码(主要是打开文件模式错误,所以得到的数据总是不对的 wb 与 w 的错误
    CCHTMLOptimizerDlg *pWnd = (CCHTMLOptimizerDlg*)pVoid;
    HINTERNET han,hanFile;
    han = ::InternetOpen(_T("CoolSoft HTML Optimizer Update"),
    INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
    if(han==NULL)
    return 0;
    char szHead[] = "Accept: */*\r\n\r\n";
    hanFile = ::InternetOpenUrl(han,
    _T("http://www.csspace.com/downloads/products/chtmlzip.zip"),
    szHead,
    strlen(szHead),
    INTERNET_FLAG_PRAGMA_NOCACHE,
    0);
    if(hanFile==NULL)
    return 0;
    FILE* fp = fopen("c:\\test.exe","wb");
    if(fp==NULL){
    return 0;
    }
    pWnd->pStuBar->SetText("操作指示: 正在下载资料...",4,0);
    INTERNET_BUFFERS *internetBuffers;
    const int BUFFER_SIZE = 25;
    TCHAR buffer[BUFFER_SIZE];
    unsigned long lBytesReaded=0; buffer[0] = NULL;
    internetBuffers = new INTERNET_BUFFERS;
    internetBuffers->dwStructSize = sizeof(INTERNET_BUFFERS);
    internetBuffers->lpcszHeader = NULL;
    internetBuffers->lpvBuffer = buffer;
    internetBuffers->dwBufferLength = BUFFER_SIZE;
    internetBuffers->Next = NULL;
    internetBuffers->dwOffsetLow = 0;
    while(true){
    while(!::InternetReadFileEx(hanFile,internetBuffers,0,0)){
    static int errorCount=0;
    errorCount++;
    if(errorCount==20){
    pWnd->MessageBox("网络错误,不能下载更新文件!","失败");
    fclose(fp);
    return 0;
    }
    pWnd->pStuBar->SetText("操作指示: 网络连接出错,正在重试...",4,0);
    Sleep(1000);
    };
    fwrite(buffer,sizeof(char),internetBuffers->dwBufferLength,fp);
    memset(buffer,0,BUFFER_SIZE);
    lBytesReaded += internetBuffers->dwBufferLength;
    internetBuffers->dwOffsetLow = lBytesReaded;
    if(internetBuffers->dwBufferLength==0)
    break;
    }
    delete internetBuffers;
    fclose(fp);
    pWnd->pStuBar->SetText("操作指示: 成功下载!",4,0);
    ::InternetCloseHandle(han);