レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API 時刻の概要

Microsoft(R) Win32(R)アプリケーション プログラミング インターフェイス (API) では、 時刻が2つの形式で表されます。「ファイル時刻」は、 160111日からの経過時間を100ナノ秒間隔の値で表した64ビット値です。「システム時刻」は、 「リアル タイム」クロックの形式です。システム時刻では、 日付および時刻の各メンバを持つ構造体が使われます。

これらの形式のほかに、 Win32 APIは、 2つの時刻形式 (MS-DOS時刻」および「Windows時刻」) を操作する関数も提供します。

次の各トピックでは、 各時刻形式と、 それらの形式を使用する関数について説明します。

各トピックでは、 Win32の日付および時刻関数について説明しています。

  • ファイル時刻

  • システム時刻

  • MS-DOS時刻

  • Windows時刻

  • ディレクトリ一覧にファイル作成時刻を表示する方法

  • ファイル時刻を現在時刻に変更する方法

  • システム時刻の設定

  • 日付と時刻の関数

ファイル時刻

Win32のファイル時刻は、 160111日からの時間経過を100ナノ秒間隔で表した64ビット値であり、 2つの32ビット値を組み合わせて扱います。ファイル時刻は、 「世界協定時刻 (UTC)」形式で記録されます。FileTimeToLocalFileTime関数は、 UTC形式のファイル時刻をローカル時刻に変換し、 LocalFileTimeToFileTime関数は、 ローカル ファイル時刻をUTCファイル時刻に変換します。

Windowsは、 各ファイルについて、 ファイル作成時刻、 最終アクセス時刻、 最終書き込み時刻を記録します (この機能は使用するファイル システムに依存します。ファイル アロケーション テーブル (FAT) ファイル システムは作成時刻とアクセス時刻を記録しませんが、 ハイパフォーマンス ファイル システム (HPFS)、 およびNew Technologyファイル システム (NTFS) はこれらを記録します)。これらの時刻は、 FILETIME構造体に含まれるWIN32_FIND_DATA構造体から取得されます。ファイルへの書き込みを行うと、 最終書き込み時刻が更新されます。また、 ファイルへの書き込みまたはファイルからの読み取り (実行可能ファイルの実行も含む) を行うと、 最終アクセス時刻が更新されます。

ファイル時刻を明示的に設定するには、 SetFileTime関数を使います。GetFileTime関数、 FindFirstFile関数、 およびFindNextFile関数は、 ファイル時刻をFILETIME構造体の形で返します。

ファイル時刻形式は内部的に時刻を表すには便利な方法ですが、 1601年からの経過時間を100ナノ秒間隔で表した値は、 ユーザーにとっては分かりにくいものです。FileTimeToSystemTime関数は、 FILETIME構造体をSYSTEMTIME構造体に変換します。このSYSTEMTIME構造体には、 年、 月、 日、 曜日、 時、 分、 秒、 ミリ秒の各フィールドがあります。

CompareFileTime関数は、 2つの64ビット ファイル時刻を比較し、 大きいほうのファイル時刻を示す値を返します。ファイル時刻が等しければ、 CompareFileTime0を返します。

ファイルとファイル システムについて、 詳しくはファイルの概要ファイル システムの概要を参照してください。

システム時刻

Win32のシステム時刻は、 年、 月、 日、 時、 分、 秒、 ミリ秒の各値を含むSYSTEMTIME構造体を使います。この時刻形式は内部システム時刻 (リアルタイム クロック) として使われます。ファイル時刻の場合は、 システム時刻はUTC形式で保持されます。

内部システム時刻は、 Windowsの起動時にハードウェア クロックを参照して自動的に設定されます。GetSystemTime関数はシステム時刻を取得し、 SetSystemTime関数はシステム時刻を設定します。

:システム時刻を設定するプロセスは、 システム時刻特権を持っていなければなりません。この特権の獲得について、 詳しくはセキュリティの概要を参照してください。

アプリケーションはGetLocalTime関数を使い、 現在時刻をUTC形式ではなくローカル時刻形式で取得することもできます。SetLocalTime関数は、 指定されたローカル時刻を使って内部システム時刻を設定します。SetLocalTimeSetSystemTime (またはGetLocalTimeGetSystemTime) は、 時刻形式だけが異なります。

UTC時刻形式とローカル時刻形式間の変換は、 SetTimeZoneInformation関数を使って現在のタイムゾーン パラメータを設定することにより、 制御できます。GetTimeZoneInformation関数は、 現在のタイムゾーンの設定を取得します。

SystemTimeToFileTime関数は、 SYSTEMTIME構造体を64ビットのFILETIME構造体に変換します。

以前のバージョンのWindowsとの互換性を保つため、 Win32 APIGetTickCountGetCurrentTimeもサポートしています。これらの関数は、 Windowが起動されてからの経過時間を返します。

MS-DOS時刻

MS-DOSは、 ファイルの日付および時刻を、 パックされた16ビット値で表します。MS-DOSの日付形式は次のとおりです。

ビット 内容

  • 04 (131)

  • 58 (1 = 1月、 2 = 2月、 ...)

  • 9151980年からのオフセット (実際の年は、 この値に1980を加える)

MS-DOSの時刻形式は次のとおりです。

ビット 内容

  • 04秒を2で割った値

  • 510 (059)

  • 1115 (023 24時間制)

DosDateTimeToFileTime関数は、 MS-DOSの日付および時刻の値をfiletime値に変換します。FileTimeToDosDateTime関数は、 filetime値をMS-DOSの日付および時刻に変換します。

Windows時刻

