From 071b7dae8ae21ae872aceb9549623393f9c438cd Mon Sep 17 00:00:00 2001 From: Zimler Attila Date: Sat, 3 Jan 2004 00:33:56 +0000 Subject: [PATCH] Added support for creating new keys. --- programs/regedit/En.rc | 1 + programs/regedit/edit.c | 34 ++++++++++++++++++++++++++++++++++ programs/regedit/framewnd.c | 3 +++ programs/regedit/main.h | 1 + programs/regedit/resource.h | 1 + 5 files changed, 40 insertions(+) diff --git a/programs/regedit/En.rc b/programs/regedit/En.rc index 6d113ed093a..6e25a501554 100644 --- a/programs/regedit/En.rc +++ b/programs/regedit/En.rc @@ -201,6 +201,7 @@ BEGIN IDS_BAD_VALUE "Can't query value '%s'" IDS_UNSUPPORTED_TYPE "Can't edit keys of this type (%ld)" IDS_TOO_BIG_VALUE "Value is too big (%ld)" + IDS_NEWKEY "New Key" END /*****************************************************************/ diff --git a/programs/regedit/edit.c b/programs/regedit/edit.c index 6b17e3aeb3d..1239d3f0805 100644 --- a/programs/regedit/edit.c +++ b/programs/regedit/edit.c @@ -91,6 +91,40 @@ INT_PTR CALLBACK modify_string_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, L return FALSE; } +BOOL CreateKey(HKEY hKey) +{ + LONG lRet; + HKEY retKey; + TCHAR keyName[32]; + static TCHAR newKey[28] = ""; /* should be max keyName len - 4 */ + HINSTANCE hInstance; + unsigned int keyNum = 1; + + /* If we have illegal parameter return with operation failure */ + if (!hKey) return FALSE; + + /* Load localized "new key" string. -4 is because we need max 4 character + to numbering. */ + if (newKey[0] == 0) { + hInstance = GetModuleHandle(0); + if (!LoadString(hInstance, IDS_NEWKEY, newKey, COUNT_OF(newKey))) + lstrcpy(newKey, "new key"); + } + lstrcpy(keyName, newKey); + + /* try to find out a name for the newly create key. + We try it max 100 times. */ + lRet = RegOpenKey(hKey, keyName, &retKey); + while (lRet == ERROR_SUCCESS && keyNum < 100) { + sprintf(keyName, "%s %u", newKey, ++keyNum); + lRet = RegOpenKey(hKey, keyName, &retKey); + } + if (lRet == ERROR_SUCCESS) return FALSE; + + lRet = RegCreateKey(hKey, keyName, &retKey); + return lRet == ERROR_SUCCESS; +} + BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName) { DWORD valueDataLen; diff --git a/programs/regedit/framewnd.c b/programs/regedit/framewnd.c index 21865f98acc..78c67958c3e 100644 --- a/programs/regedit/framewnd.c +++ b/programs/regedit/framewnd.c @@ -469,6 +469,9 @@ static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case ID_EDIT_COPYKEYNAME: CopyKeyName(hWnd, _T("")); break; + case ID_EDIT_NEW_KEY: + CreateKey(hKey); + break; case ID_REGISTRY_PRINTERSETUP: /*PRINTDLG pd;*/ /*PrintDlg(&pd);*/ diff --git a/programs/regedit/main.h b/programs/regedit/main.h index 1509c4514da..058e78ae8d3 100644 --- a/programs/regedit/main.h +++ b/programs/regedit/main.h @@ -93,6 +93,7 @@ extern BOOL OnTreeExpanding(HWND hWnd, NMTREEVIEW* pnmtv); extern LPCTSTR GetItemPath(HWND hwndTV, HTREEITEM hItem, HKEY* phRootKey); /* edit.c */ +BOOL CreateKey(HKEY hKey); BOOL ModifyValue(HWND hwnd, HKEY hKey, LPCTSTR valueName); #endif /* __MAIN_H__ */ diff --git a/programs/regedit/resource.h b/programs/regedit/resource.h index 06b2de88289..432c24b3224 100644 --- a/programs/regedit/resource.h +++ b/programs/regedit/resource.h @@ -106,6 +106,7 @@ #define IDS_BAD_VALUE 32837 #define IDS_UNSUPPORTED_TYPE 32838 #define IDS_TOO_BIG_VALUE 32839 +#define IDS_NEWKEY 32840 #define IDD_EDIT_STRING 2000 #define IDC_VALUE_NAME 2001