UTILITY.CPP
/************************************************************************** 
   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
   ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 
   THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 
   PARTICULAR PURPOSE. 
 
   Copyright 1997 Microsoft Corporation.  All Rights Reserved. 
**************************************************************************/ 
 
/************************************************************************** 
 
   File:          Utility.cpp 
    
   Description:    
 
**************************************************************************/ 
 
/************************************************************************** 
   #include statements 
**************************************************************************/ 
 
#include "Utility.h" 
#include "ShlFldr.h" 
#include "resource.h" 
 
/************************************************************************** 
   private function prototypes 
**************************************************************************/ 
 
/************************************************************************** 
   global variables 
**************************************************************************/ 
 
extern HIMAGELIST g_himlLarge; 
extern HIMAGELIST g_himlSmall; 
 
#define MAIN_KEY_STRING       (TEXT("Software\\RegView")) 
#define VALUE_STRING          (TEXT("Display Settings")) 
#define INITIAL_COLUMN_SIZE   100 
 
/************************************************************************** 
 
   GetKeyName() 
    
**************************************************************************/ 
 
DWORD GetKeyName( HKEY hKeyRoot,  
                  LPCTSTR pszSubKey,  
                  DWORD dwIndex,  
                  LPTSTR pszOut,  
                  DWORD dwSize) 
{ 
HKEY     hKey; 
LONG     lResult; 
FILETIME ft; 
 
if(!pszOut) 
   return 0; 
 
if(!pszSubKey) 
   pszSubKey = TEXT(""); 
 
//open the specified key 
lResult = RegOpenKeyEx( hKeyRoot, 
                        pszSubKey, 
                        0, 
                        KEY_ENUMERATE_SUB_KEYS, 
                        &hKey); 
 
if(ERROR_SUCCESS != lResult) 
   return 0; 
 
//try to get the specified subkey 
lResult = RegEnumKeyEx( hKey, 
                        dwIndex, 
                        pszOut, 
                        &dwSize, 
                        NULL, 
                        NULL, 
                        NULL, 
                        &ft); 
 
RegCloseKey(hKey); 
 
if(ERROR_SUCCESS == lResult) 
   return dwSize; 
 
return 0; 
} 
 
/************************************************************************** 
 
   GetValueName() 
    
**************************************************************************/ 
 
BOOL GetValueName(   HKEY hKeyRoot,  
                     LPCTSTR pszSubKey,  
                     DWORD dwIndex,  
                     LPTSTR pszOut,  
                     DWORD dwSize) 
{ 
HKEY     hKey; 
LONG     lResult; 
DWORD    dwType; 
 
if(!pszOut) 
   return FALSE; 
 
if(!pszSubKey) 
   pszSubKey = TEXT(""); 
 
//open the specified key 
lResult = RegOpenKeyEx( hKeyRoot, 
                        pszSubKey, 
                        0, 
                        KEY_QUERY_VALUE, 
                        &hKey); 
 
if(ERROR_SUCCESS != lResult) 
   return FALSE; 
 
//try to get the specified subkey 
lResult = RegEnumValue( hKey, 
                        dwIndex, 
                        pszOut, 
                        &dwSize, 
                        NULL, 
                        &dwType, 
                        NULL, 
                        NULL); 
 
RegCloseKey(hKey); 
 
return BOOL(ERROR_SUCCESS == lResult); 
} 
 
 
/************************************************************************** 
 
   GetRootKeyText() 
    
**************************************************************************/ 
 
DWORD GetRootKeyText(HKEY hKeyRoot, LPTSTR lpszOut, DWORD dwOutSize) 
{ 
*lpszOut = 0; 
 
if(hKeyRoot == HKEY_CLASSES_ROOT) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_CLASSES_ROOT"), dwOutSize); 
   } 
 
else if(hKeyRoot == HKEY_CURRENT_USER) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_CURRENT_USER"), dwOutSize); 
   } 
 
else if(hKeyRoot == HKEY_LOCAL_MACHINE) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_LOCAL_MACHINE"), dwOutSize); 
   } 
 
else if(hKeyRoot == HKEY_USERS) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_USERS"), dwOutSize); 
   } 
 
