📄 reg_value.hpp
字号:
/// \brief The registry value as a translated (from little-endian) 32-bit integer
ws_dword_t value_dword_littleendian() const;
/// \brief The registry value as a translated (from big-endian) 32-bit integer
ws_dword_t value_dword_bigendian() const;
/// \brief The registry value as a binary value
blob_type value_binary() const;
/// @}
/// \name Implementation
/// @{
private:
ws_dword_t get_type_() const;
static hkey_type dup_key_(hkey_type hkey, REGSAM accessMask/* , result_type *res */);
/// @}
/// \name Members
/// @{
private:
hkey_type m_hkey; // The parent key of the value
string_type m_name; // The name of the value
ss_mutable_k ws_dword_t m_type; // The type of the value
ss_mutable_k ws_bool_t m_bTypeRetrieved; // Facilitates lazy evaluation of the type
/// @}
};
/* Typedefs to commonly encountered types. */
/** \brief Specialisation of the basic_reg_value template for the ANSI character type \c char
*
* \ingroup group__library__windows_registry
*/
typedef basic_reg_value<ws_char_a_t, reg_traits<ws_char_a_t>, processheap_allocator<ws_char_a_t> > reg_value_a;
/** \brief Specialisation of the basic_reg_value template for the Unicode character type \c wchar_t
*
* \ingroup group__library__windows_registry
*/
typedef basic_reg_value<ws_char_w_t, reg_traits<ws_char_w_t>, processheap_allocator<ws_char_w_t> > reg_value_w;
/** \brief Specialisation of the basic_reg_value template for the Win32 character type \c TCHAR
*
* \ingroup group__library__windows_registry
*/
typedef basic_reg_value<TCHAR, reg_traits<TCHAR>, processheap_allocator<TCHAR> > reg_value;
////////////////////////////////////////////////////////////////////////////
// Unit-testing
#ifdef STLSOFT_UNITTEST
# include "./unittest/reg_value_unittest_.h"
#endif /* STLSOFT_UNITTEST */
/* /////////////////////////////////////////////////////////////////////////
* Implementation
*/
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline basic_reg_value<C, T, A>::basic_reg_value()
: m_hkey(NULL)
, m_type(REG_NONE)
, m_bTypeRetrieved(ws_false_v)
{}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline basic_reg_value<C, T, A>::basic_reg_value(class_type const& rhs)
: m_hkey(dup_key_(rhs.m_hkey, KEY_READ))
, m_name(rhs.m_name)
, m_type(rhs.m_type)
, m_bTypeRetrieved(rhs.m_bTypeRetrieved)
{}
#if 0
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline basic_reg_value<C, T, A>::basic_reg_value(basic_reg_value<C, T, A>::hkey_type hkeyParent, basic_reg_value<C, T, A>::string_type const& value_name)
: m_hkey(dup_key_(hkeyParent))
, m_name(value_name)
, m_type(REG_NONE)
, m_bTypeRetrieved(ws_false_v)
{}
#endif /* 0 */
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline basic_reg_value<C, T, A>::~basic_reg_value() stlsoft_throw_0()
{
if(m_hkey != NULL)
{
::RegCloseKey(m_hkey);
}
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ss_typename_type_k basic_reg_value<C, T, A>::class_type &basic_reg_value<C, T, A>::operator =(class_type const& rhs)
{
m_name = rhs.m_name;
m_type = rhs.m_type;
m_bTypeRetrieved = rhs.m_bTypeRetrieved;
hkey_type hkey = m_hkey;
m_hkey = dup_key_(rhs.m_hkey, KEY_READ);
if(hkey != NULL)
{
::RegCloseKey(hkey);
}
return *this;
}
// Implementation
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ws_dword_t basic_reg_value<C, T, A>::get_type_() const
{
if(!m_bTypeRetrieved)
{
size_type data_size;
#ifndef STLSOFT_CF_MUTABLE_KEYWORD_SUPPORT
/* A little-known trick, but a useful one for dealing with translators
* lacking mutable support whilst disturbing code to the minimum degree.
*/
ws_dword_t &m_type = const_cast<ws_dword_t &>(this->m_type);
ws_bool_t &m_bTypeRetrieved = const_cast<ws_bool_t &>(this->m_bTypeRetrieved);
#endif /* STLSOFT_CF_MUTABLE_KEYWORD_SUPPORT */
if(0 == traits_type::reg_query_value(m_hkey, m_name.c_str(), m_type, NULL, data_size))
{
m_bTypeRetrieved = ws_true_v;
}
}
return m_type;
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline /* static */ ss_typename_type_k basic_reg_value<C, T, A>::hkey_type basic_reg_value<C, T, A>::dup_key_(ss_typename_type_k basic_reg_value<C, T, A>::hkey_type hkey, REGSAM accessMask/* , ss_typename_type_k basic_reg_value<C, T, A>::result_type *res */)
{
if(NULL == hkey)
{
return NULL;
}
else
{
result_type res;
HKEY hkeyDup = traits_type::key_dup(hkey, accessMask, &res);
if(ERROR_SUCCESS != res)
{
#ifdef STLSOFT_CF_EXCEPTION_SUPPORT
STLSOFT_THROW_X(registry_exception("Could not duplicate key", res));
#else /* ? STLSOFT_CF_EXCEPTION_SUPPORT */
::SetLastError(res);
hkeyDup = NULL;
#endif /* STLSOFT_CF_EXCEPTION_SUPPORT */
}
return hkeyDup;
}
}
// Attributes
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ws_dword_t basic_reg_value<C, T, A>::type() const
{
return get_type_();
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ss_typename_type_k basic_reg_value<C, T, A>::string_type basic_reg_value<C, T, A>::name() const
{
return m_name;
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ss_typename_type_k basic_reg_value<C, T, A>::string_type basic_reg_value<C, T, A>::value_sz() const
{
// Does not expand environment strings
string_type ret;
size_type data_size;
ws_long_t res = traits_type::reg_query_info(m_hkey, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &data_size, NULL, NULL);
if( ERROR_SUCCESS == res &&
data_size > 0)
{
char_buffer_type_ buffer(1 + data_size);
ws_dword_t dw;
data_size = buffer.size();
res = traits_type::reg_query_value(m_hkey, m_name.c_str(), dw, &buffer[0], data_size);
if(ERROR_SUCCESS == res)
{
buffer[data_size / sizeof(char_type)] = 0; // The site of a former bug. Thanks to Diego Chanoux for spotting this
ret = buffer.data();
}
}
return ret;
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ss_typename_type_k basic_reg_value<C, T, A>::string_type basic_reg_value<C, T, A>::value_expand_sz() const
{
// Does expand environment strings
string_type ret = value_sz();
if( ret.length() > 0 &&
REG_EXPAND_SZ == get_type_())
{
size_type size = traits_type::expand_env_strings(ret.c_str(), NULL, 0);
char_buffer_type_ buffer(1 + size);
if(traits_type::expand_env_strings(ret.c_str(), &buffer[0], size) != 0)
{
ret = &buffer[0];
}
}
return ret;
}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ws_dword_t basic_reg_value<C, T, A>::value_dword() const
{
ws_dword_t dwValue;
size_type cbData = sizeof(dwValue);
ws_dword_t value_type;
ws_long_t res = traits_type::reg_query_value(m_hkey, m_name.c_str(), value_type, &dwValue, cbData);
if(ERROR_SUCCESS != res)
{
dwValue = 0;
}
return dwValue;
}
#if 0
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ws_dword_t basic_reg_value<C, T, A>::value_dword_littleendian() const
{}
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ws_dword_t basic_reg_value<C, T, A>::value_dword_bigendian() const
{}
#endif /* 0 */
template <ss_typename_param_k C, ss_typename_param_k T, ss_typename_param_k A>
inline ss_typename_type_k basic_reg_value<C, T, A>::blob_type basic_reg_value<C, T, A>::value_binary() const
{
size_type data_size;
ws_dword_t dw;
ws_long_t res = traits_type::reg_query_value(m_hkey, m_name.c_str(), dw, NULL, data_size);
if(ERROR_SUCCESS == res)
{
WINSTL_MESSAGE_ASSERT("queried registry value is not binary", dw == REG_BINARY);
if(data_size > 0)
{
byte_buffer_type_ buffer(data_size);
data_size = buffer.size();
res = traits_type::reg_query_value(m_hkey, m_name.c_str(), dw, buffer.data(), data_size);
if(ERROR_SUCCESS == res)
{
return blob_type(buffer.data(), buffer.size());
}
}
}
return blob_type();
}
// reg_blob
template<ss_typename_param_k A>
inline reg_blob<A>::reg_blob()
: m_buffer(0)
{}
template<ss_typename_param_k A>
inline reg_blob<A>::reg_blob(ss_typename_type_k reg_blob<A>::value_type const* data, ss_typename_type_k reg_blob<A>::size_type n)
: m_buffer(n)
{
winstl_ns_qual_std(copy)(data, data + m_buffer.size(), m_buffer.begin());
}
template<ss_typename_param_k A>
inline reg_blob<A>::reg_blob(ss_typename_type_k reg_blob<A>::class_type const& rhs)
: m_buffer(rhs.size())
{
winstl_ns_qual_std(copy)(rhs.data(), rhs.data() + m_buffer.size(), m_buffer.begin());
}
template<ss_typename_param_k A>
inline reg_blob<A>::~reg_blob() stlsoft_throw_0()
{}
template<ss_typename_param_k A>
inline ss_typename_type_k reg_blob<A>::size_type reg_blob<A>::size() const
{
return m_buffer.size();
}
template<ss_typename_param_k A>
inline ss_typename_type_k reg_blob<A>::const_pointer reg_blob<A>::data() const
{
return m_buffer.data();
}
template<ss_typename_param_k A>
inline ss_typename_type_k reg_blob<A>::const_iterator reg_blob<A>::begin() const
{
return m_buffer.begin();
}
template<ss_typename_param_k A>
inline ss_typename_type_k reg_blob<A>::const_iterator reg_blob<A>::end() const
{
return m_buffer.end();
}
#if defined(STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT)
template<ss_typename_param_k A>
inline ss_typename_type_k reg_blob<A>::const_reverse_iterator reg_blob<A>::rbegin() const
{
return const_reverse_iterator(end());
}
template<ss_typename_param_k A>
inline ss_typename_type_k reg_blob<A>::const_reverse_iterator reg_blob<A>::rend() const
{
return const_reverse_iterator(begin());
}
#endif /* STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT */
#endif /* !STLSOFT_DOCUMENTATION_SKIP_SECTION */
/* ////////////////////////////////////////////////////////////////////// */
#ifndef _WINSTL_NO_NAMESPACE
# if defined(_STLSOFT_NO_NAMESPACE) || \
defined(STLSOFT_DOCUMENTATION_SKIP_SECTION)
} // namespace winstl
# else
} // namespace winstl_project
} // namespace stlsoft
# endif /* _STLSOFT_NO_NAMESPACE */
#endif /* !_WINSTL_NO_NAMESPACE */
/* ////////////////////////////////////////////////////////////////////// */
#endif /* WINSTL_INCL_WINSTL_REGISTRY_HPP_REG_VALUE */
/* ////////////////////////////////////////////////////////////////////// */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -