📄 statreg.h
字号:
// This is a part of the Active Template Library.
// Copyright (C) 1996-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Active Template Library Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Active Template Library product.
#ifndef __STATREG_H
#define __STATREG_H
#define E_ATL_REGISTRAR_DESC 0x0201
#define E_ATL_NOT_IN_MAP 0x0202
#define E_ATL_UNEXPECTED_EOS 0x0203
#define E_ATL_VALUE_SET_FAILED 0x0204
#define E_ATL_RECURSE_DELETE_FAILED 0x0205
#define E_ATL_EXPECTING_EQUAL 0x0206
#define E_ATL_CREATE_KEY_FAILED 0x0207
#define E_ATL_DELETE_KEY_FAILED 0x0208
#define E_ATL_OPEN_KEY_FAILED 0x0209
#define E_ATL_CLOSE_KEY_FAILED 0x020A
#define E_ATL_UNABLE_TO_COERCE 0x020B
#define E_ATL_BAD_HKEY 0x020C
#define E_ATL_MISSING_OPENKEY_TOKEN 0x020D
#define E_ATL_CONVERT_FAILED 0x020E
#define E_ATL_TYPE_NOT_SUPPORTED 0x020F
#define E_ATL_COULD_NOT_CONCAT 0x0210
#define E_ATL_COMPOUND_KEY 0x0211
#define E_ATL_INVALID_MAPKEY 0x0212
#define E_ATL_UNSUPPORTED_VT 0x0213
#define E_ATL_VALUE_GET_FAILED 0x0214
#define E_ATL_VALUE_TOO_LARGE 0x0215
#define E_ATL_MISSING_VALUE_DELIMETER 0x0216
#define E_ATL_DATA_NOT_BYTE_ALIGNED 0x0217
namespace ATL
{
const TCHAR chDirSep = _T('\\');
const TCHAR chRightBracket = _T('}');
const TCHAR chLeftBracket = _T('{');
const TCHAR chQuote = _T('\'');
const TCHAR chEquals = _T('=');
const LPCTSTR szStringVal = _T("S");
const LPCTSTR szDwordVal = _T("D");
const LPCTSTR szBinaryVal = _T("B");
const LPCTSTR szValToken = _T("Val");
const LPCTSTR szForceRemove = _T("ForceRemove");
const LPCTSTR szNoRemove = _T("NoRemove");
const LPCTSTR szDelete = _T("Delete");
class CExpansionVector
{
public:
//Declare EXPANDER struct. Only used locally.
struct EXPANDER
{
LPOLESTR szKey;
LPOLESTR szValue;
};
CExpansionVector()
{
m_cEls = 0;
m_nSize=10;
m_p = (EXPANDER**)malloc(m_nSize*sizeof(EXPANDER*));
}
~CExpansionVector()
{
free(m_p);
}
HRESULT Add(LPCOLESTR lpszKey, LPCOLESTR lpszValue)
{
USES_CONVERSION;
HRESULT hr = S_OK;
EXPANDER* pExpand = NULL;
ATLTRY(pExpand = new EXPANDER);
if (pExpand == NULL)
return E_OUTOFMEMORY;
DWORD cbKey = (ocslen(lpszKey)+1)*sizeof(OLECHAR);
DWORD cbValue = (ocslen(lpszValue)+1)*sizeof(OLECHAR);
pExpand->szKey = (LPOLESTR)CoTaskMemAlloc(cbKey);
pExpand->szValue = (LPOLESTR)CoTaskMemAlloc(cbValue);
if (pExpand->szKey == NULL || pExpand->szValue == NULL)
{
CoTaskMemFree(pExpand->szKey);
CoTaskMemFree(pExpand->szValue);
delete pExpand;
return E_OUTOFMEMORY;
}
memcpy(pExpand->szKey, lpszKey, cbKey);
memcpy(pExpand->szValue, lpszValue, cbValue);
if (m_cEls == m_nSize)
{
m_nSize*=2;
m_p = (EXPANDER**)realloc(m_p, m_nSize*sizeof(EXPANDER*));
}
if (NULL != m_p)
{
m_p[m_cEls] = pExpand;
m_cEls++;
}
else
hr = E_OUTOFMEMORY;
return hr;
}
LPCOLESTR Find(LPTSTR lpszKey)
{
USES_CONVERSION;
for (int iExpand = 0; iExpand < m_cEls; iExpand++)
{
if (!lstrcmpi(OLE2T(m_p[iExpand]->szKey), lpszKey)) //are equal
return m_p[iExpand]->szValue;
}
return NULL;
}
HRESULT ClearReplacements()
{
for (int iExpand = 0; iExpand < m_cEls; iExpand++)
{
EXPANDER* pExp = m_p[iExpand];
CoTaskMemFree(pExp->szValue);
CoTaskMemFree(pExp->szKey);
delete pExp;
}
m_cEls = 0;
return S_OK;
}
private:
EXPANDER** m_p;
int m_cEls;
int m_nSize;
};
class CRegObject;
class CRegParser
{
public:
CRegParser(CRegObject* pRegObj);
HRESULT PreProcessBuffer(LPTSTR lpszReg, LPTSTR* ppszReg);
HRESULT RegisterBuffer(LPTSTR szReg, BOOL bRegister);
protected:
void SkipWhiteSpace();
HRESULT NextToken(LPTSTR szToken);
HRESULT AddValue(CRegKey& rkParent,LPCTSTR szValueName, LPTSTR szToken);
BOOL CanForceRemoveKey(LPCTSTR szKey);
BOOL HasSubKeys(HKEY hkey);
BOOL HasValues(HKEY hkey);
HRESULT RegisterSubkeys(LPTSTR szToken, HKEY hkParent, BOOL bRegister, BOOL bInRecovery = FALSE);
BOOL IsSpace(TCHAR ch);
LPTSTR m_pchCur;
CRegObject* m_pRegObj;
HRESULT GenerateError(UINT) {return DISP_E_EXCEPTION;}
HRESULT HandleReplacements(LPTSTR& szToken);
HRESULT SkipAssignment(LPTSTR szToken);
BOOL EndOfVar() { return chQuote == *m_pchCur && chQuote != *CharNext(m_pchCur); }
static LPTSTR StrChr(LPTSTR lpsz, TCHAR ch);
static HKEY HKeyFromString(LPTSTR szToken);
static BYTE ChToByte(const TCHAR ch);
static BOOL VTFromRegType(LPCTSTR szValueType, VARTYPE& vt);
static LPCTSTR rgszNeverDelete[];
static const int cbNeverDelete;
static const int MAX_VALUE;
static const int MAX_TYPE;
class CParseBuffer
{
public:
int nPos;
int nSize;
LPTSTR p;
CParseBuffer(int nInitial)
{
nPos = 0;
nSize = nInitial;
p = (LPTSTR) CoTaskMemAlloc(nSize*sizeof(TCHAR));
}
~CParseBuffer()
{
CoTaskMemFree(p);
}
BOOL AddChar(const TCHAR* pch)
{
if (nPos == nSize) // realloc
{
nSize *= 2;
p = (LPTSTR) CoTaskMemRealloc(p, nSize*sizeof(TCHAR));
}
p[nPos++] = *pch;
#ifndef _UNICODE
if (IsDBCSLeadByte(*pch))
p[nPos++] = *(pch + 1);
#endif
return TRUE;
}
BOOL AddString(LPCOLESTR lpsz)
{
USES_CONVERSION;
LPCTSTR lpszT = OLE2CT(lpsz);
while (*lpszT)
{
AddChar(lpszT);
lpszT++;
}
return TRUE;
}
LPTSTR Detach()
{
LPTSTR lp = p;
p = NULL;
return lp;
}
};
};
#if defined(_ATL_DLL) | defined(_ATL_DLL_IMPL)
class ATL_NO_VTABLE CRegObject
: public IRegistrar
#else
class CRegObject
#endif
{
public:
~CRegObject(){ClearReplacements();}
HRESULT FinalConstruct() {return S_OK;}
void FinalRelease() {}
// Map based methods
HRESULT STDMETHODCALLTYPE AddReplacement(LPCOLESTR lpszKey, LPCOLESTR lpszItem);
HRESULT STDMETHODCALLTYPE ClearReplacements();
LPCOLESTR StrFromMap(LPTSTR lpszKey);
// Register via a given mechanism
HRESULT STDMETHODCALLTYPE ResourceRegister(LPCOLESTR pszFileName, UINT nID, LPCOLESTR pszType);
HRESULT STDMETHODCALLTYPE ResourceRegisterSz(LPCOLESTR pszFileName, LPCOLESTR pszID, LPCOLESTR pszType);
HRESULT STDMETHODCALLTYPE ResourceUnregister(LPCOLESTR pszFileName, UINT nID, LPCOLESTR pszType);
HRESULT STDMETHODCALLTYPE ResourceUnregisterSz(LPCOLESTR pszFileName, LPCOLESTR pszID, LPCOLESTR pszType);
HRESULT STDMETHODCALLTYPE FileRegister(LPCOLESTR bstrFileName)
{
return CommonFileRegister(bstrFileName, TRUE);
}
HRESULT STDMETHODCALLTYPE FileUnregister(LPCOLESTR bstrFileName)
{
return CommonFileRegister(bstrFileName, FALSE);
}
HRESULT STDMETHODCALLTYPE StringRegister(LPCOLESTR bstrData)
{
return RegisterWithString(bstrData, TRUE);
}
HRESULT STDMETHODCALLTYPE StringUnregister(LPCOLESTR bstrData)
{
return RegisterWithString(bstrData, FALSE);
}
protected:
HRESULT CommonFileRegister(LPCOLESTR pszFileName, BOOL bRegister);
HRESULT RegisterFromResource(LPCOLESTR pszFileName, LPCTSTR pszID, LPCTSTR pszType, BOOL bRegister);
HRESULT RegisterWithString(LPCOLESTR pszData, BOOL bRegister);
static HRESULT GenerateError(UINT) {return DISP_E_EXCEPTION;}
CExpansionVector m_RepMap;
CComObjectThreadModel::AutoCriticalSection m_csMap;
};
inline HRESULT STDMETHODCALLTYPE CRegObject::AddReplacement(LPCOLESTR lpszKey, LPCOLESTR lpszItem)
{
m_csMap.Lock();
HRESULT hr = m_RepMap.Add(lpszKey, lpszItem);
m_csMap.Unlock();
return hr;
}
inline HRESULT CRegObject::RegisterFromResource(LPCOLESTR bstrFileName, LPCTSTR szID,
LPCTSTR szType, BOOL bRegister)
{
USES_CONVERSION;
HRESULT hr;
CRegParser parser(this);
HINSTANCE hInstResDll;
HRSRC hrscReg;
HGLOBAL hReg;
DWORD dwSize;
LPSTR szRegA;
LPTSTR szReg;
hInstResDll = LoadLibraryEx(OLE2CT(bstrFileName), NULL, LOAD_LIBRARY_AS_DATAFILE);
if (NULL == hInstResDll)
{
ATLTRACE2(atlTraceRegistrar, 0, _T("Failed to LoadLibrary on %s\n"), OLE2CT(bstrFileName));
hr = HRESULT_FROM_WIN32(GetLastError());
goto ReturnHR;
}
hrscReg = FindResource((HMODULE)hInstResDll, szID, szType);
if (NULL == hrscReg)
{
ATLTRACE2(atlTraceRegistrar, 0, (HIWORD(szID) == NULL) ?
_T("Failed to FindResource on ID:%d TYPE:%s\n") :
_T("Failed to FindResource on ID:%s TYPE:%s\n"),
szID, szType);
hr = HRESULT_FROM_WIN32(GetLastError());
goto ReturnHR;
}
hReg = LoadResource((HMODULE)hInstResDll, hrscReg);
if (NULL == hReg)
{
ATLTRACE2(atlTraceRegistrar, 0, _T("Failed to LoadResource \n"));
hr = HRESULT_FROM_WIN32(GetLastError());
goto ReturnHR;
}
dwSize = SizeofResource((HMODULE)hInstResDll, hrscReg);
szRegA = (LPSTR)hReg;
if (szRegA[dwSize] != NULL)
{
szRegA = (LPSTR)_alloca(dwSize+1);
memcpy(szRegA, (void*)hReg, dwSize+1);
szRegA[dwSize] = NULL;
}
szReg = A2T(szRegA);
hr = parser.RegisterBuffer(szReg, bRegister);
ReturnHR:
if (NULL != hInstResDll)
FreeLibrary((HMODULE)hInstResDll);
return hr;
}
inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceRegister(LPCOLESTR szFileName, UINT nID, LPCOLESTR szType)
{
USES_CONVERSION;
return RegisterFromResource(szFileName, MAKEINTRESOURCE(nID), OLE2CT(szType), TRUE);
}
inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceRegisterSz(LPCOLESTR szFileName, LPCOLESTR szID, LPCOLESTR szType)
{
USES_CONVERSION;
if (szID == NULL || szType == NULL)
return E_INVALIDARG;
return RegisterFromResource(szFileName, OLE2CT(szID), OLE2CT(szType), TRUE);
}
inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceUnregister(LPCOLESTR szFileName, UINT nID, LPCOLESTR szType)
{
USES_CONVERSION;
return RegisterFromResource(szFileName, MAKEINTRESOURCE(nID), OLE2CT(szType), FALSE);
}
inline HRESULT STDMETHODCALLTYPE CRegObject::ResourceUnregisterSz(LPCOLESTR szFileName, LPCOLESTR szID, LPCOLESTR szType)
{
USES_CONVERSION;
if (szID == NULL || szType == NULL)
return E_INVALIDARG;
return RegisterFromResource(szFileName, OLE2CT(szID), OLE2CT(szType), FALSE);
}
inline HRESULT CRegObject::RegisterWithString(LPCOLESTR bstrData, BOOL bRegister)
{
USES_CONVERSION;
CRegParser parser(this);
LPCTSTR szReg = OLE2CT(bstrData);
HRESULT hr = parser.RegisterBuffer((LPTSTR)szReg, bRegister);
return hr;
}
inline HRESULT CRegObject::ClearReplacements()
{
m_csMap.Lock();
HRESULT hr = m_RepMap.ClearReplacements();
m_csMap.Unlock();
return hr;
}
inline LPCOLESTR CRegObject::StrFromMap(LPTSTR lpszKey)
{
m_csMap.Lock();
LPCOLESTR lpsz = m_RepMap.Find(lpszKey);
if (lpsz == NULL) // not found!!
ATLTRACE2(atlTraceRegistrar, 0, _T("Map Entry not found\n"));
m_csMap.Unlock();
return lpsz;
}
inline HRESULT CRegObject::CommonFileRegister(LPCOLESTR bstrFileName, BOOL bRegister)
{
USES_CONVERSION;
CRegParser parser(this);
HANDLE hFile = CreateFile(OLE2CT(bstrFileName), GENERIC_READ, 0, NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_READONLY,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
ATLTRACE2(atlTraceRegistrar, 0, _T("Failed to CreateFile on %s\n"), OLE2CT(bstrFileName));
return HRESULT_FROM_WIN32(GetLastError());
}
HRESULT hRes = S_OK;
DWORD cbRead;
DWORD cbFile = GetFileSize(hFile, NULL); // No HiOrder DWORD required
char* szReg = (char*)_alloca(cbFile + 1);
if (ReadFile(hFile, szReg, cbFile, &cbRead, NULL) == 0)
{
ATLTRACE2(atlTraceRegistrar, 0, "Read Failed on file%s\n", OLE2CT(bstrFileName));
hRes = HRESULT_FROM_WIN32(GetLastError());
}
if (SUCCEEDED(hRes))
{
szReg[cbRead] = NULL;
LPTSTR szConverted = A2T(szReg);
hRes = parser.RegisterBuffer(szConverted, bRegister);
}
CloseHandle(hFile);
return hRes;
}
__declspec(selectany) LPCTSTR CRegParser::rgszNeverDelete[] = //Component Catagories
{
_T("CLSID"), _T("TYPELIB")
};
__declspec(selectany) const int CRegParser::cbNeverDelete = sizeof(rgszNeverDelete) / sizeof(LPCTSTR*);
__declspec(selectany) const int CRegParser::MAX_VALUE=4096;
__declspec(selectany) const int CRegParser::MAX_TYPE=MAX_VALUE;
inline BOOL CRegParser::VTFromRegType(LPCTSTR szValueType, VARTYPE& vt)
{
struct typemap
{
LPCTSTR lpsz;
VARTYPE vt;
};
static const typemap map[] = {
{szStringVal, VT_BSTR},
{szDwordVal, VT_UI4},
{szBinaryVal, VT_UI1}
};
for (int i=0;i<sizeof(map)/sizeof(typemap);i++)
{
if (!lstrcmpi(szValueType, map[i].lpsz))
{
vt = map[i].vt;
return TRUE;
}
}
return FALSE;
}
inline BYTE CRegParser::ChToByte(const TCHAR ch)
{
switch (ch)
{
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
return (BYTE) (ch - '0');
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
return (BYTE) (10 + (ch - 'A'));
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
return (BYTE) (10 + (ch - 'a'));
default:
ATLASSERT(FALSE);
ATLTRACE2(atlTraceRegistrar, 0, _T("Bogus value %c passed as binary Hex value\n"), ch);
return 0;
}
}
inline HKEY CRegParser::HKeyFromString(LPTSTR szToken)
{
struct keymap
{
LPCTSTR lpsz;
HKEY hkey;
};
static const keymap map[] = {
{_T("HKCR"), HKEY_CLASSES_ROOT},
{_T("HKCU"), HKEY_CURRENT_USER},
{_T("HKLM"), HKEY_LOCAL_MACHINE},
{_T("HKU"), HKEY_USERS},
{_T("HKPD"), HKEY_PERFORMANCE_DATA},
{_T("HKDD"), HKEY_DYN_DATA},
{_T("HKCC"), HKEY_CURRENT_CONFIG},
{_T("HKEY_CLASSES_ROOT"), HKEY_CLASSES_ROOT},
{_T("HKEY_CURRENT_USER"), HKEY_CURRENT_USER},
{_T("HKEY_LOCAL_MACHINE"), HKEY_LOCAL_MACHINE},
{_T("HKEY_USERS"), HKEY_USERS},
{_T("HKEY_PERFORMANCE_DATA"), HKEY_PERFORMANCE_DATA},
{_T("HKEY_DYN_DATA"), HKEY_DYN_DATA},
{_T("HKEY_CURRENT_CONFIG"), HKEY_CURRENT_CONFIG}
};
for (int i=0;i<sizeof(map)/sizeof(keymap);i++)
{
if (!lstrcmpi(szToken, map[i].lpsz))
return map[i].hkey;
}
return NULL;
}
inline LPTSTR CRegParser::StrChr(LPTSTR lpsz, TCHAR ch)
{
LPTSTR p = NULL;
while (*lpsz)
{
if (*lpsz == ch)
{
p = lpsz;
break;
}
lpsz = CharNext(lpsz);
}
return p;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -