解説
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;
}







