| Platform SDK: Active Directory, ADSI, and Directory Services |
The ICommonQuery::OpenQueryWindow method opens the query dialog.
HRESULT OpenQueryWindow( HWND hwdnParent, LPOPENQUERYWINDOW *pQueryWnd, IDataObject **ppDataObj );
This method returns an HRESULT value.
The following is a C/C++ code snippet illustrating how to invoke the Directory Service Query to search for printers in Active Directory™. The ICommonQuery interface is called to specify a directory service query. The default form is set to Find Printers. The search begins after the dialog is initialized and the scopes collected. If the user selects a printer or more, the selection is returned via IDataObject.
#include "cmnquery.h"
#include "dsclient.h"
#include "dsquery.h"
...
HRESULT FindSomePrinters(void)
{
HRESULT hres;
ICommonQuery* pcq;
hres = CoCreateInstance(CLSID_CommonQuery, NULL, CLSCTX_INPROC_SERVER, IID_ICommonQuery, (void**)&pcq);
if ( SUCCEEDED(hres) )
{
OPENQUERYWINDOW oqw = { 0 };
DSQUERYINITPARAMS dqip = { 0 };
IDataObject *pdo;
//
// Initialize the OPENQUERYWINDOW structure to indicate
// we want to do a Directory Service
// Query, the default form is printers and the search
// should start once the window is initialized.
//
oqw.cbStruct = SIZEOF(oqw);
oqw.dwFlags = OQWF_OKCANCEL|OQWF_DEFAULTFORM|OQWF_ISSUEONOPEN;
oqw.clsidHandler = CLSID_DsQuery;
oqw.pHandlerParameters = &dqip;
oqw.clsidDefaultForm = CLSID_DsFindPrinter;
//
// Now initialize the handler specific parameters,
// in this case, the File/Save menu item is removed
//
dqip.cbStruct = SIZEOF(dqip);
dqip.dwFlags = DSQPF_NOSAVE;
//
// Call OpenQueryWindow, it will block until
// the Query Window is dismissed, so it is advised that
// you run this code on a separate thread.
//
hres = pcq->OpenQueryWindow(NULL /* no parent */, &oqw, &pdo);
if ( SUCCEEDED(hres) && pdo )
{
FORMATETC fmte = {CF_HDROP,
RegisterClipboardFormat(CFSTR_DSOBJECTNAMES),
DVASPECT_CONTENT,
-1,
TYMED_HGLOBAL};
STGMEDIUM medium = { TYMED_NULL, NULL, NULL };
//
// Retrieve the result from the IDataObject,
// in this case CF_DSOBJECTNAMES (dsclient.h)
// is needed because it describes
// the objects which were selected by the user.
//
// Also supported is CF_DSQUERYPARAMS which contains
// the LDAP filter and other information
// on the query issued.
//
hres = pdo->GetData(&fmte, &medium);
if ( SUCCEEDED(hres) )
{
DSOBJECTNAMES *pdon = (DSOBJECTNAMES*)GlobalLock(medium.hGlobal);
if ( pdon )
{
// pdon => DSOBJECTNAMES structure,
// See dsclient.h for more information
GlobalUnlock(medium.hGlobal);
}
}
ReleaseStgMedium(&medium);
pdo->Release();
}
}
return hres;
}
Windows NT/2000: Requires Windows 2000.
Header: Declared in Cmnquery.h.
Library: Included as a resource in Cmnquery.dll.
Active Directory Display Interfaces, DSQUERYINITPARAMS, ICommonQuery, IDataObject, OPENQUERYWINDOW