ほわいとのプログラム
Section 4 ・・・ インターネットからダウンロード

インターネットに接続して,ファイルをダウンロードします. プロキシサーバに接続して,ユーザの認証要求があれば,その認証を行います. プロキシの設定は,なければデフォルトのものを使います.

wininet.hをインクルードして,wininet.libをプロジェクトに入れておく必要があります.

ダウンロードしたデータは,ファイルに保存します.

    #deinfe	STRMIN		(256)
    
    char	*gsProxyServer;		// プロキシサーバ
    char	*gsProxyPort;		// プロキシポート
    char	*gsProxyUser;		// プロキシ認証ユーザ名
    char	*gsProxyPassword;	// プロキシ認証パスワード
    
    // インターネットに接続
    // 返り値
    UCHAR GetFromInternet(char *sUrl)
    {
      HWND		hWnd;
      HINTERNET	hInternet;
      HINTERNET	hHttpRequest;
      BYTE		bBuffer[STRMIN];
      HANDLE	hFile;
      SYSTEMTIME	sLastWriteTime;
      FILETIME	fLastWriteTime;
      DWORD		dwRead, dwCode, dwSize, dwTotal, dwLength;
      BYTE		*bRet = NULL;
      BOOL		bGetFileTime
      char		sStr[1024], sFileName[1024];
      int		i;
      static BOOL	bProxyCheck = FALSE;
    
      // WININET初期化
      if ( gsProxyServer != NULL ) {
        if ( gsProxyPort != NULL ) {
          sprintf(sStr, "%s:%s", gsProxyServer, gsProxyPort);
        }
        else {
          sprintf(sStr, "%s", gsProxyServer);
        }
        hInternet = InternetOpen(
    			     NAME,
    			     INTERNET_OPEN_TYPE_PROXY,
    			     sStr,
    			     NULL,
    			     0);
      }
      else {
        hInternet = InternetOpen(
    			     NAME,
    			     INTERNET_OPEN_TYPE_PRECONFIG,
    			     NULL,
    			     NULL,
    			     0);
      }
      if ( hInternet == NULL ) {
        Error("インターネットに接続できません");
        return 1;
      }
    
      // URLを開く
      hHttpRequest = InternetOpenUrl(hInternet,
    				 sUrl,
    				 NULL,
    				 0,
    				 INTERNET_FLAG_RELOAD,
    				 0);
    
      // プロキシユーザ認証チェック
      if ( bProxyCheck == FALSE ) {
        HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
        dwSize = sizeof(DWORD);
        HttpQueryInfo(hHttpRequest,
    		  HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
    		  &dwCode, &dwSize, NULL);
        if ( dwCode == HTTP_STATUS_PROXY_AUTH_REQ ) {
          // プロキシユーザ設定あり
          if ( gsProxyUserName != NULL && gsProxyPassword != NULL ) {
    	strcpy(sStr, gsProxyUserName);
    	if ( InternetSetOption(hHttpRequest,
    			       INTERNET_OPTION_PROXY_USERNAME,
    			       (LPVOID)sStr, lstrlen(sStr)) == TRUE ) {
    	  strcpy(sStr, gsProxyPassword);
    	  if ( sStr[0] != '\0' &&
    	       InternetSetOption(hHttpRequest,
    				 INTERNET_OPTION_PROXY_PASSWORD,
    				 (LPVOID)sStr, lstrlen(sStr)) == TRUE ) {
    	    HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
    	    bProxyCheck = TRUE;
    	  }
    	}
          }
          // プロキシユーザ認証入力ウィンドウ
          else if ( InternetErrorDlg(GetDesktopWindow(),
    				 hHttpRequest,
    				 ERROR_INTERNET_INCORRECT_PASSWORD,
    				 FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
    				 FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
    				 FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
    				 NULL) == ERROR_INTERNET_FORCE_RETRY ) {
    	HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
    	bProxyCheck = TRUE;
          }
          else {
    	InternetCloseHandle(hHttpRequest);
    	return 0xff;
          }
        }
      }
    
      // コンテンツの長さを取得
      if ( gbForceUpdate == FALSE ) {
        HttpSendRequest(hHttpRequest, NULL, 0, NULL, 0);
        dwSize = sizeof(long);
        HttpQueryInfo(
    		  hHttpRequest,
    		  HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
    		  &dwLength,
    		  &dwSize,
    		  NULL);
      }
      else {
        dwLength = 0;
      }
    
      // コンテンツ時刻
      if ( gbForceUpdate == FALSE ) {
        bGetFileTime = FALSE;
        dwSize = sizeof(SYSTEMTIME);
        HttpQueryInfo(
    		  hHttpRequest,
    		  HTTP_QUERY_LAST_MODIFIED | HTTP_QUERY_FLAG_SYSTEMTIME,
    		  &sLastWriteTime,
    		  &dwSize,
    		  NULL);
        if ( dwSize > 0 ) {
          SystemTimeToFileTime(&sLastWriteTime, &fLastWriteTime);
          bGetFileTime = TRUE;
        }
      }
    
      // ダウンロード
      dwTotal = 0;
      while ( TRUE ){
        if ( TRUE != InternetReadFile(hHttpRequest, bBuffer, STRMIN, &dwRead) ) {
          Error("インターネットからのファイルの読み込みに失敗しました");
          InternetCloseHandle(hHttpRequest);
          InternetCloseHandle(hInternet);
          if ( bRet != NULL ) {
    	free(bRet);
          }
          return 1;
        }
    
        // すべてのデータを読み込んだとき
        if ( dwRead == 0 ) break;
    
        // 読み込んだデータを追加
        if ( bRet == NULL ) {
          if ( ( bRet = (BYTE *)malloc(sizeof(BYTE)*(dwTotal+dwRead)) )
               == NULL ) {
    	InternetCloseHandle(hHttpRequest);
    	return 0;
          }
          for ( i = 0 ; (unsigned)i < dwRead ; i++ ) {
    	*(bRet+i) = bBuffer[i];
          }
        }
        else {
          if ( ( bRet = (BYTE *)realloc(bRet, sizeof(BYTE)*(dwTotal+dwRead)) )
    	   == NULL ) {
    	InternetCloseHandle(hHttpRequest);
    	return 0;
          }
          for ( i = 0 ; (unsigned)i < dwRead ; i++ ) {
    	*(bRet+dwTotal+i) = bBuffer[i];
          }
        }
    
        dwTotal += dwRead;
      }
    
      // 保存用ファイル名取得
      strcpy(sFileName, sUrl);
      for ( i = strlen(sUrl) - 1 ; i >= 0 ; i-- ) {
        if ( *(sUrl+i) == '/' ) {
          strcpy(sFileName, sUrl+i+1);
          break;
        }
      }
    
      // 保存ファイル書き込み
      hFile = CreateFile(sFileName,			// ファイル名
    		     GENERIC_WRITE,		// アクセスモード
    		     FILE_SHARE_READ,		// 共有モード
    		     NULL,			// セキュリティ記述子
    		     CREATE_ALWAYS,		// 作成方法
    		     FILE_ATTRIBUTE_NORMAL,	// ファイル属性
    		     NULL			// テンプレートファイル
    		     );
    
      if ( hFile != INVALID_HANDLE_VALUE ) {
        WriteFile(hFile,		// ファイルのハンドル
    	      bRet,		// データバッファ
    	      dwTotal,		// 書き込み対象のバイト数
    	      &dwSize,		// 書き込んだバイト数
    	      NULL		// オーバーラップ構造体のバッファ
    	      );
        if ( bGetFileTime ) {
          SetFileTime(hFile, &fLastWriteTime, &fLastWriteTime, &fLastWriteTime);
        }
        CloseHandle(hFile);
      }
      else {
        InternetCloseHandle(hHttpRequest);
        return 0;
      }
    
      InternetCloseHandle(hHttpRequest);
      InternetCloseHandle(hInternet);
    
      if ( bRet != NULL ) free(bRet);
    
      return 4;
    }
    
最終更新日時 : 2013年 9月23日(月) 14時 9分 4秒