Windowsは、 その起動時からの経過時間を100ミリ秒単位で記録しています。この数値は32ビット値で保持されているので、 32ビット値がオーバーフローして0になるまで、 2^32×100ミリ秒を記録することができます。この値はほぼ49.7日に当たります。

GetCurrentTime関数とGetTickCount関数は、 どちらもWindows時刻を返します。この関数は、 主に以前のバージョンのWindowsとの互換性を保つために提供されています。

日付および時刻関数の使用

ここでは、 次の処理の実行方法を説明します。

ファイル時刻の設定と取得

現在のシステム時刻の設定と取得

ファイル時刻から現在時刻への変更

ディレクトリ一覧にファイル作成時刻を表示する方法

次の例は、 現在のディレクトリのファイルに関する詳細情報を表示します。

void main(void)
{
HANDLE hSearch;
WIN32_FIND_DATA ffd;

/* Find the first file or indicate there are none. */

hSearch = FindFirstFile("*.*", &ffd);

if (hSearch == INVALID_HANDLE_VALUE)
puts("no files");

/* Display the header and process files until done. */

else {
printf("\nfile namecreated");
printf("last writtensize\n\n");
PrintData(&ffd);

while (FindNextFile(hSearch, &ffd))
PrintData(&ffd);
}
}

void PrintData(PWIN32_FIND_DATA pffd)
{
FILETIME ft;
SYSTEMTIME stCreate, stWrite;

if (pffd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
return;/* don't display directories */

/* Convert creation and write times from UTC time to local time. */
/* Convert creation and write times to system format. */

FileTimeToLocalFileTime(&pffd->ftCreationTime, &ft);
FileTimeToSystemTime(&ft, &stCreate);

FileTimeToLocalFileTime(&pffd->ftLastWriteTime, &ft);
FileTimeToSystemTime(&ft, &stWrite);

/* Display the creation and write times. */

printf("%-12s%02d/%02d/%d %02d:%02d",
pffd->cFileName,
stCreate.wDay, stCreate.wMonth, stCreate.wYear,
stCreate.wHour, stCreate.wMinute);
printf("%02d/%02d/%d %02d:%02d%lu\n",
stWrite.wDay, stWrite.wMonth, stWrite.wYear,
stWrite.wHour, stWrite.wMinute, pffd->nFileSizeLow);
}

ファイル時刻を現在時刻に変更する方法

次の例は、 ファイルの作成時刻を現在のシステム時刻に設定します。

HANDLE hf;
FILETIME ft;
SYSTEMTIME st;

/* Open ftime.c for write access. */

hf = CreateFile("\\ftime.c", GENERIC_WRITE, 0,
(LPSECURITY_ATTRIBUTES)NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL);

if (hf == INVALID_HANDLE_VALUE) {
puts("Could not open ftime.c.");
ExitProcess(1);
}

GetSystemTime(&st);/* get current time */
SystemTimeToFileTime(&st, &ft); /* convert to file time format */
SetFileTime(hf, &ft, /* set creation time for file*/
(LPFILETIME)NULL, (LPFILETIME)NULL);

システム時刻の設定

次の例では、 ユーザーがシステム時刻を設定することができます。

static char 
				*aszDay[] ={ 
				"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday" };

void _cdecl main(void)
{
HANDLE hToken;
SYSTEMTIME st;
char szTime[25], *pc;
TOKEN_PRIVILEGES tkp;

GetSystemTime(&st);/* get the current time*/
ShowTime(&st);/* display the current time*/

for (;;) {/* get the new time in hh:mm format */
printf("Enter new time: ");
gets(szTime);
if ((pc = strchr(szTime, ':')) != NULL) {
*pc = '\0';
st.wHour = (WORD)atoi(szTime);
st.wMinute = (WORD)atoi(pc + 1);
break;
}
else {
puts("Time must be in hh:mm format:");
}
}

/* Get the current process token handle */
/* so we can get set-time privilege. */

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
error("OpenProcessToken");

/* Get the LUID for system-time privilege. */

LookupPrivilegeValue(NULL, "SE_SYSTEMTIME_NAME",
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; /* one privilege to set*/
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

/* Get set-time privilege for this process. */

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

/* Cannot test return value of AdjustTokenPrivileges. */

if (GetLastError() != ERROR_SUCCESS)
error("AdjustTokenPrivileges enable");

if (!SetSystemTime(&st))/* set the system time */
error("SetSystemTime");

ShowTime(&st);

/* Now disable set-time privilege. */

tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,
(PTOKEN_PRIVILEGES) NULL, 0);

if (GetLastError() != ERROR_SUCCESS)
error("AdjustTokenPrivileges disable");
}

void error(LPSTR lpszFunction)
{
DWORD dw = GetLastError();

printf("%s failed: GetLastError returned %u\n",
lpszFunction, dw);
ExitProcess(dw);
}

void ShowTime(PSYSTEMTIME pst)
{
printf("It is now %02u:%02u:%02u on %s, %02u/%02u/%4u.\n",
pst->wHour, pst->wMinute, pst->wSecond,
aszDay[pst->wDayOfWeek], pst->wMonth,
pst->wDay, pst->wYear);
}

日付と時刻の関数

日付形式または時刻形式に関して使われる関数を、 次に示します。

CompareFileTime

DosDateTimeToFileTime

FileTimeToDosDateTime

FileTimeToLocalFileTime

FileTimeToSystemTime

GetCurrentTime

GetFileTime

GetLocalTime

GetSystemTime

GetSystemTimeAdjustment

GetTickCount

GetTimeZoneInformation

LocalFileTimeToFileTime

SetFileTime

SetLocalTime

SetSystemTime

SetSystemTimeAdjustment

SetTimeZoneInformation

SystemTimeToFileTime

SystemTimeToTZSpecificLocalTime

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします
inserted by FC2 system