display the computer selection dialog for remote registry administration
Modified: trunk/reactos/subsys/system/regedit/Cz.rc
Modified: trunk/reactos/subsys/system/regedit/De.rc
Modified: trunk/reactos/subsys/system/regedit/En.rc
Modified: trunk/reactos/subsys/system/regedit/Es.rc
Modified: trunk/reactos/subsys/system/regedit/Fr.rc
Modified: trunk/reactos/subsys/system/regedit/framewnd.c
Modified: trunk/reactos/subsys/system/regedit/main.c
_____
Modified: trunk/reactos/subsys/system/regedit/Cz.rc
--- trunk/reactos/subsys/system/regedit/Cz.rc 2005-09-29 22:57:42 UTC
(rev 18161)
+++ trunk/reactos/subsys/system/regedit/Cz.rc 2005-09-30 01:26:02 UTC
(rev 18162)
@@ -47,7 +47,7 @@
MENUITEM SEPARATOR
MENUITEM "&P°ipojit sÝØov² registr...",
ID_REGISTRY_CONNECTNETWORKREGISTRY
- , GRAYED
+
MENUITEM "&Odpojit sÝØov² registr...",
ID_REGISTRY_DISCONNECTNETWORKREGISTRY
, GRAYED
_____
Modified: trunk/reactos/subsys/system/regedit/De.rc
--- trunk/reactos/subsys/system/regedit/De.rc 2005-09-29 22:57:42 UTC
(rev 18161)
+++ trunk/reactos/subsys/system/regedit/De.rc 2005-09-30 01:26:02 UTC
(rev 18162)
@@ -47,7 +47,7 @@
MENUITEM SEPARATOR
MENUITEM "&Mit Netzwerkregistry verbinden...",
ID_REGISTRY_CONNECTNETWORKREGISTRY
- , GRAYED
+
MENUITEM "&Von Netzwerkregistry trennen...",
ID_REGISTRY_DISCONNECTNETWORKREGISTRY
, GRAYED
_____
Modified: trunk/reactos/subsys/system/regedit/En.rc
--- trunk/reactos/subsys/system/regedit/En.rc 2005-09-29 22:57:42 UTC
(rev 18161)
+++ trunk/reactos/subsys/system/regedit/En.rc 2005-09-30 01:26:02 UTC
(rev 18162)
@@ -47,7 +47,7 @@
MENUITEM SEPARATOR
MENUITEM "&Connect Network Registry...",
ID_REGISTRY_CONNECTNETWORKREGISTRY
- , GRAYED
+
MENUITEM "&Disconnect Network Registry...",
ID_REGISTRY_DISCONNECTNETWORKREGISTRY
, GRAYED
_____
Modified: trunk/reactos/subsys/system/regedit/Es.rc
--- trunk/reactos/subsys/system/regedit/Es.rc 2005-09-29 22:57:42 UTC
(rev 18161)
+++ trunk/reactos/subsys/system/regedit/Es.rc 2005-09-30 01:26:02 UTC
(rev 18162)
@@ -44,7 +44,7 @@
MENUITEM "&Importar archivo de registro...",
ID_REGISTRY_IMPORTREGISTRYFILE
MENUITEM "&Exportar archivo de registro...",
ID_REGISTRY_EXPORTREGISTRYFILE
MENUITEM SEPARATOR
- MENUITEM "&Conectar registro de red...",
ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED
+ MENUITEM "&Conectar registro de red...",
ID_REGISTRY_CONNECTNETWORKREGISTRY
MENUITEM "&Desconectar registro de red...",
ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED
MENUITEM SEPARATOR
MENUITEM "Im&primir\tCtrl+P", ID_REGISTRY_PRINT,
GRAYED
_____
Modified: trunk/reactos/subsys/system/regedit/Fr.rc
--- trunk/reactos/subsys/system/regedit/Fr.rc 2005-09-29 22:57:42 UTC
(rev 18161)
+++ trunk/reactos/subsys/system/regedit/Fr.rc 2005-09-30 01:26:02 UTC
(rev 18162)
@@ -45,7 +45,7 @@
MENUITEM "&Importer un fichier de registres...",
ID_REGISTRY_IMPORTREGISTRYFILE
MENUITEM "&Exporter un fichier de registres...",
ID_REGISTRY_EXPORTREGISTRYFILE
MENUITEM SEPARATOR
- MENUITEM "&Connecter Ó des registres via le rÚseau...",
ID_REGISTRY_CONNECTNETWORKREGISTRY, GRAYED
+ MENUITEM "&Connecter Ó des registres via le rÚseau...",
ID_REGISTRY_CONNECTNETWORKREGISTRY
MENUITEM "&DÚconnecter de registres rÚseau...",
ID_REGISTRY_DISCONNECTNETWORKREGISTRY, GRAYED
MENUITEM SEPARATOR
MENUITEM "Im&primer\tCtrl+P", ID_REGISTRY_PRINT,
GRAYED
_____
Modified: trunk/reactos/subsys/system/regedit/framewnd.c
--- trunk/reactos/subsys/system/regedit/framewnd.c 2005-09-29
22:57:42 UTC (rev 18161)
+++ trunk/reactos/subsys/system/regedit/framewnd.c 2005-09-30
01:26:02 UTC (rev 18162)
@@ -18,8 +18,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
*/
-#define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from
Windows headers */
-
#include <windows.h>
#include <tchar.h>
#include <commctrl.h>
@@ -28,6 +26,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <shellapi.h>
+#include <objsel.h>
#include "main.h"
#include "regproc.h"
@@ -529,6 +528,129 @@
return TRUE;
}
+static HRESULT
+InitializeRemoteRegistryPicker(OUT IDsObjectPicker **pDsObjectPicker)
+{
+ HRESULT hRet;
+
+ *pDsObjectPicker = NULL;
+
+ hRet = CoCreateInstance(&CLSID_DsObjectPicker,
+ NULL,
+ CLSCTX_INPROC_SERVER,
+ &IID_IDsObjectPicker,
+ (LPVOID*)pDsObjectPicker);
+ if (SUCCEEDED(hRet))
+ {
+ DSOP_INIT_INFO InitInfo;
+ DSOP_SCOPE_INIT_INFO Scopes[] =
+ {
+ {
+ sizeof(DSOP_SCOPE_INIT_INFO),
+ DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE |
DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE |
+ DSOP_SCOPE_TYPE_GLOBAL_CATALOG |
DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN |
+ DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN |
DSOP_SCOPE_TYPE_WORKGROUP |
+ DSOP_SCOPE_TYPE_UPLEVEL_JOINED_DOMAIN |
DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN,
+ 0,
+ {
+ {
+ DSOP_FILTER_COMPUTERS,
+ 0,
+ 0
+ },
+ DSOP_DOWNLEVEL_FILTER_COMPUTERS |
+ DSOP_DOWNLEVEL_FILTER_GLOBAL_GROUPS |
DSOP_DOWNLEVEL_FILTER_ALL_WELLKNOWN_SIDS
+ },
+ NULL,
+ NULL,
+ S_OK
+ },
+ };
+
+ InitInfo.cbSize = sizeof(InitInfo);
+ InitInfo.pwzTargetComputer = NULL;
+ InitInfo.cDsScopeInfos = sizeof(Scopes) / sizeof(Scopes[0]);
+ InitInfo.aDsScopeInfos = Scopes;
+ InitInfo.flOptions = DSOP_SCOPE_TYPE_TARGET_COMPUTER;
+ InitInfo.cAttributesToFetch = 0;
+ InitInfo.apwzAttributeNames = NULL;
+
+ hRet = (*pDsObjectPicker)->lpVtbl->Initialize(*pDsObjectPicker,
+ &InitInfo);
+
+ if (FAILED(hRet))
+ {
+ /* delete the object picker in case initialization failed!
*/
+ (*pDsObjectPicker)->lpVtbl->Release(*pDsObjectPicker);
+ }
+ }
+
+ return hRet;
+}
+
+static HRESULT
+InvokeRemoteRegistryPickerDialog(IN IDsObjectPicker *pDsObjectPicker,
+ IN HWND hwndParent OPTIONAL,
+ OUT LPWSTR lpBuffer,
+ IN UINT uSize)
+{
+ IDataObject *pdo = NULL;
+ HRESULT hRet;
+
+ hRet = pDsObjectPicker->lpVtbl->InvokeDialog(pDsObjectPicker,
+ hwndParent,
+ &pdo);
+ if (hRet == S_OK)
+ {
+ STGMEDIUM stm;
+ FORMATETC fe;
+
+ fe.cfFormat =
RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
+ fe.ptd = NULL;
+ fe.dwAspect = DVASPECT_CONTENT;
+ fe.lindex = -1;
+ fe.tymed = TYMED_HGLOBAL;
+
+ hRet = pdo->lpVtbl->GetData(pdo,
+ &fe,
+ &stm);
+ if (SUCCEEDED(hRet))
+ {
+ PDS_SELECTION_LIST SelectionList =
(PDS_SELECTION_LIST)GlobalLock(stm.hGlobal);
+ if (SelectionList != NULL)
+ {
+ if (SelectionList->cItems == 1)
+ {
+ UINT nlen =
wcslen(SelectionList->aDsSelection[0].pwzName);
+ if (nlen >= uSize)
+ {
+ nlen = uSize - 1;
+ }
+
+ memcpy(lpBuffer,
+ SelectionList->aDsSelection[0].pwzName,
+ nlen * sizeof(WCHAR));
+ lpBuffer[nlen] = L'\0';
+ }
+
+ GlobalUnlock(stm.hGlobal);
+ }
+
+ ReleaseStgMedium(&stm);
+ }
+
+ pdo->lpVtbl->Release(pdo);
+ }
+
+ return hRet;
+}
+
+static VOID
+FreeObjectPicker(IN IDsObjectPicker *pDsObjectPicker)
+{
+ pDsObjectPicker->lpVtbl->Release(pDsObjectPicker);
+}
+
/***********************************************************************
********
*
* FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
@@ -554,7 +676,28 @@
ExportRegistryFile(hWnd);
return TRUE;
case ID_REGISTRY_CONNECTNETWORKREGISTRY:
+ {
+ IDsObjectPicker *ObjectPicker;
+ WCHAR szComputerName[MAX_COMPUTERNAME_LENGTH + 1];
+ HRESULT hRet;
+
+ hRet = InitializeRemoteRegistryPicker(&ObjectPicker);
+ if (SUCCEEDED(hRet))
+ {
+ hRet = InvokeRemoteRegistryPickerDialog(ObjectPicker,
+ hWnd,
+ szComputerName,
+
sizeof(szComputerName) / sizeof(szComputerName[0]));
+ if (hRet == S_OK)
+ {
+ /* FIXME - connect to the registry */
+ }
+
+ FreeObjectPicker(ObjectPicker);
+ }
+
return TRUE;
+ }
case ID_REGISTRY_DISCONNECTNETWORKREGISTRY:
return TRUE;
case ID_REGISTRY_PRINT:
_____
Modified: trunk/reactos/subsys/system/regedit/main.c
--- trunk/reactos/subsys/system/regedit/main.c 2005-09-29 22:57:42 UTC
(rev 18161)
+++ trunk/reactos/subsys/system/regedit/main.c 2005-09-30 01:26:02 UTC
(rev 18162)
@@ -30,6 +30,7 @@
#include <fcntl.h>
#include <aclui.h>
#include <cguid.h>
+#include <objbase.h>
#include "main.h"
#include "hexedit.h"
@@ -189,6 +190,7 @@
{
MSG msg;
HACCEL hAccel;
+ HRESULT hComInit;
/*
int hCrt;
FILE *hf;
@@ -221,6 +223,9 @@
return FALSE;
}
hAccel = LoadAccelerators(hInstance, (LPCTSTR)IDC_REGEDIT);
+
+ /* initialize the COM library for the remote registry object picker
dialog */
+ hComInit = CoInitialize(NULL);
/* Main message loop */
while (GetMessage(&msg, (HWND)NULL, 0, 0)) {
@@ -230,6 +235,12 @@
DispatchMessage(&msg);
}
}
+
+ if (SUCCEEDED(hComInit))
+ {
+ CoUninitialize();
+ }
+
ExitInstance(hInstance);
return msg.wParam;
}