2025-11-28 00:35:46 +09:00

344 lines
7.5 KiB
C++

//----------------------------------------------------------------------------
//
// Microsoft Active Directory 2.5 Sample Code
//
// Copyright (C) Microsoft Corporation, 1996 - 2000
//
// File: ADQIDlg.cpp
//
// Contents: Main ADQI User Interface Implementation
//
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "ADQI.h"
#include "ADQIDlg.h"
#include "lmcons.h"
#include "ads.h"
#include "adscontainer.h"
#include "directorysearch.h"
#include "directoryobject.h"
#include "adspropertylist.h"
#include "adsopendsobject.h"
#include "adslargeinteger.h"
#include "security.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
DECLAREADSPROC(IADs)
DECLAREADSPROC(IADsContainer)
DECLAREADSPROC(IDirectorySearch)
DECLAREADSPROC(IDirectoryObject)
DECLAREADSPROC(IADsPropertyList)
DECLAREADSPROC(IADsSecurityDescriptor)
DECLAREADSPROC(IADsLargeInteger)
ADSIIF adsiIfs[] = {
MAKEADSENTRY(IADs), DlgProcIADs,
MAKEADSENTRY(IADsContainer), DlgProcIADsContainer,
MAKEADSENTRY(IADsCollection), NULL,
MAKEADSENTRY(IADsMembers), NULL,
MAKEADSENTRY(IADsPropertyList), DlgProcIADsPropertyList,
MAKEADSENTRY(IADsPropertyEntry), NULL,
MAKEADSENTRY(IADsPropertyValue), NULL,
MAKEADSENTRY(IADsExtension), NULL,
MAKEADSENTRY(IADsNamespaces), NULL,
MAKEADSENTRY(IADsClass), NULL,
MAKEADSENTRY(IADsProperty), NULL,
MAKEADSENTRY(IADsSyntax), NULL,
MAKEADSENTRY(IADsLocality), NULL,
MAKEADSENTRY(IADsO), NULL,
MAKEADSENTRY(IADsOU), NULL,
MAKEADSENTRY(IADsDomain), NULL,
MAKEADSENTRY(IADsComputer), NULL,
MAKEADSENTRY(IADsComputerOperations), NULL,
MAKEADSENTRY(IADsGroup), NULL,
MAKEADSENTRY(IADsUser), NULL,
MAKEADSENTRY(IADsPrintQueue), NULL,
MAKEADSENTRY(IADsPrintQueueOperations), NULL,
MAKEADSENTRY(IADsPrintJob), NULL,
MAKEADSENTRY(IADsPrintJobOperations), NULL,
MAKEADSENTRY(IADsService), NULL,
MAKEADSENTRY(IADsServiceOperations), NULL,
MAKEADSENTRY(IADsFileService), NULL,
MAKEADSENTRY(IADsFileServiceOperations), NULL,
MAKEADSENTRY(IADsFileShare), NULL,
MAKEADSENTRY(IADsSession), NULL,
MAKEADSENTRY(IADsResource), NULL,
MAKEADSENTRY(IADsOpenDSObject), DlgProcIADsOpenDSObject,
MAKEADSENTRY(IDirectoryObject), DlgProcIDirectoryObject,
MAKEADSENTRY(IDirectorySearch), DlgProcIDirectorySearch,
MAKEADSENTRY(IADsAccessControlEntry), NULL,
MAKEADSENTRY(IADsSecurityDescriptor), DlgProcIADsSecurityDescriptor,
MAKEADSENTRY(IADsLargeInteger), DlgProcIADsLargeInteger,
MAKEADSENTRY(IADsObjectOptions), NULL,
MAKEADSENTRY(IADsPropertyValue2), NULL,
//The following interfaces is CoCreateable, not living off on any object,
//so we comment this out, because QI won't return any of these interfaces
// MAKEADSENTRY(IADsPathname), NULL,
// MAKEADSENTRY(IADsNameTranslate), NULL,
MAKEADSENTRY(NULL), NULL
};
/////////////////////////////////////////////////////////////////////////////
// CADQIDlg dialog
CADQIDlg::CADQIDlg(CWnd* pParent /*=NULL*/)
: CDialog(CADQIDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CADQIDlg)
m_sADsPath = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pUnk = NULL;
}
void CADQIDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CADQIDlg)
DDX_Control(pDX, IDC_INTERFACES, m_cListIf);
DDX_Control(pDX, IDOK, m_cOK);
DDX_Control(pDX, IDC_ADSPATH, m_cADsPath);
DDX_Text(pDX, IDC_ADSPATH, m_sADsPath);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CADQIDlg, CDialog)
//{{AFX_MSG_MAP(CADQIDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_EN_CHANGE(IDC_ADSPATH, OnChangeADsPath)
ON_LBN_DBLCLK(IDC_INTERFACES, OnDblClkInterfaces)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CADQIDlg message handlers
BOOL CADQIDlg::OnInitDialog()
{
CDialog::OnInitDialog();
OnChangeADsPath();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CADQIDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CADQIDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CADQIDlg::OnOK()
{
HRESULT hr;
CWaitCursor wait;
IUnknown *pSave = NULL;
UpdateData( TRUE );
if ( m_pUnk )
{
pSave = m_pUnk; // save it first
}
USES_CONVERSION;
hr = App->ADsOpenObject(T2OLE(m_sADsPath), IID_IUnknown, (void**) &m_pUnk );
if ( !SUCCEEDED(hr) )
{
AfxMessageBox(GetErrorMessage(hr));
m_pUnk = NULL;
return;
}
if ( pSave ) // release the previous pointer
{
pSave->Release();
}
EnumerateInterface();
}
void CADQIDlg::OnChangeADsPath()
{
BOOL bEnabled;
bEnabled = m_cADsPath.GetWindowTextLength() > 0 ? TRUE : FALSE;
m_cOK.EnableWindow( bEnabled );
}
void CADQIDlg::OnCancel()
{
CDialog::OnCancel();
}
void CADQIDlg::EnumerateInterface()
{
int xx=0;
HRESULT hr;
LPUNKNOWN pQI;
m_cListIf.ResetContent();
///////////////////////////////////////////////////////////////
// Query Interface all known ADSI Interfaces
////////////////////////////////////////////////////////////////
while( !IsEqualIID( *adsiIfs[xx].pIID, IID_NULL ) )
{
hr = m_pUnk->QueryInterface( *adsiIfs[xx].pIID, (void**) &pQI );
if ( SUCCEEDED(hr) )
{
m_cListIf.AddString( adsiIfs[xx].szIf );
pQI->Release();
}
xx++;
}
}
void CADQIDlg::OnDblClkInterfaces()
{
CString s;
int xx=0;
int idx;
IUnknown *pNewUnk = NULL;
idx = m_cListIf.GetCurSel();
if ( idx == LB_ERR )
{
MessageBeep(0);
return;
}
CWaitCursor wait;
m_cListIf.GetText( idx, s );
//////////////////////////////////////////////////////////////
//
// Find the appropriate dialog box to display
//
/////////////////////////////////////////////////////////////////
while( !IsEqualIID( *adsiIfs[xx].pIID, IID_NULL ) && s != adsiIfs[xx].szIf )
{
xx++;
}
ASSERT( !IsEqualIID( *adsiIfs[xx].pIID, IID_NULL ) );
if ( adsiIfs[xx].pFn )
{
m_pUnk->AddRef();
(*adsiIfs[xx].pFn)( m_pUnk, &pNewUnk );
}
else
{
wait.Restore();
AfxMessageBox(_T("No UI implemented yet"));
}
////////////////////////////////////////////////////
// if IADsOpenObject is selected, special care
///////////////////////////////////////////////////
if ( pNewUnk )
{
HRESULT hr;
BSTR bstr;
IADs *pADs;
hr = pNewUnk->QueryInterface( IID_IADs, (void**) &pADs );
if ( SUCCEEDED(hr) )
{
pADs->get_ADsPath( &bstr );
}
pADs->Release();
m_sADsPath = bstr;
SysFreeString( bstr );
m_pUnk->Release(); // old ads iunknown path;
m_pUnk = pNewUnk;
UpdateData(FALSE);
EnumerateInterface();
}
}