GetDiskFreeSpaceEx を使用するには,Windows95 OSR1 と Windows95 OSR2 以降 および NT 系の区別をしなければならない.
OSR1 では GetDiskFreeSpaceEx は存在せず,GetDiskFreeSpace を使用する.
OSVERSIONINFO OsVerInfo;
// OSの判定
OsVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&OsVerInfo);
if( ( OsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS &&
(LOWORD(OsVerInfo.dwBuildNumber) > 1000) ) ||
OsVerInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// OSR2 以降,NT 系
} else {
// OSR1
}
また,OSR1 での動作も考えると GetDiskFreeSpaceEx をそのまま使用するのではなく,動的にアドレスを取得する必要がある.
(Windows95 OSR1 ではエントリ自体が存在しないため)
ULARGE_INTEGER ulFreeBytesAvailableToCaller;
ULARGE_INTEGER ulTotalNumberOfFreeBytes;
ULARGE_INTEGER ulTotalNumberOfBytes;
BOOL (*_GetDiskFreeSpaceEx)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);
HINSTANCE hInstDLL = ::LoadLibrary(_T("KERNEL32.DLL"));
if(hInstDLL) {
if(*((FARPROC *)&_GetDiskFreeSpaceEx) =
::GetProcAddress(hInstDLL, _T("GetDiskFreeSpaceExA"))) {
if(_GetDiskFreeSpaceEx(strPath, &ulFreeBytesAvailableToCaller, &ulTotalNumberOfBytes, &ulTotalNumberOfFreeBytes)) {
// ディスク容量の計算
// 全容量 ulTotalNumberOfBytes.QuadPart
// 空き容量 ulTotalNumberOfFreeBytes.QuadPart
}
}
::FreeLibrary(hInstDLL);
}
参照