windows-nt/Source/XPSP1/NT/base/fs/utils/regedit/regobjpkr.cpp
2020-09-26 16:20:57 +08:00

132 lines
4.6 KiB
C++

//------------------------------------------------------------------------
//
// Microsoft Windows Shell
// Copyright (C) Microsoft Corporation, 2000
//
// File: regobjpkr.cpp
//
// Contents: The implementation of the object picker for regedit
//
// Classes: none
//
//------------------------------------------------------------------------
#include <accctrl.h>
#include <objsel.h>
#include <TCHAR.h>
extern "C" HRESULT SelectComputer(HWND hWnd, LPTSTR pszRemoteName, int cchMax);
HRESULT InitObjectPicker(IDsObjectPicker *pDsObjectPicker);
void GetNameFromObject(IDataObject *pdo, LPTSTR pszName, int cchMax);
//------------------------------------------------------------------------------
// SelectComputer
//
// DESCRIPTION: Invokes the Object Picker and returns computer name
//
// PARAMETERS: hWnd - handle to parent window
// pszRemoteName[OUT] - LPTSTR
//------------------------------------------------------------------------------
HRESULT SelectComputer(HWND hWnd, LPTSTR pszRemoteName, int cchMax)
{
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (SUCCEEDED(hr))
{
IDsObjectPicker *pDsObjectPicker = NULL;
hr = CoCreateInstance(CLSID_DsObjectPicker, NULL, CLSCTX_INPROC_SERVER,
IID_IDsObjectPicker, (LPVOID*) &pDsObjectPicker);
if (SUCCEEDED(hr))
{
hr = InitObjectPicker(pDsObjectPicker);
if (SUCCEEDED(hr))
{
IDataObject *pdo = NULL;
if (pDsObjectPicker->InvokeDialog(hWnd, &pdo) == S_OK)
{
GetNameFromObject(pdo, pszRemoteName, cchMax);
pdo->Release();
hr = S_OK;
}
else
{
hr = E_FAIL;
}
}
pDsObjectPicker->Release();
}
CoUninitialize();
}
return hr;
}
//------------------------------------------------------------------------------
// InitObjectPicker
//
// DESCRIPTION: Initializes the InitObjectPicker
//
// PARAMETERS: pDsObjectPicker - pointer to object picker obj.
//------------------------------------------------------------------------------
HRESULT InitObjectPicker(IDsObjectPicker *pDsObjectPicker)
{
DSOP_SCOPE_INIT_INFO aScopeInit = {0};
DSOP_INIT_INFO InitInfo = {0};
// Initialize the DSOP_SCOPE_INIT_INFO structure.
aScopeInit.cbSize = sizeof(DSOP_SCOPE_INIT_INFO);
aScopeInit.flType = DSOP_SCOPE_TYPE_DOWNLEVEL_JOINED_DOMAIN |
DSOP_SCOPE_TYPE_WORKGROUP |
DSOP_SCOPE_TYPE_EXTERNAL_DOWNLEVEL_DOMAIN |
DSOP_SCOPE_TYPE_EXTERNAL_UPLEVEL_DOMAIN |
DSOP_SCOPE_TYPE_GLOBAL_CATALOG |
DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN |
DSOP_SCOPE_TYPE_USER_ENTERED_UPLEVEL_SCOPE |
DSOP_SCOPE_TYPE_USER_ENTERED_DOWNLEVEL_SCOPE;
aScopeInit.FilterFlags.Uplevel.flBothModes = DSOP_FILTER_COMPUTERS;
aScopeInit.FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_COMPUTERS;
// Initialize the DSOP_INIT_INFO structure.
InitInfo.cbSize = sizeof(InitInfo);
InitInfo.pwzTargetComputer = NULL; // Target is the local computer.
InitInfo.cDsScopeInfos = 1;
InitInfo.aDsScopeInfos = &aScopeInit;
return pDsObjectPicker->Initialize(&InitInfo);
}
//------------------------------------------------------------------------------
// GetNameFromObject
//
// DESCRIPTION: Revieves the name of an object
//
// PARAMETERS: IDataObject - data object
// pszName[OUT] - LPTSTR
//------------------------------------------------------------------------------
void GetNameFromObject(IDataObject *pdo, LPTSTR pszName, int cchMax)
{
PDS_SELECTION_LIST pDsSelList = NULL;
STGMEDIUM stgmedium = {TYMED_HGLOBAL, NULL, NULL};
CLIPFORMAT cfDsObjectPicker = (CLIPFORMAT) RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST);
FORMATETC formatetc = {cfDsObjectPicker, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
// Get the global memory block containing the user's selections.
if (SUCCEEDED(pdo->GetData(&formatetc, &stgmedium)))
{
// Retrieve pointer to DS_SELECTION_LIST structure.
pDsSelList = (PDS_SELECTION_LIST) GlobalLock(stgmedium.hGlobal);
if (pDsSelList)
{
_tcsncpy(pszName, pDsSelList->aDsSelection[0].pwzName, cchMax);
GlobalUnlock(stgmedium.hGlobal);
}
ReleaseStgMedium(&stgmedium);
}
}