📄 regfavorites.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include "Precomp.h"
#ifndef NO_FAVORITES
#include "RegFavorites.h"
#include "resource.h"
#include "regkeys.h"
#include "defines.h"
CRegFavorites::CRegFavorites ()
{
m_bRename = FALSE;
}
CRegFavorites::~CRegFavorites ()
{
}
LPTSTR CRegFavorites::GetRootFolder ()
{
return REG_KEY_BROWSER_FAVORITES;
}
LRESULT CRegFavorites::GetFolderInfo (LPTSTR szFolder,
DWORD &dwSubFolders,
DWORD &dwFavorites)
{
LONG lResult = ERROR_SUCCESS;
HKEY hKey = NULL;
LPTSTR szTmpFolder = (szFolder)?szFolder:REG_KEY_BROWSER_FAVORITES;
lResult = RegOpenKeyEx (HKEY_CURRENT_USER,
szTmpFolder,
0,
0,
&hKey);
if (lResult == ERROR_SUCCESS)
{
lResult = RegQueryInfoKey(hKey,
NULL,
NULL,
NULL,
&dwSubFolders,
NULL,
NULL,
&dwFavorites,
NULL,
NULL,
NULL,
NULL);
}
if (hKey)
RegCloseKey (hKey);
return lResult;
}
LPTSTR CRegFavorites::GetURL (LPTSTR szFavorite)
{
HKEY hKey = NULL;
PBYTE pByte = NULL;
LPTSTR szURL = NULL;
DWORD size;
DWORD type;
if ((szFavorite) && (_tcslen (szFavorite) > 0))
{
if (ERROR_SUCCESS == RegOpenKeyEx (HKEY_CURRENT_USER,
szFavorite,
0,
0,
&hKey))
{
if ((ERROR_SUCCESS == RegQueryValueEx(hKey,
REG_KEY_BROWSER_URL,
NULL,
&type,
NULL,
&size)) &&
(type == REG_SZ || type == REG_MULTI_SZ))
{
pByte = (PBYTE) new BYTE[size + sizeof (TCHAR)];
if ((!pByte) || (RegQueryValueEx(hKey, REG_KEY_BROWSER_URL,
NULL, NULL, pByte, &size) != ERROR_SUCCESS) || (pByte[0] == 0))
{
if (pByte) delete[] pByte;
pByte = NULL;
}
else
szURL = reinterpret_cast<LPTSTR>(pByte);
}
}
}
if (hKey)
RegCloseKey (hKey);
return szURL;
}
BOOL CRegFavorites::IsFavAvailable ()
{
BOOL bRetVal = FALSE;
HKEY hKey = NULL;
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,
REG_KEY_BROWSER_FAVORITES,
0,
0,
&hKey))
{
bRetVal = TRUE;
RegCloseKey (hKey);
}
return bRetVal;
}
LRESULT CRegFavorites::EnumFolders (LPTSTR szPath,
DWORD dwIdx,
LPTSTR szBuffer,
DWORD &dwBufLen)
{
HKEY hKey = NULL;
LONG lRetVal = ERROR_SUCCESS;
if (ERROR_SUCCESS != (lRetVal = RegOpenKeyEx (HKEY_CURRENT_USER,
szPath,
0,0,
&hKey)))
goto RETURN;
lRetVal = RegEnumKeyEx (hKey,dwIdx,szBuffer,&dwBufLen,
NULL,NULL,NULL,NULL);
RETURN:
if (hKey)
RegCloseKey (hKey);
return lRetVal;
}
LRESULT CRegFavorites::CreateFavorite (LPTSTR szPath,
LPTSTR szFavTitle,
LPTSTR szURL)
{
LPTSTR szTmpPath = (szPath)?szPath:REG_KEY_BROWSER_FAVORITES;
LONG lResult = ERROR_SUCCESS;
HKEY hKey = NULL;
TCHAR szRegKey[MAX_REGKEY_LEN-1];
DWORD dwDisposition;
INIT_STR (szRegKey);
wsprintf (szRegKey, L"%s\\%s",szTmpPath,szFavTitle);
lResult = RegCreateKeyEx(HKEY_CURRENT_USER,
szRegKey,
0,
TEXT(""),
0,
KEY_ALL_ACCESS,
NULL,
&hKey,
&dwDisposition);
if (lResult == ERROR_SUCCESS)
{
if (szURL != NULL)
lResult = RegSetValueEx(hKey,
REG_KEY_BROWSER_URL,
0,
REG_SZ,
(BYTE *)szURL,
(_tcslen(szURL)+1)*sizeof(TCHAR));
RegFlushKey(hKey);
RegCloseKey(hKey);
}
if (dwDisposition == REG_OPENED_EXISTING_KEY)
lResult = ERR_DUPLICATE_ENTRY;
return lResult;
}
LRESULT CRegFavorites::CopyFolder (LPTSTR szSourcePath, LPTSTR szDestPath)
{
return MoveKeys (szSourcePath, szDestPath);
}
LRESULT CRegFavorites::DeleteFolder (LPTSTR szPath)
{
LONG lResult = RegDeleteKey (HKEY_CURRENT_USER, szPath);
return lResult;
}
LRESULT CRegFavorites::Rename (LPTSTR szOldName, LPTSTR szNewName)
{
LONG lResult = ERROR_SUCCESS;
m_bRename = TRUE;
lResult = CopyFolder (szOldName, szNewName);
if (lResult == ERROR_SUCCESS)
lResult = RegDeleteKey(HKEY_CURRENT_USER,szOldName);
return lResult;
}
BOOL CRegFavorites::IsDuplicateFavorite (LPTSTR szPath, LPTSTR szFavTitle)
{
TCHAR szRegKey[MAX_REGKEY_LEN-1];
BOOL bRetVal = FALSE;
HKEY hKey = NULL;
INIT_STR (szRegKey);
if ((szPath == NULL) || (!szPath[0]))
wsprintf (szRegKey, L"%s\\%s",REG_KEY_BROWSER_FAVORITES,
szFavTitle);
else
wsprintf (szRegKey, L"%s\\%s",szPath,
szFavTitle);
if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER,
szRegKey,
0,
KEY_READ,
&hKey))
{
bRetVal = TRUE;
RegCloseKey (hKey);
}
return bRetVal;
}
LRESULT CRegFavorites::MoveRegValues (HKEY hKeySrc, HKEY hKeyDest)
{
LONG lRetVal = 0;
DWORD dwIndex = 0;
DWORD dwValueNameSize = 0;
DWORD dwType = 0;
DWORD dwDataSize = 0;
TCHAR *szValueName;
TCHAR *szData;
szValueName = new TCHAR[MAX_VAL_NAME];
szData = new TCHAR[MAX_URL];
if(!szValueName || !szData)
goto Exit;
INIT_STR (szValueName);
INIT_STR (szData);
dwValueNameSize = MAX_VAL_NAME;
dwDataSize = MAX_URL;
while (ERROR_NO_MORE_ITEMS != (lRetVal = RegEnumValue (hKeySrc,
dwIndex++,
szValueName,
&dwValueNameSize,
NULL,
&dwType,
(LPBYTE)szData,
&dwDataSize)))
{
if (lRetVal != ERROR_SUCCESS)
continue;
lRetVal = RegSetValueEx(hKeyDest,szValueName,0,
dwType,(LPBYTE)szData,dwDataSize);
dwValueNameSize = MAX_VAL_NAME;
dwDataSize = MAX_URL;
}
Exit:
delete [] szValueName;
delete [] szData;
return lRetVal;
}
LRESULT CRegFavorites::MoveKeys (LPTSTR szSourceKey, LPTSTR szDestinKey)
{
HKEY hKeyDestin = NULL;
HKEY hKeySource = NULL;
DWORD dwPos = 0;
LONG lResult = 0;
DWORD dwIndex = 0;
DWORD dwSize = 0;
TCHAR *tszSrcKey;
TCHAR *tszDestKey;
TCHAR *szTmpKey;
tszSrcKey = new TCHAR[MAX_REGKEY_LEN];
tszDestKey = new TCHAR[MAX_REGKEY_LEN];
szTmpKey = new TCHAR[FAV_NAME_LEN];
if(!tszSrcKey || !tszDestKey || !szTmpKey)
goto RETURN;
INIT_STR (tszSrcKey);
INIT_STR (tszDestKey);
INIT_STR (szTmpKey);
// Open the source key
if (ERROR_SUCCESS != (lResult = RegOpenKeyEx(HKEY_CURRENT_USER,
szSourceKey,
0,
0,
&hKeySource)))
goto RETURN;
// Create the source key in destination
if (m_bRename)
{
wcsncpy (tszDestKey, szDestinKey, MAX_REGKEY_LEN-1);
m_bRename = FALSE;
}
else
wsprintf (tszDestKey, L"%s\\%s", szDestinKey, wcsrchr(szSourceKey,'\\')+1);
if (ERROR_SUCCESS != (lResult = RegCreateKeyEx(HKEY_CURRENT_USER,
tszDestKey,
0, NULL, 0, 0, NULL,
&hKeyDestin,
&dwPos)))
goto RETURN;
// Move all the values from source to destination
MoveRegValues (hKeySource, hKeyDestin);
dwSize = FAV_NAME_LEN;
while (ERROR_NO_MORE_ITEMS != (lResult=RegEnumKeyEx(hKeySource,
dwIndex++,
szTmpKey,
&dwSize,
NULL,
NULL,
NULL,
NULL)))
{
if (lResult != ERROR_SUCCESS)
continue;
wsprintf (tszSrcKey, L"%s\\%s", szSourceKey, szTmpKey);
MoveKeys (tszSrcKey, tszDestKey);
dwSize = FAV_NAME_LEN;
}
if (lResult == ERROR_NO_MORE_ITEMS)
lResult = ERROR_SUCCESS;
RETURN:
delete [] tszSrcKey;
delete [] tszDestKey;
delete [] szTmpKey;
if (hKeySource)
RegCloseKey(hKeySource);
if (hKeyDestin)
RegCloseKey(hKeyDestin);
return lResult;
}
#endif // ndef NO_FAVORITES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -