📄 dregkey.cpp
字号:
// dregkey.cpp
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// ---------------------------- RegDelete -------------------------
// Recursively deletes subkeys within a key.
// Basically a deltree for registries.
//
// Note. When you delete a Key all values in that key get deleted
// automatically. Do not use too much stack since this function
// does use recursion.
LONG RegDelete( HKEY hParentKey, // handle of open key
LPCTSTR lpSubKey // address of name of subkey to delete
)
{
LONG retValue; // return value stored
HKEY hKey; // currently open key for enumeration
CHAR regSubKeyName[4096]; // subkey obtained through enumeration
CString regKeyName; // key-subkenname concatenated
DWORD index =0; // enumerated key index#
// test the keys security
retValue = RegOpenKeyEx(hParentKey, lpSubKey, 0, KEY_WRITE | KEY_READ, &hKey);
if (ERROR_SUCCESS != retValue)
return(retValue);
// go into a loop until we run out of subkeys
while (ERROR_SUCCESS == RegEnumKey(hKey, index, regSubKeyName, sizeof(regSubKeyName)))
{
// delete the subkey by..
// building up its full name
regKeyName = lpSubKey;
regKeyName += "\\";
regKeyName += regSubKeyName;
// recursively delete any subkeys in it
retValue = RegDelete(hParentKey, regKeyName);
// bomb out of the loop if we encounter an error
if (ERROR_SUCCESS != retValue)
return(retValue);
//index++; // enumerate next key
}
// enumerate failed (none or no more subkeys)
RegCloseKey(hKey);
retValue = RegDeleteKey(hParentKey, lpSubKey);
return (retValue);
} // RegDelete
//////////////////////////////////////////////////////////////////////////////
// DRegKey class implementation follows:
//
//
// initialise some static variables
HKEY DRegKey::local_machine = HKEY_LOCAL_MACHINE;
HKEY DRegKey::current_user = HKEY_CURRENT_USER;
// implementation
// ------------------------------DRegKey::DRegKey --------------------------
// constructor
DRegKey::DRegKey(HKEY hKey, LPCTSTR keyName, REGSAM regSam)
{
m_hKey = NULL;
Open(hKey ,keyName, regSam);
}
// KEY_ENUMERATE_SUB_KEYS |KEY_EXECUTE | KEY_QUERY_VALUE
// ------------------------------------ Open -------------------------------
LONG DRegKey::Open(HKEY hKey, // can be "local_machine" or "current_user"
LPCTSTR keyName, // optional name
REGSAM regSam // optional access specifiers
)
{
HKEY openedKey;
DWORD dp;
if (NULL!= keyName)
{
m_KeyName = keyName;
m_baseKey = hKey;
result = RegCreateKeyEx(hKey, keyName, 0, NULL,
REG_OPTION_NON_VOLATILE,
regSam, NULL, &openedKey, &dp);
if (ERROR_SUCCESS == result)
m_hKey = openedKey;
return (result);
}
else
m_hKey = hKey;
return (ERROR_SUCCESS);
} // Open
// ----------------------------------- Close ---------------------------------
// closes the opened key (also called by the destructor)
LONG DRegKey::Close()
{
if (NULL == m_hKey)
return(FALSE);
result = RegCloseKey(m_hKey);
m_hKey = NULL;
return(result);
} // Close
// ------------------------------ operator HKEY() const ---------------------
DRegKey::operator HKEY() const
{
return m_hKey;
} // operator HKEY() const
// ----------------------------------- QueryValue ----------------------------
// DWORD
LONG DRegKey::QueryValue(LPCTSTR valueName , DWORD *dwValue)
{
DWORD size = sizeof(DWORD);
result = RegQueryValueEx(m_hKey,
valueName,
NULL, // reserved
NULL, // value type
(BYTE*)dwValue,
&size);
return(result);
} // QueryValue
// ------------------------------------ QueryValue ---------------------------
LONG DRegKey::QueryValue(LPCTSTR valueName , BYTE *bValue)
{
DWORD v = (DWORD)*bValue;
LONG ret=QueryValue(valueName,&v);
*bValue = (BYTE)v;
return(ret);
}
// ------------------------------------ QueryValue ---------------------------
LONG DRegKey::QueryValue(LPCTSTR valueName , LONG *lValue)
{
DWORD v= (DWORD)*lValue;
LONG ret=QueryValue(valueName,&v);
*lValue = (LONG)v;
return(ret);
}
// ----------------------------------- QueryValue ----------------------------
// strings
LONG DRegKey::QueryValue(LPCTSTR valueName , LPSTR szValue, DWORD *pLength)
{
result = RegQueryValueEx(m_hKey,
valueName,
NULL, // reserved
NULL, // value type
(BYTE*)szValue,
pLength);
return(result);
} // QueryValue
// ----------------------------------- QueryValue ----------------------------
// strings
LONG DRegKey::QueryValue(LPCTSTR valueName , CString &string)
{
CHAR buffer[1024];
DWORD len = sizeof(buffer);
result = RegQueryValueEx(m_hKey,
valueName,
NULL, // reserved
NULL, // value type
(BYTE*)buffer,
&len);
if (ERROR_SUCCESS == result)
{
string = buffer;
}
return(result);
} // QueryValue
// ----------------------------------- QueryBinValue ----------------------------
// binary data
LONG DRegKey::QueryBinValue(LPCTSTR valueName , BYTE* binData, DWORD *pLength)
{
result = RegQueryValueEx(m_hKey,
valueName,
NULL, // reserved
NULL, // value type
binData,
pLength);
return(result);
} // QueryBinValue
// ----------------------------------- SetBinValue ----------------------------
// binary data
LONG DRegKey::SetBinValue(LPCTSTR valueName , BYTE* binData, DWORD length)
{
result = RegSetValueEx(m_hKey,
valueName,
0, // reserved
REG_BINARY, // value type
binData,
length);
return(result);
} // SetBinValue
// ----------------------------------- SetValue ------------------------------
// DWORD
LONG DRegKey::SetValue(LPCTSTR valueName , DWORD dwValue)
{
result = RegSetValueEx(m_hKey, valueName, 0, REG_DWORD, (BYTE*)&dwValue, sizeof(DWORD));
return(result);
} // SetValue
// ----------------------------------- SetValue ------------------------------
// strings
LONG DRegKey::SetValue(LPCTSTR valueName , LPCTSTR szValue, DWORD length)
{
if (-1 == length)
length = strlen(szValue);
result = RegSetValueEx(m_hKey, valueName, 0, REG_SZ, (BYTE*)szValue, length+1);
return(result);
} // SetValue
// ----------------------------------- SetValue ------------------------------
// Binary data
LONG DRegKey::SetValue(LPCTSTR valueName , const BYTE* binData, DWORD length)
{
result = RegSetValueEx(m_hKey, valueName, 0, REG_BINARY, binData, length);
return(result);
} // SetValue
// ----------------------------------- DeleteValue ---------------------------
LONG DRegKey::DeleteValue(LPCTSTR valueName)
{
result = RegDeleteValue(m_hKey, valueName);
return(result);
} // DeleteValue
// ----------------------------------- DeleteKey -----------------------------
// delete a key and all values, will not work if the key has any sub-keys
LONG DRegKey::DeleteKey(LPCTSTR keyName)
{
if (NULL != keyName)
{
// delete a subkey of the already opened key
result = ::RegDeleteKey(m_hKey, keyName);
}
else
{
// delete a key off the root key
result = ::RegDeleteKey(m_baseKey, m_KeyName);
}
return(result);
} // DeleteKey
// ----------------------------------- DeleteKeyRecurse ----------------------
// uses the global driverlib function to delete a key and all of it's
// subkeys
LONG DRegKey::DeleteKeyRecurse(LPCTSTR keyName)
{
if (NULL != keyName)
{
// call the driverlib function
::RegDelete(m_hKey, keyName);
result = GetLastError();
}
else
{
// call the driverlib function
::RegDelete(m_baseKey, m_KeyName);
result = GetLastError();
}
return(result);
} // DeleteKeyRecurse
// ------------------------------ EnumKey ------------------------
// populate a CStringarray with key names
LONG DRegKey::EnumKey(CStringArray &csaKeyNames)
{
LONG ret = ERROR_SUCCESS;
DWORD index=0;
CString keyName;
csaKeyNames.RemoveAll();
while (ERROR_SUCCESS == ret)
{
ret = EnumKey(index, keyName);
csaKeyNames.Add(keyName);
index++;
}
return(csaKeyNames.GetSize());
}
// ------------------------------ EnumKey ------------------------
// Supply the key name at an index
LONG DRegKey::EnumKey(DWORD index, CString &valueName)
{
LONG ret;
DWORD keyLengthMax;
// LONG RegQueryInfoKey(HKEY hKey, // handle to key
// LPTSTR lpClass, // class buffer
// LPDWORD lpcClass, // size of class buffer
// LPDWORD lpReserved, // reserved
// LPDWORD lpcSubKeys, // number of subkeys
// LPDWORD lpcMaxSubKeyLen, // longest subkey name
// LPDWORD lpcMaxClassLen, // longest class string
// LPDWORD lpcValues, // number of value entries
// LPDWORD lpcMaxValueNameLen, // longest value name
// LPDWORD lpcMaxValueLen, // longest value data
// LPDWORD lpcbSecurityDescriptor, // descriptor length
// PFILETIME lpftLastWriteTime ); // last write time
ret = RegQueryInfoKey(m_hKey, NULL, NULL,
NULL,
NULL, // number of subkeys
&keyLengthMax,
NULL,NULL,NULL,NULL,NULL,NULL);
if (ret != ERROR_SUCCESS)
return(ret);
ret = EnumKey(index, valueName.GetBufferSetLength(keyLengthMax), keyLengthMax);
valueName.ReleaseBuffer();
return(ret);
}
// ------------------------------ EnumKey ------------------------
// return the key name at an index
LONG DRegKey::EnumKey(DWORD index, LPSTR string, DWORD maxSize)
{
LONG ret;
ret = RegEnumKey(m_hKey, index, string, maxSize);
return(ret);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -