regedit: Convert clipboard handling to unicode.
This commit is contained in:
parent
5cb8bccf46
commit
6168a7c60c
|
@ -49,6 +49,28 @@ LPCTSTR GetRootKeyName(HKEY hRootKey)
|
|||
return _T("UNKNOWN HKEY, PLEASE REPORT");
|
||||
}
|
||||
|
||||
LPCWSTR GetRootKeyNameW(HKEY hRootKey)
|
||||
{
|
||||
if(hRootKey == HKEY_CLASSES_ROOT)
|
||||
return reg_class_namesW[INDEX_HKEY_CLASSES_ROOT];
|
||||
if(hRootKey == HKEY_CURRENT_USER)
|
||||
return reg_class_namesW[INDEX_HKEY_CURRENT_USER];
|
||||
if(hRootKey == HKEY_LOCAL_MACHINE)
|
||||
return reg_class_namesW[INDEX_HKEY_LOCAL_MACHINE];
|
||||
if(hRootKey == HKEY_USERS)
|
||||
return reg_class_namesW[INDEX_HKEY_USERS];
|
||||
if(hRootKey == HKEY_CURRENT_CONFIG)
|
||||
return reg_class_namesW[INDEX_HKEY_CURRENT_CONFIG];
|
||||
if(hRootKey == HKEY_DYN_DATA)
|
||||
return reg_class_namesW[INDEX_HKEY_DYN_DATA];
|
||||
else
|
||||
{
|
||||
static const WCHAR unknown_key[] = {'U','N','K','N','O','W','N',' ','H','K','E','Y',',',' ',
|
||||
'P','L','E','A','S','E',' ','R','E','P','O','R','T',0};
|
||||
return unknown_key;
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_splitbar(HWND hWnd, int x)
|
||||
{
|
||||
RECT rt;
|
||||
|
@ -109,6 +131,31 @@ static LPTSTR CombinePaths(LPCTSTR pPaths[], int nPaths) {
|
|||
return combined;
|
||||
}
|
||||
|
||||
static LPWSTR CombinePathsW(LPCWSTR pPaths[], int nPaths) {
|
||||
int i, len, pos;
|
||||
LPWSTR combined;
|
||||
for (i=0, len=0; i<nPaths; i++) {
|
||||
if (pPaths[i] && *pPaths[i]) {
|
||||
len += lstrlenW(pPaths[i])+1;
|
||||
}
|
||||
}
|
||||
combined = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
|
||||
*combined = '\0';
|
||||
for (i=0, pos=0; i<nPaths; i++) {
|
||||
if (pPaths[i] && *pPaths[i]) {
|
||||
int llen = lstrlenW(pPaths[i]);
|
||||
if (!*combined)
|
||||
lstrcpyW(combined, pPaths[i]);
|
||||
else {
|
||||
combined[pos++] = (TCHAR)'\\';
|
||||
lstrcpyW(combined+pos, pPaths[i]);
|
||||
}
|
||||
pos += llen;
|
||||
}
|
||||
}
|
||||
return combined;
|
||||
}
|
||||
|
||||
static LPTSTR GetPathRoot(HWND hwndTV, HTREEITEM hItem, BOOL bFull) {
|
||||
LPCTSTR parts[2] = {_T(""), _T("")};
|
||||
TCHAR text[260];
|
||||
|
@ -128,6 +175,25 @@ static LPTSTR GetPathRoot(HWND hwndTV, HTREEITEM hItem, BOOL bFull) {
|
|||
return CombinePaths(parts, 2);
|
||||
}
|
||||
|
||||
static LPWSTR GetPathRootW(HWND hwndTV, HTREEITEM hItem, BOOL bFull) {
|
||||
LPCWSTR parts[2] = {0,0};
|
||||
WCHAR text[260];
|
||||
HKEY hRootKey = NULL;
|
||||
if (!hItem)
|
||||
hItem = TreeView_GetSelection(hwndTV);
|
||||
GetItemPathW(hwndTV, hItem, &hRootKey);
|
||||
if (!bFull && !hRootKey)
|
||||
return NULL;
|
||||
if (hRootKey)
|
||||
parts[1] = GetRootKeyNameW(hRootKey);
|
||||
if (bFull) {
|
||||
DWORD dwSize = sizeof(text)/sizeof(TCHAR);
|
||||
GetComputerNameW(text, &dwSize);
|
||||
parts[0] = text;
|
||||
}
|
||||
return CombinePathsW(parts, 2);
|
||||
}
|
||||
|
||||
LPTSTR GetItemFullPath(HWND hwndTV, HTREEITEM hItem, BOOL bFull) {
|
||||
LPTSTR parts[2];
|
||||
LPTSTR ret;
|
||||
|
@ -140,6 +206,18 @@ LPTSTR GetItemFullPath(HWND hwndTV, HTREEITEM hItem, BOOL bFull) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
LPWSTR GetItemFullPathW(HWND hwndTV, HTREEITEM hItem, BOOL bFull) {
|
||||
LPWSTR parts[2];
|
||||
LPWSTR ret;
|
||||
HKEY hRootKey = NULL;
|
||||
|
||||
parts[0] = GetPathRootW(hwndTV, hItem, bFull);
|
||||
parts[1] = GetItemPathW(hwndTV, hItem, &hRootKey);
|
||||
ret = CombinePathsW((LPCWSTR *)parts, 2);
|
||||
HeapFree(GetProcessHeap(), 0, parts[0]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static LPTSTR GetPathFullPath(HWND hwndTV, LPTSTR path) {
|
||||
LPTSTR parts[2];
|
||||
LPTSTR ret;
|
||||
|
|
|
@ -440,7 +440,7 @@ static BOOL PrintRegistryHive(HWND hWnd, LPCWSTR path)
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName)
|
||||
static BOOL CopyKeyName(HWND hWnd, LPCWSTR keyName)
|
||||
{
|
||||
BOOL result;
|
||||
|
||||
|
@ -448,12 +448,12 @@ static BOOL CopyKeyName(HWND hWnd, LPCTSTR keyName)
|
|||
if (result) {
|
||||
result = EmptyClipboard();
|
||||
if (result) {
|
||||
int len = (_tcslen(keyName)+1)*sizeof(TCHAR);
|
||||
int len = (lstrlenW(keyName)+1)*sizeof(WCHAR);
|
||||
HANDLE hClipData = GlobalAlloc(GHND, len);
|
||||
LPVOID pLoc = GlobalLock(hClipData);
|
||||
_tcscpy(pLoc, keyName);
|
||||
lstrcpyW(pLoc, keyName);
|
||||
GlobalUnlock(hClipData);
|
||||
hClipData = SetClipboardData(CF_TEXT, hClipData);
|
||||
hClipData = SetClipboardData(CF_UNICODETEXT, hClipData);
|
||||
|
||||
} else {
|
||||
/* error emptying clipboard*/
|
||||
|
@ -753,7 +753,7 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||
}
|
||||
case ID_EDIT_COPYKEYNAME:
|
||||
{
|
||||
LPTSTR fullPath = GetItemFullPath(g_pChildWnd->hTreeWnd, NULL, FALSE);
|
||||
LPWSTR fullPath = GetItemFullPathW(g_pChildWnd->hTreeWnd, NULL, FALSE);
|
||||
if (fullPath) {
|
||||
CopyKeyName(hWnd, fullPath);
|
||||
HeapFree(GetProcessHeap(), 0, fullPath);
|
||||
|
|
|
@ -34,6 +34,17 @@ WCHAR g_pszDefaultValueNameW[64];
|
|||
|
||||
BOOL ProcessCmdLine(LPSTR lpCmdLine);
|
||||
|
||||
static const WCHAR hkey_local_machine[] = {'H','K','E','Y','_','L','O','C','A','L','_','M','A','C','H','I','N','E',0};
|
||||
static const WCHAR hkey_users[] = {'H','K','E','Y','_','U','S','E','R','S',0};
|
||||
static const WCHAR hkey_classes_root[] = {'H','K','E','Y','_','C','L','A','S','S','E','S','_','R','O','O','T',0};
|
||||
static const WCHAR hkey_current_config[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','C','O','N','F','I','G',0};
|
||||
static const WCHAR hkey_current_user[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R',0};
|
||||
static const WCHAR hkey_dyn_data[] = {'H','K','E','Y','_','D','Y','N','_','D','A','T','A',0};
|
||||
|
||||
const WCHAR *reg_class_namesW[] = {hkey_local_machine, hkey_users,
|
||||
hkey_classes_root, hkey_current_config,
|
||||
hkey_current_user, hkey_dyn_data
|
||||
};
|
||||
|
||||
/*******************************************************************************
|
||||
* Global Variables:
|
||||
|
|
|
@ -93,12 +93,24 @@ extern const TCHAR szChildClass[];
|
|||
extern TCHAR g_pszDefaultValueName[];
|
||||
extern WCHAR g_pszDefaultValueNameW[];
|
||||
|
||||
/* Registry class names and their indexes */
|
||||
extern const WCHAR* reg_class_namesW[];
|
||||
#define INDEX_HKEY_LOCAL_MACHINE 0
|
||||
#define INDEX_HKEY_USERS 1
|
||||
#define INDEX_HKEY_CLASSES_ROOT 2
|
||||
#define INDEX_HKEY_CURRENT_CONFIG 3
|
||||
#define INDEX_HKEY_CURRENT_USER 4
|
||||
#define INDEX_HKEY_DYN_DATA 5
|
||||
|
||||
|
||||
|
||||
/* about.c */
|
||||
extern void ShowAboutBox(HWND hWnd);
|
||||
|
||||
/* childwnd.c */
|
||||
extern LPCTSTR GetRootKeyName(HKEY hRootKey);
|
||||
extern LPTSTR GetItemFullPath(HWND hwndTV, HTREEITEM hItem, BOOL bFull);
|
||||
extern LPWSTR GetItemFullPathW(HWND hwndTV, HTREEITEM hItem, BOOL bFull);
|
||||
extern LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
|
||||
|
||||
/* framewnd.c */
|
||||
|
@ -120,6 +132,7 @@ extern HWND CreateTreeView(HWND hwndParent, LPTSTR pHostName, UINT id);
|
|||
extern BOOL RefreshTreeView(HWND hWndTV);
|
||||
extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv);
|
||||
extern LPTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey);
|
||||
extern LPWSTR GetItemPathW(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey);
|
||||
extern BOOL DeleteNode(HWND hwndTV, HTREEITEM hItem);
|
||||
extern HTREEITEM InsertNode(HWND hwndTV, HTREEITEM hItem, LPTSTR name);
|
||||
extern HWND StartKeyRename(HWND hwndTV);
|
||||
|
|
|
@ -40,21 +40,10 @@ static const CHAR *reg_class_names[] = {
|
|||
"HKEY_CURRENT_CONFIG", "HKEY_CURRENT_USER", "HKEY_DYN_DATA"
|
||||
};
|
||||
|
||||
static const WCHAR hkey_local_machine[] = {'H','K','E','Y','_','L','O','C','A','L','_','M','A','C','H','I','N','E',0};
|
||||
static const WCHAR hkey_users[] = {'H','K','E','Y','_','U','S','E','R','S',0};
|
||||
static const WCHAR hkey_classes_root[] = {'H','K','E','Y','_','C','L','A','S','S','E','S','_','R','O','O','T',0};
|
||||
static const WCHAR hkey_current_config[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','C','O','N','F','I','G',0};
|
||||
static const WCHAR hkey_current_user[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R',0};
|
||||
static const WCHAR hkey_dyn_data[] = {'H','K','E','Y','_','D','Y','N','_','D','A','T','A',0};
|
||||
|
||||
static const WCHAR *reg_class_namesW[] = {hkey_local_machine, hkey_users,
|
||||
hkey_classes_root, hkey_current_config,
|
||||
hkey_current_user, hkey_dyn_data
|
||||
};
|
||||
|
||||
|
||||
#define REG_CLASS_NUMBER (sizeof(reg_class_names) / sizeof(reg_class_names[0]))
|
||||
|
||||
extern const WCHAR* reg_class_namesW[];
|
||||
|
||||
static HKEY reg_class_keys[REG_CLASS_NUMBER] = {
|
||||
HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CLASSES_ROOT,
|
||||
HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_DYN_DATA
|
||||
|
|
|
@ -91,6 +91,48 @@ static BOOL get_item_path(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPTSTR* pKe
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static BOOL get_item_pathW(HWND hwndTV, HTREEITEM hItem, HKEY* phKey, LPWSTR* pKeyPath, int* pPathLen, int* pMaxChars)
|
||||
{
|
||||
TVITEMW item;
|
||||
int maxChars, chars;
|
||||
LPWSTR newStr;
|
||||
|
||||
item.mask = TVIF_PARAM;
|
||||
item.hItem = hItem;
|
||||
if (!TreeView_GetItem(hwndTV, &item)) return FALSE;
|
||||
|
||||
if (item.lParam) {
|
||||
/* found root key with valid key value */
|
||||
*phKey = (HKEY)item.lParam;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if(!get_item_pathW(hwndTV, TreeView_GetParent(hwndTV, hItem), phKey, pKeyPath, pPathLen, pMaxChars)) return FALSE;
|
||||
if (*pPathLen) {
|
||||
(*pKeyPath)[*pPathLen] = '\\';
|
||||
++(*pPathLen);
|
||||
}
|
||||
|
||||
do {
|
||||
item.mask = TVIF_TEXT;
|
||||
item.hItem = hItem;
|
||||
item.pszText = *pKeyPath + *pPathLen;
|
||||
item.cchTextMax = maxChars = *pMaxChars - *pPathLen;
|
||||
if (!TreeView_GetItemW(hwndTV, &item)) return FALSE;
|
||||
chars = lstrlenW(item.pszText);
|
||||
if (chars < maxChars - 1) {
|
||||
*pPathLen += chars;
|
||||
break;
|
||||
}
|
||||
newStr = HeapReAlloc(GetProcessHeap(), 0, *pKeyPath, *pMaxChars * 2);
|
||||
if (!newStr) return FALSE;
|
||||
*pKeyPath = newStr;
|
||||
*pMaxChars *= 2;
|
||||
} while(TRUE);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LPTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey)
|
||||
{
|
||||
int pathLen = 0, maxLen;
|
||||
|
@ -107,6 +149,23 @@ LPTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey)
|
|||
return pathBuffer;
|
||||
}
|
||||
|
||||
LPWSTR GetItemPathW(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey)
|
||||
{
|
||||
int pathLen = 0, maxLen;
|
||||
WCHAR *pathBuffer;
|
||||
|
||||
pathBuffer = HeapAlloc(GetProcessHeap(), 0, 1024*sizeof(WCHAR));
|
||||
if (!pathBuffer) return NULL;
|
||||
*pathBuffer = 0;
|
||||
maxLen = HeapSize(GetProcessHeap(), 0, pathBuffer);
|
||||
if (maxLen == (SIZE_T) - 1) return NULL;
|
||||
maxLen = maxLen / sizeof(WCHAR);
|
||||
if (!hItem) hItem = TreeView_GetSelection(hwndTV);
|
||||
if (!hItem) return NULL;
|
||||
if (!get_item_pathW(hwndTV, hItem, phRootKey, &pathBuffer, &pathLen, &maxLen)) return NULL;
|
||||
return pathBuffer;
|
||||
}
|
||||
|
||||
static LPTSTR get_path_component(LPCTSTR *lplpKeyName) {
|
||||
LPCTSTR lpPos = *lplpKeyName;
|
||||
LPTSTR lpResult = NULL;
|
||||
|
|
Loading…
Reference in New Issue