else if(hKeyRoot == HKEY_PERFORMANCE_DATA) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_PERFORMANCE_DATA"), dwOutSize); 
   } 
 
else if(hKeyRoot == HKEY_CURRENT_CONFIG) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_CURRENT_CONFIG"), dwOutSize); 
   } 
 
else if(hKeyRoot == HKEY_DYN_DATA) 
   { 
   lstrcpyn(lpszOut, TEXT("HKEY_DYN_DATA"), dwOutSize); 
   } 
    
return lstrlen(lpszOut) + 1; 
} 
 
/************************************************************************** 
 
   RootKeyExists() 
    
**************************************************************************/ 
 
BOOL RootKeyExists(HKEY hKeyRoot) 
{ 
LONG  lResult; 
HKEY  hKey; 
 
//open the specified key 
lResult = RegOpenKeyEx( hKeyRoot, 
                        NULL, 
                        0, 
                        KEY_ENUMERATE_SUB_KEYS, 
                        &hKey); 
 
if(ERROR_SUCCESS != lResult) 
   return FALSE; 
 
RegCloseKey(hKey); 
 
return TRUE; 
} 
 
/************************************************************************** 
 
   SaveGlobalSettings() 
    
**************************************************************************/ 
 
BOOL SaveGlobalSettings(void) 
{ 
HKEY  hKey; 
LONG  lResult; 
DWORD dwDisp; 
 
lResult = RegCreateKeyEx(  HKEY_CURRENT_USER, 
                           MAIN_KEY_STRING, 
                           0, 
                           NULL, 
                           REG_OPTION_NON_VOLATILE,  
                           KEY_ALL_ACCESS, 
                           NULL,  
                           &hKey, 
                           &dwDisp); 
 
if(lResult != ERROR_SUCCESS) 
   return FALSE; 
 
//create an array to put our data in 
DWORD dwArray[4]; 
dwArray[0] = g_nColumn1; 
dwArray[1] = g_nColumn2; 
dwArray[2] = g_bViewKeys; 
dwArray[3] = g_bShowIDW; 
 
//save the last printer selected 
lResult = RegSetValueEx(   hKey, 
                           VALUE_STRING, 
                           0, 
                           REG_BINARY, 
                           (LPBYTE)dwArray, 
                           sizeof(dwArray)); 
 
RegCloseKey(hKey); 
 
if(lResult != ERROR_SUCCESS) 
   return FALSE; 
 
return TRUE; 
} 
 
/************************************************************************** 
 
   GetGlobalSettings() 
    
**************************************************************************/ 
 
BOOL GetGlobalSettings(void) 
{ 
HKEY  hKey; 
LONG  lResult; 
 
//set up the default data 
g_nColumn1 = INITIAL_COLUMN_SIZE; 
g_nColumn2 = INITIAL_COLUMN_SIZE; 
g_bViewKeys = TRUE; 
g_bShowIDW = FALSE; 
 
lResult = RegOpenKeyEx( HKEY_CURRENT_USER, 
                        MAIN_KEY_STRING, 
                        0, 
                        KEY_ALL_ACCESS, 
                        &hKey); 
 
if(lResult != ERROR_SUCCESS) 
   return FALSE; 
 
//create an array to put our data in 
DWORD dwArray[4]; 
DWORD dwType; 
DWORD dwSize = sizeof(dwArray); 
 
//save the last printer selected 
lResult = RegQueryValueEx( hKey, 
                           VALUE_STRING, 
                           NULL, 
                           &dwType, 
                           (LPBYTE)dwArray, 
                           &dwSize); 
 
RegCloseKey(hKey); 
 
if(lResult != ERROR_SUCCESS) 
   return FALSE; 
 
g_nColumn1 = dwArray[0]; 
g_nColumn2 = dwArray[1]; 
g_bViewKeys = dwArray[2]; 
g_bShowIDW = dwArray[3]; 
 
return TRUE; 
} 
 
/************************************************************************** 
 
   CompareItems() 
    
**************************************************************************/ 
 
int CALLBACK CompareItems(LPARAM lParam1, LPARAM lParam2, LPARAM lpData) 
{ 
CShellFolder  *pFolder = (CShellFolder*)lpData; 
 
if(!pFolder) 
   return 0; 
 
return (int)pFolder->CompareIDs(0, (LPITEMIDLIST)lParam1, (LPITEMIDLIST)lParam2); 
} 
 
