使用Win32 Internet API的下载文件

文章来源: http://www.vckbase.com/document/viewdoc/?id=319
  1. /*

  2. INET.H

  3. Header containing InternetGetFile and a wrapper function, InternetDownloadFile which also makes the Internet connection.

  4. */

  5. #ifndef INET_H
  6. #define INET_H
  7. #ifndef WIN32_LEAN_AND_MEAN
  8. #define WIN32_LEAN_AND_MEAN
  9. #include <windows.h>
  10. #endif
  11. #include <stdio.h>
  12. #include <wininet.h>
  13. #include <mmsystem.h>

  14. enum
  15. {
  16.     INTERNET_ERROR_OPENURL=1,
  17.     INTERNET_ERROR_FILEOPEN,
  18.     INTERNET_ERROR_READFILE,
  19.     INTERNET_ERROR_OPEN
  20. };

  21. UINT InternetGetFile (HINTERNET IN hOpen, // Handle from InternetOpen()
  22.                  CHAR *szUrl,        // Full URL
  23.                  CHAR *szFileName,
  24.                  HWND hwndProgress,
  25.                  int idStatusText,
  26.                  int idProgressBar)
  27. {
  28.        DWORD dwSize;
  29.        CHAR   szHead[] = "Accept: */*/r/n/r/n";
  30.        VOID* szTemp[16384];
  31.        HINTERNET  hConnect;
  32.        FILE * pFile;

  33.        if ( !(hConnect = InternetOpenUrlA ( hOpen, szUrl, szHead,
  34.              lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
  35.        {
  36.            return INTERNET_ERROR_OPENURL;
  37.        }

  38.        if  ( !(pFile = fopen (szFileName, "wb" ) ) )
  39.       {
  40.           return INTERNET_ERROR_FILEOPEN;
  41.       }

  42.     DWORD dwByteToRead = 0;
  43.     DWORD dwSizeOfRq = 4;
  44.     DWORD dwBytes = 0;

  45.         if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, 
  46.                       (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
  47.         {
  48.         dwByteToRead = 0;
  49.     }
  50.     DWORD start;
  51.     DWORD end;
  52.     DWORD time;
  53.     time = 10;
  54.     start = timeGetTime();
  55.        do
  56.        {
  57.           // Keep coping in 16 KB chunks, while file has any data left.
  58.           // Note: bigger buffer will greatly improve performance.
  59.           if (!InternetReadFile (hConnect, szTemp, 16384,  &dwSize) )
  60.           {
  61.               fclose (pFile);
  62.             return INTERNET_ERROR_READFILE;
  63.           }
  64.           if (!dwSize)
  65.               break;  // Condition of dwSize=0 indicate EOF. Stop.
  66.           else
  67.              fwrite(szTemp, sizeof (char), dwSize , pFile);
  68.     dwBytes+=dwSize;
  69.     if(dwByteToRead && hwndProgress)
  70.     {
  71.     SendDlgItemMessageA(hwndProgress, idProgressBar, WM_USER+2, (dwBytes*100)/dwByteToRead, 0);
  72.     UpdateWindow(hwndProgress);
  73.     }
  74.     FLOAT fSpeed = 0;
  75.     fSpeed = (float)dwBytes;
  76.     fSpeed /= ((float)time)/1000.0f;
  77.     fSpeed /= 1024.0f;
  78.     if(hwndProgress)
  79.     {
  80.         char s[260];
  81.         sprintf(s, "%d KB / %d KB @ %1.1f KB/s", dwBytes/1024, dwByteToRead/1024, fSpeed);
  82.         SetDlgItemTextA(hwndProgress, idStatusText, s);
  83.         UpdateWindow(hwndProgress);
  84.     }
  85.     end = timeGetTime();
  86.     time = end - start;
  87.     if(time == 0)
  88.     time = 10;
  89.        }   // do
  90.       while (TRUE);
  91.       fflush (pFile);
  92.       fclose (pFile);
  93.       return 0;
  94. }

  95. int InternetDownloadFile(HWND progressWindow, int idStatusText, int idProgressBar, char *URL, char *FileDest)
  96. {
  97. DWORD dwFlags;
  98. DWORD dwResult = INTERNET_ERROR_OPEN;
  99. InternetGetConnectedState(&dwFlags, 0);
  100. if(dwFlags & INTERNET_CONNECTION_OFFLINE)//take appropriate steps
  101.     return INTERNET_ERROR_OPEN;
  102. CHAR strAgent[64];
  103. sprintf(strAgent, "Agent%ld", timeGetTime());
  104. HINTERNET hOpen;
  105. if(!(dwFlags & INTERNET_CONNECTION_PROXY)) //怀疑这个地方有问题
  106. //如果本机用代理服务器连接到Internet
  107. hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
  108. else
  109. //如果本机没有用代理服务器连接到Internet
  110. hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
  111. if(hOpen)
  112. {
  113.     dwResult = InternetGetFile(hOpen, URL, FileDest, progressWindow, idStatusText, idProgressBar);
  114.     InternetCloseHandle(hOpen);
  115. }
  116. else return INTERNET_ERROR_OPEN;
  117. return dwResult;
  118. }

  119. #endif /*INET_H*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值