解説
Internet Explorer 5以上をインストールしている場合は、wininet.dllにNONAME指定で ディスク情報取得用の関数がエクスポートされている。ここではそれを利用して容量を取 得している。
Microsoftが公開してない情報を利用しているため今後のOSなどでは動作しない可能性も ある。私は以下の環境でのみ動作確認をしている。
・Windows 95 OSR2.0+Internet Explorer 5.0
・Windows XP Professional SP2 + Internet Explorer 6.0 SP2
なおWindows 95 OSR 2.0+Internet Explorer 3.0では動作しないことも確認している。
ソースコード
#include "atlstr.h" bool Test() { DWORDLONG dlAvail; DWORDLONG dlTotal; CAtlString str; GetDiskInfo(_T("c:\\"),dlAvail,dlTotal); str.Format(_T("%I64d bytes\n%I64d bytes"),dlAvail,dlTotal); MessageBox(0,str,_T(""),0); return true; } // // wininetのNONAME関数を利用したディスク空き容量取得関数 // //IE5以上での動作は確認(Win95OSR2含) // // // bool GetDiskInfo(LPCTSTR pszPath,DWORDLONG& dlAvail,DWORDLONG& dlTotal) { DWORD dwCluster; BOOL fRet; HMODULE hDLL; BOOL (WINAPI* pfnGetDiskInfoA)(LPTSTR pszPath,DWORD* pdwCluster,DWORDLONG* pdlAvail,DWORDLONG* pdlTotal); dlAvail = 0; dlTotal = 0; hDLL = ::LoadLibrary(_T("wininet.dll")); if(hDLL == NULL) return false; (FARPROC&)pfnGetDiskInfoA = ::GetProcAddress(hDLL,(LPTSTR)102); if(pfnGetDiskInfoA == NULL) { ::FreeLibrary(hDLL); return false; } dwCluster = 0; #ifdef _UNICODE CAtlStringA strPath; strPath = pszPath; fRet = pfnGetDiskInfoA(strPath,&dwCluster,&dlAvail,&dlTotal); #else fRet = pfnGetDiskInfoA(pszPath,&dwCluster,&dlAvail,&dlTotal); #endif ::FreeLibrary(hDLL); return fRet ? true : false; }