📄 registry.cpp
字号:
// 2 get info about
//-----------------------------------------------------------------------
BOOL CRegistry::EnumerateSubKeys(DWORD index, LPTSTR name, DWORD &name_size)
{
if(!m_bStatus)
return FALSE;
m_nErrorCode=RegEnumKeyEx(m_hKey,index,name,&name_size,NULL,NULL,0,NULL);
return (m_nErrorCode==ERROR_SUCCESS);
}
//-----------------------------------------------------------------------
// Pre : If a pointer 2 value data is specified (retrieving value data too)
// then data_size must not be NULL and the pointed DWORD must hold
// the size of the data buffer
// Post : Return TRUE on success
// Globals :
// I/O :
// Task : Enumerate values of current key
// You can use this by calling CountValues 2 get the number of
// values, then calling this member with 0-based indexes of value
// 2 get info about
//-----------------------------------------------------------------------
BOOL CRegistry::EnumerateValues(DWORD index, LPTSTR name, DWORD &name_size, DWORD *type, BYTE *data, DWORD *data_size)
{
if(!m_bStatus)
return FALSE;
m_nErrorCode=RegEnumValue(m_hKey,index,name,&name_size,NULL,type,data,data_size);
return (m_nErrorCode==ERROR_SUCCESS);
}
//-----------------------------------------------------------------------
// Pre :
// Post : Return TRUE if info was retrieved OK
// Globals :
// I/O :
// Task : Query info about registy key
//-----------------------------------------------------------------------
BOOL CRegistry::GetInfo(LPTSTR lpszKeyClass, LPDWORD lpcKeyClassSize, // Non-NULL values should be supplied 4 at least
LPDWORD lpcSubKeyCount, // parameters from one line
LPDWORD lpcbLongestSubKeyName,
LPDWORD lpcbLargestSubKeyClass,
LPDWORD lpcValueCount,
LPDWORD lpcbLongestValueName,
LPDWORD lpcbLargestValueData,
LPDWORD lpcbSecurityDescriptorSize,
PFILETIME lpLastWriteTime) // NT only
{
#ifdef _WIN95
if(lpLastWriteTime)
ASSERTX(FALSE); // This should be used only on NT, because on Windows 95 it gets filled with 0s
#endif
if(!m_bStatus)
return FALSE;
m_nErrorCode=RegQueryInfoKey(m_hKey,lpszKeyClass,lpcKeyClassSize,NULL,
lpcSubKeyCount,lpcbLongestSubKeyName,lpcbLargestSubKeyClass,
lpcValueCount,lpcbLongestValueName,lpcbLargestValueData,
lpcbSecurityDescriptorSize,
lpLastWriteTime);
return m_nErrorCode==ERROR_SUCCESS;
}
//-----------------------------------------------------------------------
// Pre :
// Post : On error returns -1
// Globals :
// I/O :
// Task : Return the number of subkeys of this key
//-----------------------------------------------------------------------
DWORD CRegistry::CountSubKeys()
{
DWORD subkeys;
if(!GetInfo(NULL,NULL,&subkeys))
return (DWORD)-1;
return subkeys;
}
//-----------------------------------------------------------------------
// Pre :
// Post : On error returns FALSE
// Globals :
// I/O :
// Task : Remove this key and its descendants
// Because on NT the key 2 be removed must not have subkeys, remove
// first all the subkeys
//-----------------------------------------------------------------------
BOOL CRegistry::Delete(BOOL bDeleteSubkeys)
{
if(!m_bStatus)
return FALSE;
BOOL success =TRUE;
if(bDeleteSubkeys)
{
// Attempt 2 delete all subkeys
DWORD keys =CountSubKeys();
while(keys>0)
{
TCHAR key_name[MAX_PATH];
DWORD key_name_size =sizeof(key_name);
// Get a subkey...
if(EnumerateSubKeys(0,key_name,key_name_size))
{
// Got a subkey, now delete it
CRegistry sub_key(*this,key_name);
success =sub_key.Delete();
}
if(success)
keys =CountSubKeys();
else
break;
}
}
if(success)
{
m_nErrorCode=RegDeleteKey(m_hKey,_T(""));
if(m_nErrorCode==ERROR_SUCCESS)
Close();
}
return success;
}
//-----------------------------------------------------------------------
// Pre :
// Post : On error returns -1
// Globals :
// I/O :
// Task : Return the number of values in this key
// This count does not include the default value
//-----------------------------------------------------------------------
DWORD CRegistry::CountValues()
{
DWORD values;
if(!GetInfo(NULL,NULL,NULL,NULL,NULL,&values))
return (DWORD)-1;
return values;
}
//-----------------------------------------------------------------------
// Pre :
// Post : Return TRUE on success
// Globals :
// I/O :
// Task : Force saving of registry key data back in the registry
//-----------------------------------------------------------------------
BOOL CRegistry::Flush()
{
if(!m_bStatus)
return FALSE;
m_nErrorCode=RegFlushKey(m_hKey);
return m_nErrorCode==ERROR_SUCCESS;
}
//-----------------------------------------------------------------------
// Pre :
// Post : Return TRUE on success
// Globals :
// I/O :
// Task : Conect to a remote computer's HKEY_LOCAL_MACHINE key
//-----------------------------------------------------------------------
BOOL CRegistry::Connect_HKEY_LOCAL_MACHINE(LPCTSTR machine)
{
Close();
TCHAR machine_name[MAX_REG_MACHINE_NAME_LEN];
lstrcpy(machine_name,machine);
m_nErrorCode=RegConnectRegistry(machine_name,HKEY_LOCAL_MACHINE,&m_hKey);
if(m_nErrorCode==ERROR_SUCCESS)
m_bStatus=TRUE;
else
m_bStatus=FALSE;
return m_bStatus;
}
//-----------------------------------------------------------------------
// Pre :
// Post : Return TRUE on success
// Globals :
// I/O :
// Task : Conect to a remote computer's HKLM key
//-----------------------------------------------------------------------
BOOL CRegistry::Connect_HKEY_USERS(LPCTSTR machine)
{
Close();
TCHAR machine_name[MAX_REG_MACHINE_NAME_LEN];
lstrcpy(machine_name,machine);
m_nErrorCode=RegConnectRegistry(machine_name,HKEY_USERS,&m_hKey);
if(m_nErrorCode==ERROR_SUCCESS)
m_bStatus=TRUE;
else
m_bStatus=FALSE;
return m_bStatus;
}
//-----------------------------------------------------------------------
// Pre :
// Post :
// Globals :
// I/O :
// Task : Close key
//-----------------------------------------------------------------------
void CRegistry::Close()
{
if(m_bStatus)
RegCloseKey(m_hKey);
m_hKey =NULL;
m_bStatus =FALSE;
}
//-----------------------------------------------------------------------
// Pre :
// Post :
// Globals :
// I/O :
// Task : Close registry key before destruction
//-----------------------------------------------------------------------
CRegistry::~CRegistry()
{
Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -