ディスク容量取得(未公開情報使用)

解説


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

カテゴリー「VC++ TIPS」 のエントリー