📄 registrykey.cpp
字号:
ASSERT(nError == ERROR_SUCCESS);
if (hr == (HRESULT)E_OUTOFMEMORY)
return ERROR_OUTOFMEMORY;
else
return ERROR_INTERNAL_ERROR;
}
}
return nError;
}
LONG CRegistryKey::GetSubkeyNameMaxLength(DWORD &rdwMaxSubkeyNameLength)
{
if (m_hKey == NULL)
{ // root key
rdwMaxSubkeyNameLength = 0;
for(int i = 0; i < 7 ; i++)
{
size_t l = _tcslen(g_ppszHiveNames[i]);
if (rdwMaxSubkeyNameLength < l)
rdwMaxSubkeyNameLength = l;
}
rdwMaxSubkeyNameLength++; // terminating null
return ERROR_SUCCESS;
}
LONG nRet;
nRet = RegQueryInfoKey(m_hKey,NULL,NULL,NULL,NULL,&rdwMaxSubkeyNameLength,NULL,NULL,NULL,NULL,NULL,NULL);
rdwMaxSubkeyNameLength = (nRet == ERROR_SUCCESS)?(rdwMaxSubkeyNameLength+1):0;
return nRet;
}
void CRegistryKey::InitSubkeyEnumeration(TCHAR *pszSubkeyNameBuffer, DWORD dwBufferSize)
{
m_pchSubkeyNameBuffer = pszSubkeyNameBuffer;
m_dwSubkeyNameBufferSize = dwBufferSize;
m_dwCurrentSubKeyIndex = 0;
}
LONG CRegistryKey::GetNextSubkeyName(DWORD *pdwActualSize)
{
LONG nError;
if (m_hKey == NULL)
{
if (m_dwCurrentSubKeyIndex < (DWORD)(m_pszMachineName?5:7))
{
DWORD dwIndex = m_pszMachineName?m_dwCurrentSubKeyIndex+2:m_dwCurrentSubKeyIndex;
_tcsncpy(m_pchSubkeyNameBuffer,g_ppszHiveNames[dwIndex],m_dwSubkeyNameBufferSize);
nError = ERROR_SUCCESS;
if (pdwActualSize)
*pdwActualSize = strlen(m_pchSubkeyNameBuffer);
}
else
{
nError = ERROR_NO_MORE_ITEMS;
}
}
else
{
DWORD dwActualSize = m_dwSubkeyNameBufferSize;
FILETIME ft;
nError = RegEnumKeyEx(m_hKey,
m_dwCurrentSubKeyIndex,
m_pchSubkeyNameBuffer,
&dwActualSize,
NULL,
NULL,
NULL,
&ft);
if (pdwActualSize)
*pdwActualSize = dwActualSize;
}
m_dwCurrentSubKeyIndex++;
if (pdwActualSize)
*pdwActualSize = strlen(m_pchSubkeyNameBuffer);
return nError;
}
LONG CRegistryKey::GetSubkeyCount(DWORD &rdwSubkeyCount)
{
return RegQueryInfoKeyW(m_hKey,NULL,NULL,NULL,&rdwSubkeyCount,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
}
LONG CRegistryKey::GetMaxValueDataSize(DWORD& rdwMaxValueDataBuferSize)
{
return RegQueryInfoKeyW(m_hKey,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&rdwMaxValueDataBuferSize,NULL,NULL);
}
LONG CRegistryKey::GetMaxValueNameLength(DWORD& rdwMaxValueNameBuferSize)
{
rdwMaxValueNameBuferSize = 0;
if (!m_hKey)
return 0; // the root key abstraction has only subkeys (hives)
LONG nError = RegQueryInfoKeyW(m_hKey,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&rdwMaxValueNameBuferSize,NULL,NULL,NULL);
rdwMaxValueNameBuferSize++;
return nError;
}
void CRegistryKey::InitValueEnumeration(TCHAR *pszValueNameBuffer,
DWORD dwValueNameBufferSize,
BYTE *pbValueDataBuffer,
DWORD dwValueDataBufferSize,
DWORD *pdwType)
{
m_pszValueNameBuffer = pszValueNameBuffer;
m_dwValueNameBufferSize = dwValueNameBufferSize;
m_pbValueDataBuffer = pbValueDataBuffer;
m_dwValueDataBufferSize = dwValueDataBufferSize;
m_pdwType = pdwType;
m_dwCurrentValueIndex = 0;
}
// On input dwValueNameSize is size in characters of buffer pointed by pchValueNameBuffer
// On output dwValueNameSize contains number of characters stored in buffer
LONG CRegistryKey::GetNextValue(DWORD *pdwNameActualSize, DWORD *pdwDataActualSize)
{
if (!m_hKey)
return ERROR_NO_MORE_ITEMS; // the root key abstraction has only subkeys (hives)
DWORD dwValueNameBufferSize = m_dwValueNameBufferSize;
DWORD dwValueDataBufferSize = m_dwValueDataBufferSize;
LONG nError = RegEnumValue(m_hKey,
m_dwCurrentValueIndex,
m_pszValueNameBuffer,
&dwValueNameBufferSize,
NULL,
m_pdwType,
m_pbValueDataBuffer,
&dwValueDataBufferSize);
if (pdwNameActualSize)
*pdwNameActualSize = dwValueNameBufferSize;
if (pdwDataActualSize)
*pdwDataActualSize = dwValueDataBufferSize;
m_dwCurrentValueIndex++;
return nError;
}
LONG CRegistryKey::GetValueCount(DWORD& rdwValueCount)
{
if (!m_hKey)
return 0; // the root key abstraction has only subkeys (hives)
return RegQueryInfoKeyW(m_hKey,NULL,NULL,NULL,NULL,NULL,NULL,&rdwValueCount,NULL,NULL,NULL,NULL);
}
LONG CRegistryKey::GetDefaultValue(DWORD *pdwType,
BYTE *pbValueDataBuffer,
DWORD dwValueDataBufferSize,
DWORD *pdwValueDataActualSize)
{
DWORD dwBufferSize = dwValueDataBufferSize;
LONG nError = RegQueryValueEx(m_hKey,NULL,NULL,pdwType,pbValueDataBuffer,&dwBufferSize);
if (pdwValueDataActualSize && (nError == ERROR_SUCCESS))
*pdwValueDataActualSize = dwBufferSize;
return nError;
}
const TCHAR * CRegistryKey::GetValueTypeName(DWORD dwType)
{
switch(dwType)
{
case REG_NONE:
return _T("REG_NONE");
case REG_SZ:
return _T("REG_SZ");
case REG_EXPAND_SZ:
return _T("REG_EXPAND_SZ");
case REG_BINARY:
return _T("REG_BINARY");
case REG_DWORD_LITTLE_ENDIAN:
return _T("REG_DWORD_LITTLE_ENDIAN");
case REG_DWORD_BIG_ENDIAN:
return _T("REG_DWORD_BIG_ENDIAN");
case REG_LINK:
return _T("REG_LINK");
case REG_MULTI_SZ:
return _T("REG_MULTI_SZ");
case REG_RESOURCE_LIST:
return _T("REG_RESOURCE_LIST");
case REG_FULL_RESOURCE_DESCRIPTOR:
return _T("REG_FULL_RESOURCE_DESCRIPTOR");
case REG_RESOURCE_REQUIREMENTS_LIST:
return _T("REG_RESOURCE_REQUIREMENTS_LIST");
default:
return _T("Unkown Type");
}
}
DWORD CRegistryKey::GetValue(TCHAR *pchValueName, DWORD *pdwType, LPBYTE lpValueDataBuffer, DWORD *pdwValueDataSize)
{
return RegQueryValueEx(m_hKey,pchValueName,NULL,pdwType,lpValueDataBuffer,pdwValueDataSize);
}
LONG CRegistryKey::CreateSubkey(REGSAM samDesired,
const TCHAR *pszSubkeyName,
HKEY &rhKey,
BOOL *pblnOpened,
BOOL blnVolatile)
{
DWORD dwDisposition;
LONG nError = RegCreateKeyEx(
m_hKey,
pszSubkeyName,
0,
NULL,
blnVolatile?REG_OPTION_VOLATILE:REG_OPTION_NON_VOLATILE,
samDesired,
NULL,
&rhKey,
&dwDisposition);
if ((nError == ERROR_SUCCESS)&&(pblnOpened))
*pblnOpened = dwDisposition == REG_OPENED_EXISTING_KEY;
return nError;
}
LONG CRegistryKey::GetLastWriteTime(SYSTEMTIME &st)
{
FILETIME ftLocal,ft;
LONG nError = RegQueryInfoKeyW(m_hKey,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,&ft);
if (nError == ERROR_SUCCESS)
{
FileTimeToLocalFileTime(&ft,&ftLocal);
FileTimeToSystemTime(&ftLocal,&st);
}
return nError;
}
const TCHAR * CRegistryKey::GetLastWriteTime()
{
SYSTEMTIME st;
if (GetLastWriteTime(st) != ERROR_SUCCESS)
return _T("(Cannot get time last write time)");
static TCHAR Buffer[256];
_stprintf(Buffer,_T("%d.%d.%d %02d:%02d:%02d"),st.wDay,st.wMonth,st.wYear,st.wHour,st.wMinute,st.wSecond);
return Buffer;
}
LONG CRegistryKey::GetSecurityDescriptorLength(DWORD *pdwSecurityDescriptor)
{
return RegQueryInfoKeyW(m_hKey,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,pdwSecurityDescriptor,NULL);
}
LONG CRegistryKey::GetSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, PSECURITY_DESCRIPTOR pSecurityDescriptor, LPDWORD lpcbSecurityDescriptor)
{
return RegGetKeySecurity(m_hKey,SecurityInformation,pSecurityDescriptor,lpcbSecurityDescriptor);
}
LONG CRegistryKey::DeleteSubkey(const TCHAR *pszSubkeyName)
{
return RegDeleteKey(m_hKey,pszSubkeyName);
}
LONG CRegistryKey::SetValue(LPCTSTR pszValueName, DWORD dwType, BYTE *lpData, DWORD dwDataSize)
{
return RegSetValueEx(m_hKey,pszValueName,0,dwType,lpData,dwDataSize);
}
LONG CRegistryKey::DeleteValue(const TCHAR *pszValueName)
{
return RegDeleteValue(m_hKey,pszValueName);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -