132 lines
4.6 KiB
C++
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);
|
|
}
|
|
}
|
|
|