解説
Wininet.dllを利用してインターネット上からファイルをダウンロードする方法。
URLを変えることでHTTPでもFTPでもダウンロードできる。
使用例
DownloadTest("http://www.dinop.com//test.exe","c:\\test.exe");
DownloadTest("ftp://userId:password@www.dinop.com//test.exe","c:\\test.exe");
ソースコード
#include "atlfile.h"
#include "wininet.h"
#pragma comment(lib,"wininet.lib")
bool DownloadTest(LPCTSTR pszURL,LPCTSTR pszLocalFile,DWORD dwBuffSize=1024)
{
TCHAR pszHeader[] = _T("Accept: */*\r\n\r\n");
BOOL ret;
DWORD dwReadSize;
DWORD dwWrittenSize;
BYTE* pcbBuff;
HINTERNET hInternet;
HINTERNET hConnect;
HRESULT hr;
CAtlFile cFile;
pcbBuff = new BYTE[dwBuffSize];
if(pcbBuff == NULL)
return false;
hr = cFile.Create(pszLocalFile,GENERIC_WRITE,0,CREATE_NEW); //ファイルがあれば失敗
if(FAILED(hr))
{
delete pcbBuff;
return false;
}
hInternet = ::InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
if(hInternet == NULL)
{
delete pcbBuff;
return false;
}
hConnect = ::InternetOpenUrl(hInternet,pszURL,pszHeader,lstrlen(pszHeader),INTERNET_FLAG_DONT_CACHE,0);
if(hConnect == NULL)
{
::InternetCloseHandle(hInternet);
delete pcbBuff;
return false;
}
while(1)
{
::Sleep(0);
ret = ::InternetReadFile(hConnect,pcbBuff,dwBuffSize,&dwReadSize);
if(ret)
{
if(dwReadSize == 0)
break;
hr = cFile.Write(pcbBuff,dwReadSize,&dwWrittenSize);
if(SUCCEEDED(hr))
continue;
}
cFile.Close();
::InternetCloseHandle(hConnect);
::InternetCloseHandle(hInternet);
delete pcbBuff;
return false;
}
hr = cFile.Flush();
cFile.Close();
::InternetCloseHandle(hConnect);
::InternetCloseHandle(hInternet);
delete pcbBuff;
return SUCCEEDED(hr) ? true : false;
}







