www.pudn.com > DiskInfo.tgz > Useful.cpp


#include "stdafx.h" 
#include "Useful.h" 
 
 
typedef BOOL (WINAPI * GetDskFreeSpcEx)(LPCTSTR lpDirectoryName,  
										PULARGE_INTEGER lpFreeBytesAvailableToCaller,  
										PULARGE_INTEGER lpTotalNumberOfBytes,  
										PULARGE_INTEGER lpTotalNumberOfFreeBytes );  
 
 
BOOL GetHDSpace(const CString& DriveLetter, DWORD& nFreeLow, DWORD& nFreeHigh,  
				DWORD& nTotalLow, DWORD& nTotalHigh) 
{ 
	//ASSERT ( pFreeLow != NULL ); 
	BOOL bRet = FALSE; 
	//DWORD freeLow = 0L; 
	//TCHAR rootpath[10]; 
	BOOL bOSR2 = FALSE; 
	 
	OSVERSIONINFO VersionInfo;  
	VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  
	GetVersionEx(&VersionInfo);  
 
	if( VersionInfo.dwPlatformId  == VER_PLATFORM_WIN32_WINDOWS && 
		LOWORD(VersionInfo.dwBuildNumber) > 1000 ) 
	{ 
		bOSR2 = TRUE; 
	} 
	//_stprintf( rootpath, "%c:\\", DriveLetter ); 
	//OSR2 detected or WINDOWS NT 
	if( bOSR2 || (VersionInfo.dwPlatformId  == VER_PLATFORM_WIN32_NT) ) 
	{ 
		ULARGE_INTEGER bytesAvailToMe; 
		ULARGE_INTEGER TotalBytes; 
		ULARGE_INTEGER TotalFreeBytes; 
		HINSTANCE hLib = ::LoadLibrary( "KERNEL32.DLL" ); 
		if( hLib ) 
		{ 
			GetDskFreeSpcEx pProc; 
			pProc = (GetDskFreeSpcEx)::GetProcAddress( hLib, (LPSTR)"GetDiskFreeSpaceExA"); 
			if( pProc ) 
			{ 
				BOOL bRes = pProc( DriveLetter, &bytesAvailToMe, &TotalBytes, &TotalFreeBytes ); 
				if( bRes ) 
				{ 
					//freeLow = bytesAvailToMe.LowPart; 
					nFreeLow = bytesAvailToMe.LowPart; 
					nFreeHigh = bytesAvailToMe.HighPart; 
 
					nTotalLow = TotalBytes.LowPart;					 
					nTotalHigh = TotalBytes.HighPart; 
 
					bRet = TRUE; //success 
				} 
				else 
				{ 
					DWORD err = GetLastError(); 
					TRACE( "Error with GetDiskFreeSpaceEx (%ld)\n", err ); 
				} 
			} 
			else 
			{ 
				DWORD err = GetLastError(); 
				TRACE( "Error with GetProcAddress (%ld)\n", err ); 
			} 
			FreeLibrary(hLib); 
		} 
	} 
	else //Windows 95 NOT OSR2 
	{ 
		DWORD sectorPerCluster; 
		DWORD bytesPerSector; 
		DWORD freeClusters; 
		DWORD totalClusters; 
		BOOL bRes = ::GetDiskFreeSpace( DriveLetter, §orPerCluster, 
			&bytesPerSector, &freeClusters, &totalClusters ); 
		if( bRes ) 
		{ 
			nFreeLow = freeClusters * sectorPerCluster * bytesPerSector; 
			nTotalLow = totalClusters * sectorPerCluster * bytesPerSector; 
			//GetDiskFreeSpace caanot return more than 32 Bits 
			nFreeHigh = 0; 
			nTotalHigh = 0; 
			bRet = TRUE; //success 
		} 
		else 
		{ 
			DWORD err = GetLastError(); 
			TRACE( "Error with GetDiskFreeSpace (%ld)\n", err ); 
		} 
	} 
 
	return( bRet ); 
} 
 
void FormatByteSize(long double ldLength, CString& str) 
{ 
	if (ldLength >= 1024) 
	{ 
		ldLength /= 1024; 
		if (ldLength >= 1000) 
		{ 
			ldLength /= 1024; 
			if (ldLength >= 1000) 
			{ 
				ldLength /=1024; 
				str.Format(_T("%.2f Gb"), ldLength); 
			}else 
				str.Format(_T("%.2f Mb"), ldLength);	 
		}else 
			str.Format(_T("%.2f Kb"), ldLength);	 
	}else 
		str.Format(_T("%.0f byte"), ldLength); 
} 
 
 
 
