4 * Copyright (C) 2002 Robert Dickenson <robd@reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 /********************************************************************************
24 * Global and Local Variables:
27 #define FAVORITES_MENU_POSITION 3
29 static TCHAR s_szFavoritesRegKey
[] = _T("Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit\\Favorites");
31 static BOOL bInMenuLoop
= FALSE
; /* Tells us if we are in the menu loop */
33 /*******************************************************************************
34 * Local module support methods
37 static void resize_frame_rect(HWND hWnd
, PRECT prect
)
41 if (IsWindowVisible(hToolBar)) {
42 SendMessage(hToolBar, WM_SIZE, 0, 0);
43 GetClientRect(hToolBar, &rt);
44 prect->top = rt.bottom+3;
45 prect->bottom -= rt.bottom+3;
48 if (IsWindowVisible(hStatusBar
)) {
49 SetupStatusBar(hWnd
, TRUE
);
50 GetClientRect(hStatusBar
, &rt
);
51 prect
->bottom
-= rt
.bottom
;
53 MoveWindow(g_pChildWnd
->hWnd
, prect
->left
, prect
->top
, prect
->right
, prect
->bottom
, TRUE
);
56 static void resize_frame_client(HWND hWnd
)
60 GetClientRect(hWnd
, &rect
);
61 resize_frame_rect(hWnd
, &rect
);
64 /********************************************************************************/
66 static void OnInitMenu(HWND hWnd
)
70 DWORD dwIndex
, cbValueName
, cbValueData
, dwType
;
71 TCHAR szValueName
[256];
72 BYTE abValueData
[256];
73 static int s_nFavoriteMenuSubPos
= -1;
75 BOOL bDisplayedAny
= FALSE
;
77 /* Find Favorites menu and clear it out */
78 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
81 if (s_nFavoriteMenuSubPos
< 0)
83 s_nFavoriteMenuSubPos
= GetMenuItemCount(hMenu
);
87 while(RemoveMenu(hMenu
, s_nFavoriteMenuSubPos
, MF_BYPOSITION
))
91 lResult
= RegOpenKey(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, &hKey
);
92 if (lResult
!= ERROR_SUCCESS
)
98 cbValueName
= sizeof(szValueName
) / sizeof(szValueName
[0]);
99 cbValueData
= sizeof(abValueData
);
100 lResult
= RegEnumValue(hKey
, dwIndex
, szValueName
, &cbValueName
, NULL
, &dwType
, abValueData
, &cbValueData
);
101 if ((lResult
== ERROR_SUCCESS
) && (dwType
== REG_SZ
))
105 AppendMenu(hMenu
, MF_SEPARATOR
, 0, NULL
);
106 bDisplayedAny
= TRUE
;
108 AppendMenu(hMenu
, 0, ID_FAVORITES_MIN
+ GetMenuItemCount(hMenu
), szValueName
);
112 while(lResult
== ERROR_SUCCESS
);
119 static void OnEnterMenuLoop(HWND hWnd
)
122 UNREFERENCED_PARAMETER(hWnd
);
124 /* Update the status bar pane sizes */
126 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
128 SendMessage(hStatusBar
, SB_SETTEXT
, (WPARAM
)0, (LPARAM
)_T(""));
131 static void OnExitMenuLoop(HWND hWnd
)
134 /* Update the status bar pane sizes*/
135 SetupStatusBar(hWnd
, TRUE
);
139 static void OnMenuSelect(HWND hWnd
, UINT nItemID
, UINT nFlags
, HMENU hSysMenu
)
143 _tcscpy(str
, _T(""));
144 if (nFlags
& MF_POPUP
) {
145 if (hSysMenu
!= GetMenu(hWnd
)) {
146 if (nItemID
== 2) nItemID
= 5;
149 if (LoadString(hInst
, nItemID
, str
, 100)) {
150 /* load appropriate string*/
152 /* first newline terminates actual string*/
153 lpsz
= _tcschr(lpsz
, _T('\n'));
157 SendMessage(hStatusBar
, SB_SETTEXT
, 0, (LPARAM
)str
);
160 void SetupStatusBar(HWND hWnd
, BOOL bResize
)
164 GetClientRect(hWnd
, &rc
);
168 SendMessage(hStatusBar
, WM_SIZE
, 0, 0);
169 SendMessage(hStatusBar
, SB_SETPARTS
, 1, (LPARAM
)&nParts
);
172 void UpdateStatusBar(void)
175 ZeroMemory(&nmhdr
, sizeof(NMHDR
));
176 nmhdr
.code
= TVN_SELCHANGED
;
177 SendMessage(g_pChildWnd
->hWnd
, WM_NOTIFY
, (WPARAM
)TREE_WINDOW
, (LPARAM
)&nmhdr
);
180 static void toggle_child(HWND hWnd
, UINT cmd
, HWND hchild
)
182 BOOL vis
= IsWindowVisible(hchild
);
183 HMENU hMenuView
= GetSubMenu(hMenuFrame
, ID_VIEW_MENU
);
185 CheckMenuItem(hMenuView
, cmd
, vis
?MF_BYCOMMAND
:MF_BYCOMMAND
|MF_CHECKED
);
186 ShowWindow(hchild
, vis
?SW_HIDE
:SW_SHOW
);
187 resize_frame_client(hWnd
);
190 static BOOL
CheckCommDlgError(HWND hWnd
)
192 DWORD dwErrorCode
= CommDlgExtendedError();
193 UNREFERENCED_PARAMETER(hWnd
);
194 switch (dwErrorCode
) {
195 case CDERR_DIALOGFAILURE
:
197 case CDERR_FINDRESFAILURE
:
199 case CDERR_NOHINSTANCE
:
201 case CDERR_INITIALIZATION
:
205 case CDERR_LOCKRESFAILURE
:
207 case CDERR_NOTEMPLATE
:
209 case CDERR_LOADRESFAILURE
:
211 case CDERR_STRUCTSIZE
:
213 case CDERR_LOADSTRFAILURE
:
215 case FNERR_BUFFERTOOSMALL
:
217 case CDERR_MEMALLOCFAILURE
:
219 case FNERR_INVALIDFILENAME
:
221 case CDERR_MEMLOCKFAILURE
:
223 case FNERR_SUBCLASSFAILURE
:
231 #define MAX_CUSTOM_FILTER_SIZE 50
232 TCHAR CustomFilterBuffer
[MAX_CUSTOM_FILTER_SIZE
];
233 TCHAR FileNameBuffer
[_MAX_PATH
];
234 TCHAR FileTitleBuffer
[_MAX_PATH
];
240 } FILTERPAIR
, *PFILTERPAIR
;
243 BuildFilterStrings(TCHAR
*Filter
, PFILTERPAIR Pairs
, int PairCount
)
248 for(i
= 0; i
< PairCount
; i
++)
250 c
+= LoadString(hInst
, Pairs
[i
].DisplayID
, &Filter
[c
], 255 * sizeof(TCHAR
));
252 c
+= LoadString(hInst
, Pairs
[i
].FilterID
, &Filter
[c
], 255 * sizeof(TCHAR
));
258 static BOOL
InitOpenFileName(HWND hWnd
, OPENFILENAME
* pofn
)
260 FILTERPAIR FilterPairs
[3];
261 static TCHAR Filter
[1024];
263 memset(pofn
, 0, sizeof(OPENFILENAME
));
264 pofn
->lStructSize
= sizeof(OPENFILENAME
);
265 pofn
->hwndOwner
= hWnd
;
266 pofn
->hInstance
= hInst
;
268 /* create filter string */
269 FilterPairs
[0].DisplayID
= IDS_FLT_REGFILES
;
270 FilterPairs
[0].FilterID
= IDS_FLT_REGFILES_FLT
;
271 FilterPairs
[1].DisplayID
= IDS_FLT_REGEDIT4
;
272 FilterPairs
[1].FilterID
= IDS_FLT_REGEDIT4_FLT
;
273 FilterPairs
[2].DisplayID
= IDS_FLT_ALLFILES
;
274 FilterPairs
[2].FilterID
= IDS_FLT_ALLFILES_FLT
;
275 BuildFilterStrings(Filter
, FilterPairs
, sizeof(FilterPairs
) / sizeof(FILTERPAIR
));
277 pofn
->lpstrFilter
= Filter
;
278 pofn
->lpstrCustomFilter
= CustomFilterBuffer
;
279 pofn
->nMaxCustFilter
= MAX_CUSTOM_FILTER_SIZE
;
280 pofn
->nFilterIndex
= 0;
281 pofn
->lpstrFile
= FileNameBuffer
;
282 pofn
->nMaxFile
= _MAX_PATH
;
283 pofn
->lpstrFileTitle
= FileTitleBuffer
;
284 pofn
->nMaxFileTitle
= _MAX_PATH
;
285 /* pofn->lpstrInitialDir = _T("");*/
286 /* pofn->lpstrTitle = _T("Import Registry File");*/
287 /* pofn->Flags = OFN_ENABLETEMPLATE + OFN_EXPLORER + OFN_ENABLESIZING;*/
288 pofn
->Flags
= OFN_HIDEREADONLY
;
289 /* pofn->nFileOffset = ;*/
290 /* pofn->nFileExtension = ;*/
291 /* pofn->lpstrDefExt = _T("");*/
292 /* pofn->lCustData = ;*/
293 /* pofn->lpfnHook = ImportRegistryFile_OFNHookProc;*/
294 /* pofn->lpTemplateName = _T("ID_DLG_IMPORT_REGFILE");*/
295 /* pofn->lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);*/
296 /* pofn->FlagsEx = ;*/
300 static BOOL
ImportRegistryFile(HWND hWnd
)
305 InitOpenFileName(hWnd
, &ofn
);
306 LoadString(hInst
, IDS_IMPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
307 ofn
.lpstrTitle
= Caption
;
308 /* ofn.lCustData = ;*/
309 if (GetOpenFileName(&ofn
)) {
310 /* FIXME - convert to ascii */
311 if (!import_registry_file(ofn
.lpstrFile
)) {
312 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
316 get_file_name(&s
, filename
, MAX_PATH
);
318 printf("No file name is specified\n%s", usage
);
322 while (filename
[0]) {
323 if (!import_registry_file(filename
)) {
325 printf("Can't open file \"%s\"\n", filename
);
329 get_file_name(&s
, filename
, MAX_PATH
);
334 CheckCommDlgError(hWnd
);
340 static UINT_PTR CALLBACK
ExportRegistryFile_OFNHookProc(HWND hdlg
, UINT uiMsg
, WPARAM wParam
, LPARAM lParam
)
343 HWND hwndExportBranch
;
344 HWND hwndExportBranchText
;
345 UINT_PTR iResult
= 0;
347 LPTSTR pszSelectedKey
;
348 OFNOTIFY
*pOfnNotify
;
350 UNREFERENCED_PARAMETER(wParam
);
354 pOfn
= (OPENFILENAME
*) lParam
;
355 pszSelectedKey
= (LPTSTR
) pOfn
->lCustData
;
357 hwndExportAll
= GetDlgItem(hdlg
, IDC_EXPORT_ALL
);
359 SendMessage(hwndExportAll
, BM_SETCHECK
, pszSelectedKey
[0] ? BST_UNCHECKED
: BST_CHECKED
, 0);
361 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
362 if (hwndExportBranch
)
363 SendMessage(hwndExportBranch
, BM_SETCHECK
, pszSelectedKey
[0] ? BST_CHECKED
: BST_UNCHECKED
, 0);
365 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
366 if (hwndExportBranchText
)
367 SetWindowText(hwndExportBranchText
, pszSelectedKey
);
371 if (((NMHDR
*) lParam
)->code
== CDN_FILEOK
)
373 pOfnNotify
= (OFNOTIFY
*) lParam
;
374 pszSelectedKey
= (LPTSTR
) pOfnNotify
->lpOFN
->lCustData
;
376 hwndExportBranch
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH
);
377 hwndExportBranchText
= GetDlgItem(hdlg
, IDC_EXPORT_BRANCH_TEXT
);
378 if (hwndExportBranch
&& hwndExportBranchText
379 && (SendMessage(hwndExportBranch
, BM_GETCHECK
, 0, 0) == BST_CHECKED
))
381 GetWindowText(hwndExportBranchText
, pszSelectedKey
, _MAX_PATH
);
385 pszSelectedKey
[0] = '\0';
393 BOOL
ExportRegistryFile(HWND hWnd
)
396 TCHAR ExportKeyPath
[_MAX_PATH
];
401 /* Figure out which key path we are exporting */
402 pszKeyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
403 RegKeyGetName(ExportKeyPath
, sizeof(ExportKeyPath
) / sizeof(ExportKeyPath
[0]),
404 hKeyRoot
, pszKeyPath
);
406 InitOpenFileName(hWnd
, &ofn
);
407 LoadString(hInst
, IDS_EXPORT_REG_FILE
, Caption
, sizeof(Caption
)/sizeof(TCHAR
));
408 ofn
.lpstrTitle
= Caption
;
409 ofn
.lCustData
= (LPARAM
) ExportKeyPath
;
410 ofn
.Flags
= OFN_ENABLETEMPLATE
| OFN_EXPLORER
| OFN_ENABLEHOOK
;
411 ofn
.lpfnHook
= ExportRegistryFile_OFNHookProc
;
412 ofn
.lpTemplateName
= MAKEINTRESOURCE(IDD_EXPORTRANGE
);
413 if (GetSaveFileName(&ofn
)) {
415 LPSTR pszExportKeyPath
;
417 CHAR buffer
[_MAX_PATH
];
419 WideCharToMultiByte(CP_ACP
, 0, ExportKeyPath
, -1, buffer
, sizeof(buffer
), NULL
, NULL
);
420 pszExportKeyPath
= buffer
;
422 pszExportKeyPath
= ExportKeyPath
;
425 result
= export_registry_key(ofn
.lpstrFile
, pszExportKeyPath
);
427 /*printf("Can't open file \"%s\"\n", ofn.lpstrFile);*/
431 TCHAR filename
[MAX_PATH
];
433 get_file_name(&s
, filename
, MAX_PATH
);
435 printf("No file name is specified\n%s", usage
);
440 TCHAR reg_key_name
[KEY_MAX_LEN
];
441 get_file_name(&s
, reg_key_name
, KEY_MAX_LEN
);
442 export_registry_key((CHAR
)filename
, reg_key_name
);
444 export_registry_key(filename
, NULL
);
449 CheckCommDlgError(hWnd
);
454 BOOL
PrintRegistryHive(HWND hWnd
, LPTSTR path
)
458 UNREFERENCED_PARAMETER(path
);
460 ZeroMemory(&pd
, sizeof(PRINTDLG
));
461 pd
.lStructSize
= sizeof(PRINTDLG
);
463 pd
.hDevMode
= NULL
; /* Don't forget to free or store hDevMode*/
464 pd
.hDevNames
= NULL
; /* Don't forget to free or store hDevNames*/
465 pd
.Flags
= PD_USEDEVMODECOPIESANDCOLLATE
| PD_RETURNDC
;
467 pd
.nFromPage
= 0xFFFF;
470 pd
.nMaxPage
= 0xFFFF;
472 /* GDI calls to render output. */
473 DeleteDC(pd
.hDC
); /* Delete DC when done.*/
479 hResult
= PrintDlgEx(&pd
);
480 if (hResult
== S_OK
) {
481 switch (pd
.dwResultAction
) {
482 case PD_RESULT_APPLY
:
483 /*The user clicked the Apply button and later clicked the Cancel button. This indicates that the user wants to apply the changes made in the property sheet, but does not yet want to print. The PRINTDLGEX structure contains the information specified by the user at the time the Apply button was clicked. */
485 case PD_RESULT_CANCEL
:
486 /*The user clicked the Cancel button. The information in the PRINTDLGEX structure is unchanged. */
488 case PD_RESULT_PRINT
:
489 /*The user clicked the Print button. The PRINTDLGEX structure contains the information specified by the user. */
497 /*Insufficient memory. */
500 /* One or more arguments are invalid. */
503 /*Invalid pointer. */
509 /*Unspecified error. */
520 static void ChooseFavorite(LPCTSTR pszFavorite
)
523 TCHAR szFavoritePath
[512];
524 DWORD cbData
, dwType
;
526 if (RegOpenKeyEx(HKEY_CURRENT_USER
, s_szFavoritesRegKey
, 0, KEY_QUERY_VALUE
, &hKey
) != ERROR_SUCCESS
)
529 cbData
= (sizeof(szFavoritePath
) / sizeof(szFavoritePath
[0])) - 1;
530 memset(szFavoritePath
, 0, sizeof(szFavoritePath
));
531 if (RegQueryValueEx(hKey
, pszFavorite
, NULL
, &dwType
, (LPBYTE
) szFavoritePath
, &cbData
) != ERROR_SUCCESS
)
534 if (dwType
== REG_SZ
)
535 SelectNode(g_pChildWnd
->hTreeWnd
, szFavoritePath
);
542 BOOL
CopyKeyName(HWND hWnd
, HKEY hRootKey
, LPCTSTR keyName
)
544 BOOL bClipboardOpened
= FALSE
;
545 BOOL bSuccess
= FALSE
;
550 if (!OpenClipboard(hWnd
))
552 bClipboardOpened
= TRUE
;
554 if (!EmptyClipboard())
557 if (!RegKeyGetName(szBuffer
, sizeof(szBuffer
) / sizeof(szBuffer
[0]), hRootKey
, keyName
))
560 hGlobal
= GlobalAlloc(GMEM_MOVEABLE
, (_tcslen(szBuffer
) + 1) * sizeof(TCHAR
));
564 s
= GlobalLock(hGlobal
);
565 _tcscpy(s
, szBuffer
);
566 GlobalUnlock(hGlobal
);
569 SetClipboardData(CF_UNICODETEXT
, hGlobal
);
571 SetClipboardData(CF_TEXT
, hGlobal
);
576 if (bClipboardOpened
)
581 static BOOL
CreateNewValue(HKEY hRootKey
, LPCTSTR pszKeyPath
, DWORD dwType
)
583 TCHAR szNewValueFormat
[128];
584 TCHAR szNewValue
[128];
587 DWORD dwExistingType
, cbData
;
592 if (RegOpenKey(hRootKey
, pszKeyPath
, &hKey
) != ERROR_SUCCESS
)
595 LoadString(hInst
, IDS_NEW_VALUE
, szNewValueFormat
, sizeof(szNewValueFormat
)
596 / sizeof(szNewValueFormat
[0]));
600 _sntprintf(szNewValue
, sizeof(szNewValue
) / sizeof(szNewValue
[0]),
601 szNewValueFormat
, iIndex
++);
603 cbData
= sizeof(data
);
604 lResult
= RegQueryValueEx(hKey
, szNewValue
, NULL
, &dwExistingType
, data
, &cbData
);
606 while(lResult
== ERROR_SUCCESS
);
610 cbData
= sizeof(DWORD
);
614 cbData
= sizeof(TCHAR
);
617 cbData
= sizeof(TCHAR
) * 2;
620 cbData
= sizeof(DWORD
) * 2;
626 memset(data
, 0, cbData
);
627 lResult
= RegSetValueEx(hKey
, szNewValue
, 0, dwType
, data
, cbData
);
628 if (lResult
!= ERROR_SUCCESS
)
631 RefreshListView(g_pChildWnd
->hListWnd
, hRootKey
, pszKeyPath
);
633 /* locate the newly added value, and get ready to rename it */
634 memset(&lvfi
, 0, sizeof(lvfi
));
635 lvfi
.flags
= LVFI_STRING
;
636 lvfi
.psz
= szNewValue
;
637 iIndex
= ListView_FindItem(g_pChildWnd
->hListWnd
, -1, &lvfi
);
639 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, iIndex
);
645 InitializeRemoteRegistryPicker(OUT IDsObjectPicker
**pDsObjectPicker
)
649 *pDsObjectPicker
= NULL
;
651 hRet
= CoCreateInstance(&CLSID_DsObjectPicker
,
653 CLSCTX_INPROC_SERVER
,
654 &IID_IDsObjectPicker
,
655 (LPVOID
*)pDsObjectPicker
);
658 DSOP_INIT_INFO InitInfo
;
659 static DSOP_SCOPE_INIT_INFO Scopes
[] =
662 sizeof(DSOP_SCOPE_INIT_INFO
),
663 DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE
| DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE
|
664 DSOP_SCOPE_TYPE_GLOBAL_CATALOG
| DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN
|
665 DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN
| DSOP_SCOPE_TYPE_WORKGROUP
|
666 DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN
| DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN
,
670 DSOP_FILTER_COMPUTERS
,
674 DSOP_DOWNLEVEL_FILTER_COMPUTERS
682 InitInfo
.cbSize
= sizeof(InitInfo
);
683 InitInfo
.pwzTargetComputer
= NULL
;
684 InitInfo
.cDsScopeInfos
= sizeof(Scopes
) / sizeof(Scopes
[0]);
685 InitInfo
.aDsScopeInfos
= Scopes
;
686 InitInfo
.flOptions
= 0;
687 InitInfo
.cAttributesToFetch
= 0;
688 InitInfo
.apwzAttributeNames
= NULL
;
690 hRet
= (*pDsObjectPicker
)->lpVtbl
->Initialize(*pDsObjectPicker
,
695 /* delete the object picker in case initialization failed! */
696 (*pDsObjectPicker
)->lpVtbl
->Release(*pDsObjectPicker
);
704 InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker
*pDsObjectPicker
,
705 IN HWND hwndParent OPTIONAL
,
709 IDataObject
*pdo
= NULL
;
712 hRet
= pDsObjectPicker
->lpVtbl
->InvokeDialog(pDsObjectPicker
,
720 fe
.cfFormat
= (CLIPFORMAT
) RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST
);
722 fe
.dwAspect
= DVASPECT_CONTENT
;
724 fe
.tymed
= TYMED_HGLOBAL
;
726 hRet
= pdo
->lpVtbl
->GetData(pdo
,
731 PDS_SELECTION_LIST SelectionList
= (PDS_SELECTION_LIST
)GlobalLock(stm
.hGlobal
);
732 if (SelectionList
!= NULL
)
734 if (SelectionList
->cItems
== 1)
736 size_t nlen
= wcslen(SelectionList
->aDsSelection
[0].pwzName
);
743 SelectionList
->aDsSelection
[0].pwzName
,
744 nlen
* sizeof(WCHAR
));
746 WideCharToMultiByte(CP_ACP
,
748 SelectionList
->aDsSelection
[0].pwzName
,
755 lpBuffer
[nlen
] = L
'\0';
758 GlobalUnlock(stm
.hGlobal
);
761 ReleaseStgMedium(&stm
);
764 pdo
->lpVtbl
->Release(pdo
);
771 FreeObjectPicker(IN IDsObjectPicker
*pDsObjectPicker
)
773 pDsObjectPicker
->lpVtbl
->Release(pDsObjectPicker
);
776 /*******************************************************************************
778 * FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
780 * PURPOSE: Processes WM_COMMAND messages for the main frame window.
783 static BOOL
_CmdWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
785 HKEY hKeyRoot
= 0, hKey
= 0;
789 REGSAM regsam
= KEY_READ
;
793 UNREFERENCED_PARAMETER(lParam
);
794 UNREFERENCED_PARAMETER(message
);
796 switch (LOWORD(wParam
)) {
797 case ID_REGISTRY_IMPORTREGISTRYFILE
:
798 ImportRegistryFile(hWnd
);
800 case ID_REGISTRY_EXPORTREGISTRYFILE
:
801 ExportRegistryFile(hWnd
);
803 case ID_REGISTRY_CONNECTNETWORKREGISTRY
:
805 IDsObjectPicker
*ObjectPicker
;
806 TCHAR szComputerName
[MAX_COMPUTERNAME_LENGTH
+ 1];
809 hRet
= CoInitialize(NULL
);
812 hRet
= InitializeRemoteRegistryPicker(&ObjectPicker
);
815 hRet
= InvokeRemoteRegistryPickerDialog(ObjectPicker
,
818 sizeof(szComputerName
) / sizeof(szComputerName
[0]));
821 /* FIXME - connect to the registry */
824 FreeObjectPicker(ObjectPicker
);
832 case ID_REGISTRY_DISCONNECTNETWORKREGISTRY
:
834 case ID_REGISTRY_PRINT
:
835 PrintRegistryHive(hWnd
, _T(""));
837 case ID_REGISTRY_EXIT
:
840 case ID_VIEW_STATUSBAR
:
841 toggle_child(hWnd
, LOWORD(wParam
), hStatusBar
);
843 case ID_HELP_HELPTOPICS
:
844 WinHelp(hWnd
, _T("regedit"), HELP_FINDER
, 0);
853 GetClientRect(g_pChildWnd
->hWnd
, &rt
);
854 pt
.x
= rt
.left
+ g_pChildWnd
->nSplitPos
;
855 pt
.y
= (rt
.bottom
/ 2);
857 if(ClientToScreen(g_pChildWnd
->hWnd
, &pts
))
859 SetCursorPos(pts
.x
, pts
.y
);
860 SetCursor(LoadCursor(0, IDC_SIZEWE
));
861 SendMessage(g_pChildWnd
->hWnd
, WM_LBUTTONDOWN
, 0, MAKELPARAM(pt
.x
, pt
.y
));
867 case ID_EDIT_MODIFY_BIN
:
873 keyPath
= GetItemPath(g_pChildWnd
->hTreeWnd
, 0, &hKeyRoot
);
874 valueName
= GetValueName(g_pChildWnd
->hListWnd
, -1);
876 lRet
= RegOpenKeyEx(hKeyRoot
, keyPath
, 0, regsam
, &hKey
);
877 if (lRet
!= ERROR_SUCCESS
) hKey
= 0;
880 switch (LOWORD(wParam
)) {
882 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, FALSE
))
883 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
885 case ID_EDIT_MODIFY_BIN
:
886 if (valueName
&& ModifyValue(hWnd
, hKey
, valueName
, TRUE
))
887 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
890 if (GetFocus() == g_pChildWnd
->hListWnd
)
892 if(ListView_GetSelectedCount(g_pChildWnd
->hListWnd
) == 1)
894 item
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, -1, LVNI_SELECTED
);
897 (void)ListView_EditLabel(g_pChildWnd
->hListWnd
, item
);
901 if (GetFocus() == g_pChildWnd
->hTreeWnd
)
903 /* Get focused entry of treeview (if any) */
904 HTREEITEM hItem
= TreeView_GetSelection(g_pChildWnd
->hTreeWnd
);
906 (void)TreeView_EditLabel(g_pChildWnd
->hTreeWnd
, hItem
);
911 if (GetFocus() == g_pChildWnd
->hListWnd
)
913 UINT nSelected
= ListView_GetSelectedCount(g_pChildWnd
->hListWnd
);
916 TCHAR msg
[128], caption
[128];
917 LoadString(hInst
, IDS_QUERY_DELETE_CONFIRM
, caption
, sizeof(caption
)/sizeof(TCHAR
));
918 LoadString(hInst
, (nSelected
== 1 ? IDS_QUERY_DELETE_ONE
: IDS_QUERY_DELETE_MORE
), msg
, sizeof(msg
)/sizeof(TCHAR
));
919 if(MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONQUESTION
| MB_YESNO
) == IDYES
)
925 while((ni
= ListView_GetNextItem(g_pChildWnd
->hListWnd
, item
, LVNI_SELECTED
)) > -1)
927 valueName
= GetValueName(g_pChildWnd
->hListWnd
, item
);
928 if(RegDeleteValue(hKey
, valueName
) != ERROR_SUCCESS
)
935 RefreshListView(g_pChildWnd
->hListWnd
, hKeyRoot
, keyPath
);
938 LoadString(hInst
, IDS_ERR_DELVAL_CAPTION
, caption
, sizeof(caption
)/sizeof(TCHAR
));
939 LoadString(hInst
, IDS_ERR_DELETEVALUE
, msg
, sizeof(msg
)/sizeof(TCHAR
));
940 MessageBox(g_pChildWnd
->hWnd
, msg
, caption
, MB_ICONSTOP
);
945 if (GetFocus() == g_pChildWnd
->hTreeWnd
)
947 if (keyPath
== 0 || *keyPath
== 0)
949 MessageBeep(MB_ICONHAND
);
951 if (DeleteKey(hWnd
, hKeyRoot
, keyPath
))
952 DeleteNode(g_pChildWnd
->hTreeWnd
, 0);
955 case ID_EDIT_NEW_STRINGVALUE
:
956 CreateNewValue(hKeyRoot
, keyPath
, REG_SZ
);
958 case ID_EDIT_NEW_BINARYVALUE
:
959 CreateNewValue(hKeyRoot
, keyPath
, REG_BINARY
);
961 case ID_EDIT_NEW_DWORDVALUE
:
962 CreateNewValue(hKeyRoot
, keyPath
, REG_DWORD
);
964 case ID_EDIT_NEW_MULTISTRINGVALUE
:
965 CreateNewValue(hKeyRoot
, keyPath
, REG_MULTI_SZ
);
967 case ID_EDIT_NEW_EXPANDABLESTRINGVALUE
:
968 CreateNewValue(hKeyRoot
, keyPath
, REG_EXPAND_SZ
);
975 case ID_EDIT_FINDNEXT
:
978 case ID_EDIT_COPYKEYNAME
:
979 CopyKeyName(hWnd
, hKeyRoot
, keyPath
);
981 case ID_EDIT_PERMISSIONS
:
982 RegKeyEditPermissions(hWnd
, hKeyRoot
, NULL
, keyPath
);
984 case ID_REGISTRY_PRINTERSETUP
:
987 /*PAGESETUPDLG psd;*/
988 /*PageSetupDlg(&psd);*/
990 case ID_REGISTRY_OPENLOCAL
:
993 case ID_VIEW_REFRESH
:
994 RefreshTreeView(g_pChildWnd
->hTreeWnd
);
995 /*RefreshListView(g_pChildWnd->hListWnd, hKeyRoot, keyPath, NULL); */
997 /*case ID_OPTIONS_TOOLBAR:*/
998 /* toggle_child(hWnd, LOWORD(wParam), hToolBar);*/
1000 case ID_EDIT_NEW_KEY
:
1001 CreateNewKey(g_pChildWnd
->hTreeWnd
, TreeView_GetSelection(g_pChildWnd
->hTreeWnd
));
1004 if ((LOWORD(wParam
) >= ID_FAVORITES_MIN
) && (LOWORD(wParam
) <= ID_FAVORITES_MAX
))
1008 TCHAR szFavorite
[512];
1010 hMenu
= GetSubMenu(GetMenu(hWnd
), FAVORITES_MENU_POSITION
);
1012 memset(&mii
, 0, sizeof(mii
));
1013 mii
.cbSize
= sizeof(mii
);
1014 mii
.fMask
= MIIM_TYPE
;
1015 mii
.fType
= MFT_STRING
;
1016 mii
.dwTypeData
= szFavorite
;
1017 mii
.cch
= sizeof(szFavorite
) / sizeof(szFavorite
[0]);
1019 if (GetMenuItemInfo(hMenu
, LOWORD(wParam
) - ID_FAVORITES_MIN
, TRUE
, &mii
))
1021 ChooseFavorite(szFavorite
);
1036 /********************************************************************************
1038 * FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
1040 * PURPOSE: Processes messages for the main frame window.
1042 * WM_COMMAND - process the application menu
1043 * WM_DESTROY - post a quit message and return
1047 LRESULT CALLBACK
FrameWndProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
1051 CreateWindowEx(0, szChildClass
, NULL
, WS_CHILD
| WS_VISIBLE
,
1052 CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
, CW_USEDEFAULT
,
1053 hWnd
, (HMENU
)0, hInst
, 0);
1056 if (!_CmdWndProc(hWnd
, message
, wParam
, lParam
))
1057 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
1061 SetFocus(g_pChildWnd
->hWnd
);
1064 resize_frame_client(hWnd
);
1071 case WM_ENTERMENULOOP
:
1072 OnEnterMenuLoop(hWnd
);
1074 case WM_EXITMENULOOP
:
1075 OnExitMenuLoop(hWnd
);
1078 OnMenuSelect(hWnd
, LOWORD(wParam
), HIWORD(wParam
), (HMENU
)lParam
);
1081 WinHelp(hWnd
, _T("regedit"), HELP_QUIT
, 0);
1084 return DefWindowProc(hWnd
, message
, wParam
, lParam
);