/************************************************************************** 
 
   CreateImageLists() 
    
**************************************************************************/ 
 
VOID CreateImageLists(VOID) 
{ 
int   cx; 
int   cy; 
 
cx = GetSystemMetrics(SM_CXSMICON); 
cy = GetSystemMetrics(SM_CYSMICON); 
 
cx = 16; 
cy = 16; 
 
if(g_himlSmall) 
   ImageList_Destroy(g_himlSmall); 
 
//set the small image list 
g_himlSmall = ImageList_Create(cx, cy, ILC_COLORDDB | ILC_MASK, 4, 0); 
 
if(g_himlSmall) 
   { 
   HICON hIcon; 
    
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_BINARY), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlSmall, hIcon); 
 
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_STRING), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlSmall, hIcon); 
 
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_FOLDER), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlSmall, hIcon); 
 
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_FOLDEROPEN), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlSmall, hIcon); 
   } 
 
if(g_himlLarge) 
   ImageList_Destroy(g_himlLarge); 
 
cx = GetSystemMetrics(SM_CXICON); 
cy = GetSystemMetrics(SM_CYICON); 
 
cx = 32; 
cy = 32; 
 
//set the large image list 
g_himlLarge = ImageList_Create(cx, cy, ILC_COLORDDB | ILC_MASK, 4, 0); 
 
if(g_himlSmall) 
   { 
   HICON hIcon; 
    
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_BINARY), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlLarge, hIcon); 
 
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_STRING), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlLarge, hIcon); 
 
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_FOLDER), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlLarge, hIcon); 
 
   hIcon = (HICON)LoadImage(g_hInst, MAKEINTRESOURCE(IDI_FOLDEROPEN), IMAGE_ICON, cx, cy, LR_DEFAULTCOLOR); 
   ImageList_AddIcon(g_himlLarge, hIcon); 
   } 
 
} 
 
/************************************************************************** 
 
   DestroyImageLists() 
    
**************************************************************************/ 
 
VOID DestroyImageLists(VOID) 
{ 
if(g_himlSmall) 
   ImageList_Destroy(g_himlSmall); 
 
if(g_himlLarge) 
   ImageList_Destroy(g_himlLarge); 
} 
 
/************************************************************************** 
 
   WideCharToLocal() 
    
**************************************************************************/ 
 
int WideCharToLocal(LPTSTR pLocal, LPWSTR pWide, DWORD dwChars) 
{ 
*pLocal = 0; 
 
#ifdef UNICODE 
lstrcpyn(pLocal, pWide, dwChars); 
#else 
WideCharToMultiByte( CP_ACP,  
                     0,  
                     pWide,  
                     -1,  
                     pLocal,  
                     dwChars,  
                     NULL,  
                     NULL); 
#endif 
 
return lstrlen(pLocal); 
} 
 
/************************************************************************** 
 
   LocalToWideChar() 
    
**************************************************************************/ 
 
int LocalToWideChar(LPWSTR pWide, LPTSTR pLocal, DWORD dwChars) 
{ 
*pWide = 0; 
 
#ifdef UNICODE 
lstrcpyn(pWide, pLocal, dwChars); 
#else 
MultiByteToWideChar( CP_ACP,  
                     0,  
                     pLocal,  
                     -1,  
                     pWide,  
                     dwChars);  
#endif 
 
return lstrlenW(pWide); 
} 
 
/************************************************************************** 
 
   GetNextRegElement() 
    
**************************************************************************/ 
 
LPTSTR GetNextRegElement(LPTSTR pszNext, LPTSTR pszOut, DWORD dwOut) 
{ 
if(!pszNext || !*pszNext) 
   return NULL; 
 
LPTSTR   pszTail = pszNext; 
 
while(*pszTail && (*pszTail != '\\')) 
   { 
   pszTail++; 
   } 
 
DWORD dwCopy = ((LPBYTE)pszTail - (LPBYTE)pszNext)/sizeof(TCHAR) + 1; 
 
lstrcpyn(pszOut, pszNext, min(dwOut, dwCopy)); 
 
if(*pszTail) 
   pszTail++; 
 
return pszTail; 
}