山本ワールド
Windowsプログラミング
アルゴリズム Vitual C++ 2008/2013によるWin32/Win64 APIレベルのプログラム 基礎 Vitual C++ 2008/2013によるAPIレベルのプログラム(32/64bit) Wix3でインストーラーを作る Visual C++ 2008 Standard Editonによるフォームアプリケーションのプログラム(32/64bit) Vitual C++ 2008 Standard EditonによるAPIレベルのプログラム(32/64bit) Windows 7対応 Visual C++ 2008 ExpressによるAPIレベルのプログラム Visual C++ 2005 ExpressによるAPIレベルのプログラム Visual C++ Versiosn 5 BORLAND C++ Windowsプログラム全般 Excel VBA その他インターネット上のファイルの有無、サイズ、日時を取得する(32/64bit)
概要
指定されたURLのファイルの有無を確認しサイズと更新日時を取得します。
テスト環境
コンパイラ
Visual C++ 2008/2013 Express 32/64bit マルチバイト/UNICODE実行環境
Windows XP Professional Service Pack 3 32bit(Virtual Box上の仮想マシーン)Windows 7 Enterprise Service Pack 1 64bit
プログラムソースの概要
htmlget7.cpp
_tWinMain
ダイアログボックスを呼び出します。DlgProc
WM_INITDIALOG
初期化時に呼び出されます。初期URLアドレスを設定します。
WM_COMMAND
IDOK
取得ボタンをクリックすると呼び出されます。エディットボックスからURLを取得し、HtmlGet2関数を呼び出し、ステータス、ファイルサイズ、更新日時を取得します。
取得されたステータス、ファイルサイズ、更新日時をエディットボックスに表示します。
IDCANCEL
キャンセルボタンをクリックすると呼び出されます。EndDialog APIによりダイアログボックスを終了させます。
HtmlGet2
InternetCrackUrl APIによりURLからサーバー名等を取得します。インターネットのサービスをInternetOpen APIによりオープンします。
InetrnetConnect APIによりサーバーに接続します。
HttpOpenRequest APIによりサーバーリクエストを初期化し、HttpSendRequest APIによりリクエストします。
HttpQueryInfo APIによりリクエストに対するステータス(答え)を取得します。 この時、エラーステータスが返された場合、終了します。ここでいうエラーとはお馴染みの403等です。
HttpQueryInfo APIによりファイルサイズを取得します。
HttpQueryInfo APIによりファイルの更新日時を取得します。
更新日時は世界標準時なので日本時間に変換します。
各ハンドルをInternetCloseHandle APIにより閉じます。
ソースコード
htmlget7.cpp
// インターネット上のファイルの有無、サイズ、日時を取得する
#include <windows.h>
#include <wininet.h>
#include <stdio.h>
#include <tchar.h>
#include "resource.h"
#pragma comment(lib,"wininet.lib")
// ダイアログボックスプロシージャー
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam);
// インターネット上のファイルの有無、サイズ、日時を取得する
bool HtmlGet2(TCHAR* url,DWORD* status_code,DWORD* sz,SYSTEMTIME* LocalTime);
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPreInst, TCHAR* lpszCmdLine, int nCmdShow){
// ダイアログボックスの表示
DialogBox( hInstance, TEXT("DLG1"), 0, (DLGPROC)DlgProc);
return 0;
}
// ダイアログボックスプロシージャー
LRESULT CALLBACK DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
TCHAR buf[256];
TCHAR url[256];
SYSTEMTIME LocalTime;
DWORD s,sz;
static HWND hEdit;
switch (msg) {
case WM_INITDIALOG:{
hEdit=GetDlgItem(hDlg,IDC_URL_EDITBOX);
SetWindowText(hEdit,_TEXT("http://yamatyuu.net"));
return TRUE;
}
case WM_COMMAND:
switch (LOWORD(wParam)) {
case IDOK:{
GetWindowText(hEdit,url,sizeof(url)/sizeof(TCHAR));
if(HtmlGet2(url,&s,&sz,&LocalTime)==true){
_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%i"),sz);
SetWindowText(GetDlgItem(hDlg, IDC_SIZE_EDITBOX),buf);
_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%.4i年%.2i月%.2i日 %.2i時%.2i分%.2i秒"),LocalTime.wYear , LocalTime.wMonth , LocalTime.wDay , LocalTime.wHour , LocalTime.wMinute , LocalTime.wSecond);
SetWindowText(GetDlgItem(hDlg, IDC_DATE_EDITBOX),buf);
_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%i"),s);
SetWindowText(GetDlgItem(hDlg, IDC_STATUS_EDITBOX),buf);
}else{
SetWindowText(GetDlgItem(hDlg, IDC_SIZE_EDITBOX),_TEXT(""));
SetWindowText(GetDlgItem(hDlg, IDC_DATE_EDITBOX),_TEXT(""));
_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%i"),s);
SetWindowText(GetDlgItem(hDlg, IDC_STATUS_EDITBOX),buf);
}
return TRUE;
}
case IDCANCEL:
EndDialog(hDlg,TRUE);
return TRUE;
default:
return FALSE;
}
default:
return FALSE;
}
return TRUE;
}
// インターネット上のファイルの有無、サイズ、日時を取得する
bool HtmlGet2(TCHAR* url,DWORD* status_code,DWORD* sz,SYSTEMTIME* LocalTime){
URL_COMPONENTS uc;
HINTERNET hiopen;
HINTERNET hiconnect;
HINTERNET hirequest;
TCHAR host_name[64];
TCHAR path[64];
TCHAR buf[64];
ZeroMemory(&uc , sizeof(URL_COMPONENTS));
uc.dwStructSize=sizeof(URL_COMPONENTS);
uc.lpszHostName=host_name;
uc.lpszUrlPath=path;
uc.dwHostNameLength=sizeof(host_name)/sizeof(TCHAR);
uc.dwUrlPathLength=sizeof(path)/sizeof(TCHAR);
// URLの解析
unsigned url_len=(unsigned)_tcslen(url);
if( InternetCrackUrl(url , url_len , ICU_ESCAPE , &uc )==FALSE){
MessageBox(0,_TEXT("InternetCrackUrl:URLの解析に失敗しました。"),_TEXT("エラー"),MB_OK);
return false;
}
DWORD flags=0;
if(uc.nScheme==INTERNET_SCHEME_HTTP){
flags= INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_AUTO_REDIRECT;
}else if(uc.nScheme==INTERNET_SCHEME_HTTPS){
flags=INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_NO_AUTO_REDIRECT
| INTERNET_FLAG_SECURE | INTERNET_FLAG_IGNORE_CERT_DATE_INVALID
| INTERNET_FLAG_IGNORE_CERT_CN_INVALID;
}else{
MessageBox(0,_TEXT("HTTPでもHTTPSでもありません"),_TEXT("エラー"),MB_OK);
return false;
}
_stprintf_s(buf,sizeof(buf)/sizeof(TCHAR),_TEXT("%s"),uc.lpszUrlPath);
// インターネットのサービスハンドルの取得(レジストリ内のIEの設定を使用)
hiopen=InternetOpen(_TEXT("inetdemo"),INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0 );
if(hiopen==NULL){
MessageBox(0,_TEXT("InternetOpenで初期化に失敗しました"),_TEXT("エラー"),MB_OK);
return false;
}
// HTTPサーバーへの接続
hiconnect=InternetConnect(hiopen , uc.lpszHostName , uc.nPort , NULL , NULL , INTERNET_SERVICE_HTTP , 0 , 0);
if(hiconnect==NULL){
InternetCloseHandle(hiopen);
MessageBox(0,_TEXT("InternetConnectでHTTP接続に失敗しました"),_TEXT("エラー"),MB_OK);
return false;
}
// HTTPサーバーへのリクエストの初期化
hirequest=HttpOpenRequest(hiconnect,_TEXT("GET"),buf,NULL,NULL,NULL,flags,NULL);
if(hirequest==NULL){
InternetCloseHandle(hiconnect);
InternetCloseHandle(hiopen);
MessageBox(0,_TEXT("HttpOpenRequestでHTTP接続に失敗しました"),_TEXT("エラー"),MB_OK);
return false;
}
if(HttpSendRequest(hirequest , NULL , 0 , NULL , 0)==FALSE){
InternetCloseHandle(hirequest);
InternetCloseHandle(hiconnect);
InternetCloseHandle(hiopen);
MessageBox(0,_TEXT("HtpSendRequestでHTTP要求送信に失敗しました"),_TEXT("エラー"),MB_OK);
return false;
}
// HTTPリクエストに関連する情報を取得する(ステータスコードを32ビットで返す)
*status_code=0;
DWORD len=sizeof(DWORD);
if(HttpQueryInfo( hirequest , HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,status_code,&len,0)==FALSE){
InternetCloseHandle(hirequest);
InternetCloseHandle(hiconnect);
InternetCloseHandle(hiopen);
*status_code=0xffffffff;
return false;
}
if( *status_code != HTTP_STATUS_OK){ // エラーがー発生した
InternetCloseHandle(hirequest);
InternetCloseHandle(hiconnect);
InternetCloseHandle(hiopen);
return false;
}
// ファイルサイズの取得
*sz=0;
len=sizeof(*sz);
if(HttpQueryInfo( hirequest , HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,sz,&len,0)==TRUE){
}
SYSTEMTIME UTCTime;
len=sizeof(UTCTime);
if(HttpQueryInfo( hirequest ,HTTP_QUERY_LAST_MODIFIED | HTTP_QUERY_FLAG_SYSTEMTIME ,&UTCTime,&len,0)==TRUE){
FILETIME FileTime, LocalFileTime;
SystemTimeToFileTime(&UTCTime,&FileTime);
FileTimeToLocalFileTime(&FileTime, &LocalFileTime);
FileTimeToSystemTime(&LocalFileTime, LocalTime);
}
InternetCloseHandle(hirequest);
InternetCloseHandle(hiconnect);
InternetCloseHandle(hiopen);
return true;
}
resource.h
#define IDC_URL_EDITBOX 100
#define IDC_SIZE_EDITBOX 111
#define IDC_DATE_EDITBOX 112
#define IDC_STATUS_EDITBOX 113
resource.rc
#include <windows.h>
#include "resource.h"
DLG1 DIALOG DISCARDABLE 0, 0, 397, 115
EXSTYLE WS_EX_DLGMODALFRAME
STYLE WS_POPUP | WS_CAPTION | WS_SYSMENU | DS_SETFONT
CAPTION "htmlget7"
FONT 9, "MS 明朝"
{
CONTROL "URL", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 7, 32, 12
CONTROL "", IDC_URL_EDITBOX, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_MULTILINE | ES_WANTRETURN | ES_LEFT, 70, 5, 320, 12
CONTROL "ステータス", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 26, 48, 12
CONTROL "", IDC_STATUS_EDITBOX, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_RIGHT, 70, 24, 128, 12
CONTROL "ファイルサイズ", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 45, 56, 12
CONTROL "", IDC_SIZE_EDITBOX, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_RIGHT, 70, 43, 128, 12
CONTROL "更新日時", -1, "STATIC", WS_CHILD | WS_VISIBLE | SS_NOTIFY, 7, 64, 48, 12
CONTROL "", IDC_DATE_EDITBOX, "EDIT", WS_CHILD | WS_DLGFRAME | WS_VISIBLE | ES_RIGHT,70, 62, 128, 12
CONTROL "取得", IDOK, "BUTTON", WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 137, 90, 54, 18
CONTROL "キャンセル", IDCANCEL, "BUTTON", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 205, 90, 54, 18
}
Copyright (C) 2012 山本ワールド All Rights Reserved.