void PumpMessages() 
{	 
	MSG msg; 
    // Handle dialog messages 
    while(::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) 
    { 
        ::TranslateMessage(&msg); 
        ::DispatchMessage(&msg);   
    } 
} 
 
CString GetHomeDirectory() 
{ 
	TCHAR sFilename[_MAX_PATH]; 
	TCHAR sDrive[_MAX_DRIVE]; 
	TCHAR sDir[_MAX_DIR]; 
	TCHAR sFname[_MAX_FNAME]; 
	TCHAR sExt[_MAX_EXT]; 
	GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH); 
	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt); 
	 
	CString rVal(CString(sDrive) + CString(sDir)); 
	int nLen = rVal.GetLength(); 
	if (rVal.GetAt(nLen-1) != _T('\\')) 
		rVal += _T("\\"); 
 
	return rVal; 
} 
 
static COMCTL32VERSION c_nComCtl32Version = COMCTL32_UNKNOWN; 
 
BOOL IfNewComCtrl32() 
{ 
	// if we don't already know which version, try to find out 
	if (c_nComCtl32Version == COMCTL32_UNKNOWN) { 
		// have we loaded COMCTL32 yet? 
		HMODULE theModule = ::GetModuleHandle("COMCTL32"); 
		// if so, then we can check for the version 
		if (theModule) { 
			// InitCommonControlsEx is unique to 4.7 and later 
			FARPROC theProc = ::GetProcAddress(theModule, "InitCommonControlsEx"); 
			if (! theProc) { 
				// not found, must be 4.00 
				c_nComCtl32Version = COMCTL32_400; 
			} else { 
				// The following symbol are unique to 4.71 
				//   DllInstall 
				//   FlatSB_EnableScrollBar FlatSB_GetScrollInfo FlatSB_GetScrollPos 
				//   FlatSB_GetScrollProp FlatSB_GetScrollRange FlatSB_SetScrollInfo 
				//   FlatSB_SetScrollPos FlatSB_SetScrollProp FlatSB_SetScrollRange 
				//   FlatSB_ShowScrollBar 
				//   _DrawIndirectImageList _DuplicateImageList 
				//   InitializeFlatSB 
				//   UninitializeFlatSB 
				// we could check for any of these - I chose DllInstallFARPROC theProc = ::GetProcAddress(theModule, "DllInstall"); 
				if (! theProc) { 
					// not found, must be 4.70 
					c_nComCtl32Version = COMCTL32_470; 
				} else { 
					// found, must be 4.71 
					c_nComCtl32Version = COMCTL32_471; 
				} 
			} 
		} 
	} 
 
	return c_nComCtl32Version> COMCTL32_400; 
	 
} 
 
BOOL IsFileExist(LPCTSTR strFile) 
{ 
	DWORD Code = GetFileAttributes(strFile);  
	return (Code != -1);  
} 
 
// To be optimized 
void StringDeleteFromLeft(CString & string, int len) 
{ 
	int strLen = string.GetLength(); 
	 
	string = string.Right(strLen - len); 
} 
 
 
void StringDeleteFromRight(CString & string, int len) 
{ 
	int strLen = string.GetLength(); 
	string = string.Left(strLen-len); 
} 
 
void FocusFirstChild(CWnd* pWnd) 
{ 
	CWnd* pwndChild = pWnd->GetWindow(GW_CHILD); 
	while (pwndChild) 
	{ 
		if (pwndChild->IsWindowEnabled()) 
		{ 
			pwndChild->SetFocus(); 
			return; 
		} 
 
		pwndChild = pwndChild->GetNextWindow(); 
	}		 
} 
 
LONG GetRegKey(HKEY key, LPCTSTR subkey, LPTSTR retdata) 
{ 
	HKEY hkey; 
    LONG retval = RegOpenKeyEx(key, subkey, 0, KEY_QUERY_VALUE, &hkey); 
 
    if (retval == ERROR_SUCCESS) { 
		long datasize = MAX_PATH; 
		TCHAR data[MAX_PATH]; 
		RegQueryValue(hkey, NULL, data, &datasize); 
		lstrcpy(retdata,data); 
		RegCloseKey(hkey); 
	} 
 
    return retval; 
} 
 
