windows-nt/Source/XPSP1/NT/admin/activec/nodemgr/regutil.inl
2020-09-26 16:20:57 +08:00

143 lines
4 KiB
C++

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1992 - 000
*
* File: regutil.inl
*
* Contents: Inline functions for regutil.h
*
* History: 24-Apr-2000 jeffro Created
*
*--------------------------------------------------------------------------*/
#pragma once
#include "regkeyex.h"
/*+-------------------------------------------------------------------------*
* IsIndirectStringSpecifier
*
* Returns true if the given string looks like it might be an indirect
* string specifier acceptable to SHLoadRegUIString, i.e. "@dllname,-id".
*
* Returns false otherwise
*--------------------------------------------------------------------------*/
inline bool IsIndirectStringSpecifier (LPCTSTR psz)
{
return ((psz != NULL) && (psz[0] == _T('@')) && (_tcsstr(psz, _T(",-")) != NULL));
}
/*+-------------------------------------------------------------------------*
* ScGetSnapinNameFromRegistry
*
* Loads the name of a snap-in from the given snap-in CLSID.
*
* The template type StringType can be any string class that supports
* MFC's CString interface (i.e. MFC's CString, WTL::CString, or MMC's
* CStr).
*--------------------------------------------------------------------------*/
template<class StringType>
SC ScGetSnapinNameFromRegistry (
const CLSID& clsid,
StringType& str)
{
DECLARE_SC (sc, _T("ScGetSnapinNameFromRegistry"));
/*
* convert class id to string
*/
OLECHAR szClsid[40];
if (!StringFromGUID2 (clsid, szClsid, countof(szClsid)))
return (sc = E_INVALIDARG);
/*
* load the name
*/
USES_CONVERSION;
sc = ScGetSnapinNameFromRegistry (OLE2T(szClsid), str);
if (sc)
return (sc);
return (sc);
}
/*+-------------------------------------------------------------------------*
* ScGetSnapinNameFromRegistry
*
* Loads the name of a snap-in from the given snap-in CLSID string.
*
* The template type StringType can be any string class that supports
* MFC's CString interface (i.e. MFC's CString, WTL::CString, or MMC's
* CStr).
*--------------------------------------------------------------------------*/
template<class StringType>
SC ScGetSnapinNameFromRegistry (
LPCTSTR pszClsid,
StringType& str)
{
DECLARE_SC (sc, _T("ScGetSnapinNameFromRegistry"));
/*
* open HKLM\Software\Microsoft\MMC\SnapIns\{CLSID}
*/
StringType strKeyName = StringType(SNAPINS_KEY) + _T("\\") + pszClsid;
CRegKeyEx SnapinKey;
LONG lRet = SnapinKey.Open (HKEY_LOCAL_MACHINE, strKeyName, KEY_READ);
if (ERROR_SUCCESS != lRet)
return (sc = HRESULT_FROM_WIN32 (lRet));
/*
* load the string
*/
sc = ScGetSnapinNameFromRegistry (SnapinKey, str);
if (sc)
return (sc);
return (sc);
}
/*+-------------------------------------------------------------------------*
* ScGetSnapinNameFromRegistry
*
* Loads the name of a snap-in from the given open snap-in registry key.
* First, we'll try to use SHLoadRegUIString to resolve an indirect name
* in the "NameStringIndirect" value. If that fails (because "NameString-
* Indirect" isn't registered, because the registered DLL can't be loaded,
* etc.), we'll fall back to the old "NameString" entry.
*
* The template type StringType can be any string class that supports
* MFC's CString interface (i.e. MFC's CString, WTL::CString, or MMC's
* CStr).
*--------------------------------------------------------------------------*/
template<class StringType>
SC ScGetSnapinNameFromRegistry (
CRegKeyEx& key, /* I:snap-in's key, opened for read */
StringType& str) /* O:name of snap-in */
{
DECLARE_SC (sc, _T("ScGetSnapinNameFromRegistry"));
/*
* try to load the MUI-friendly name first, ignoring errors
*/
sc = key.ScLoadRegUIString (g_szNameStringIndirect, str);
/*
* if an error occurred, or ScLoadReagUIString couldn't resolve the
* @dllname syntax, or the returned string was empty, fall back
* on the legacy registry entry
*/
if (sc.IsError() || str.IsEmpty() || IsIndirectStringSpecifier(str))
sc = key.ScQueryString (g_szNameString, str, NULL);
return (sc);
}