void RunApp(LPCTSTR strApp, LPCTSTR strPar) 
{ 
	TCHAR sFilename[_MAX_PATH]; 
	TCHAR sDrive[_MAX_DRIVE]; 
	TCHAR sDir[_MAX_DIR]; 
	TCHAR sFname[_MAX_FNAME]; 
	TCHAR sExt[_MAX_EXT]; 
	GetModuleFileName(AfxGetInstanceHandle(), sFilename, _MAX_PATH); 
	_tsplitpath(sFilename, sDrive, sDir, sFname, sExt); 
 
	CString rVal(CString(sDrive) + CString(sDir)); 
	int nLen = rVal.GetLength(); 
	if (rVal.GetAt(nLen-1) != _T('\\')) 
	    rVal += _T("\\"); 
	rVal += strApp; 
 
	HINSTANCE result = ShellExecute(NULL, _T("open"), rVal, strPar,NULL,  
		SW_SHOWNORMAL); 
 
	// If it failed, get the .htm regkey and lookup the program 
    if ((UINT)result <= HINSTANCE_ERROR)  
	{ 
		//MessageBox("Error Opening the app...");  
	}	 
} 
 
void GotoURL(LPCTSTR url) 
{ 
    TCHAR key[MAX_PATH + MAX_PATH]; 
 
    // First try ShellExecute() 
	HINSTANCE result = ShellExecute(NULL, _T("open"), url, NULL,NULL, SW_SHOW); 
 
	// If it failed, get the .htm regkey and lookup the program 
    if ((UINT)result <= HINSTANCE_ERROR)  
	{ 
 
        if (GetRegKey(HKEY_CLASSES_ROOT, _T(".htm"), key) == ERROR_SUCCESS) { 
            lstrcat(key, _T("\\shell\\open\\command")); 
 
			if (GetRegKey(HKEY_CLASSES_ROOT,key,key) == ERROR_SUCCESS) { 
                TCHAR *pos; 
                pos = _tcsstr(key, _T("\"%1\"")); 
                if (pos == NULL) {					// No quotes found 
                    pos = strstr(key, _T("%1"));	// Check for %1, without quotes  
                    if (pos == NULL)				// No parameter at all... 
                        pos = key+lstrlen(key)-1; 
                    else 
                        *pos = '\0';				// Remove the parameter 
                } 
                else 
                    *pos = '\0';					// Remove the parameter 
 
                lstrcat(pos, _T(" ")); 
                lstrcat(pos, url); 
				result = (HINSTANCE) WinExec(key,SW_SHOW); 
            } 
        } 
	} 
 
	if ((UINT)result <= HINSTANCE_ERROR)  
	{ 
		 
    } 
} 
 
void AdjustString(CString& str) 
{ 
	int nLength = str.GetLength(); 
 
	for (int n=0; n=0)  
		Path = FileName.Left(i);  
	else  
		Path = FileName;  
	 
	return Path;  
} 
 
//--------------------------------------------  
// Create full path weather exists or not  
BOOL CreateFullDir(const CString& Dir)  
{  
	if (Dir.IsEmpty())  
		return TRUE;  
	CString Path = ExtractFilePath(Dir);  
	if (Dir.GetLength() < 3 || IsDirExist(Dir) || Path == Dir)  
		return TRUE; // avoid 'xyz:\' problem.  
	CreateFullDir(Path);  
	return CreateDirectory(Dir, NULL);  
}  
 
BOOL IsRunningNT() 
{ 
	OSVERSIONINFO VersionInfo;  
	VersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  
	GetVersionEx(&VersionInfo);  
 
	return (VersionInfo.dwPlatformId  == VER_PLATFORM_WIN32_NT); 
} 
 
BOOL DeleteAllInDir(LPCTSTR str, LPCTSTR strExcept) 
{ 
	BOOL bError = FALSE;  
	CString strFolder(str); 
	if (strFolder.Right(1) != "\\") 
		strFolder += "\\"; 
	CString strFile(strFolder); 
	strFile += "*.*"; 
 
	HANDLE hFind; 
    WIN32_FIND_DATA fd; 
	 
	if ((hFind = ::FindFirstFile ((LPCTSTR) strFile, &fd)) == 
        INVALID_HANDLE_VALUE)  
	    return 1; 
 
    do { 
		if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
		{ 
			strFile = CString(fd.cFileName); 
 
			if ((strcmp(strFile, ".")!=0) && (strcmp(strFile, "..")!=0))  
			{ 
				CString strSubFolder = strFolder + strFile; 
				if (!DeleteAllInDir(strSubFolder, strExcept)) 
					bError = TRUE; 
				if (!RemoveDirectory(strSubFolder)) 
					bError = TRUE; 
            } 
        }else 
		{ 
			strFile = CString(fd.cFileName); 
			 
			if (strFile.CompareNoCase(strExcept) != 0) 
			{ 
				if (!DeleteFile(strFolder + strFile)) 
					bError = TRUE; 
			} 
		} 
 
    } while (::FindNextFile (hFind, &fd)); 
	::FindClose (hFind); 
 
	return !bError; 
}