Prohlížeč kontejnerů
Aplikace může použít funkci DsBrowseForContainer k zobrazení dialogového okna, které lze použít k procházení kontejnerů ve službě Active Directory Domain Service. Dialogové okno zobrazí kontejnery ve stromovém formátu a umožní uživateli procházet strom pomocí klávesnice a myši. Když uživatel vybere položku v dialogovém okně, zobrazí se cesta ADsPath kontejneru vybraného uživatelem.
DsBrowseForContainer vezme ukazatel na DSBROWSEINFO strukturu, která obsahuje data o dialogovém okně a vrátí ADsPath vybrané položky.
pszRoot člen je ukazatel na řetězec Unicode, který obsahuje kořenový kontejner stromu. Pokud pszRoot je null, strom bude obsahovat celý strom.
Člen pszPath obdrží ADsPath vybraného objektu. Je možné zadat konkrétní kontejner, který se má zobrazit a vybrat při prvním zobrazení dialogového okna. Toho dosáhnete nastavením pszPath na ADsPath položky, kterou chcete vybrat, a nastavením příznaku DSBI_EXPANDONOPEN v dwFlags.
Obsah a chování dialogového okna lze také řídit za běhu implementací BFFCallBack funkce. Aplikace implementuje funkci BFFCallBack a volá se při výskytu určitých událostí. Aplikace může tyto události použít k řízení způsobu zobrazení položek v dialogovém okně i skutečného obsahu dialogového okna. Aplikace může například filtrovat položky zobrazené v dialogovém okně implementací BFFCallBack funkce, která dokáže zpracovat DSBM_QUERYINSERT oznámení. Při přijetí oznámení DSBM_QUERYINSERT pomocí pszADsPath člen struktury DSBITEM určit, která položka se má vložit. Pokud aplikace zjistí, že položka by neměla být zobrazena, může položku skrýt provedením následujících kroků.
- Přidejte příznak DSBF_STATE do dwMask člen struktury DSBIT EM.
- Přidejte příznak DSBS_HIDDEN do dwStateMask člen struktury DSBITEM.
- Přidejte příznak DSBS_HIDDEN do dwState člen struktury DSBITEM.
- Vrátí nenulovou hodnotu z funkce BFFCallBack.
Kromě skrytí určitých položek může aplikace upravit text a ikonu zobrazenou pro položku zpracováním oznámení DSBM_QUERYINSERT. Další informace naleznete v tématu DSBITEM.
Funkce BFFCallBack může k získání popisovače dialogového okna použít oznámení BFFM_INITIALIZED. Aplikace může tento popisovač použít k odesílání zpráv, například BFFM_ENABLEOK, do dialogového okna. Další informace o zprávách, které lze odeslat do dialogového okna, naleznete v tématu BFFCallBack.
Popisovač dialogového okna lze použít také k získání přímého přístupu k ovládacím prvkům v dialogovém okně. DSBID_BANNER je identifikátor statického textového ovládacího prvku, ve kterém je zobrazena struktura pszTitle člen DSBROWSEINFO. DSBID_CONTAINERLIST je identifikátor ovládacího prvku stromového zobrazení sloužícího k zobrazení obsahu stromu. Pokud je to možné, měli byste se těmto položkám vyhnout, abyste zabránili budoucím problémům s kompatibilitou aplikací.
Následující příklad kódu C++ ukazuje, jak použít funkci DsBrowseForContainer k vytvoření dialogového okna prohlížeče kontejneru a implementaci BFFCallBack funkce. BFFCallBack používá oznámení DSBM_QUERYINSERT ke změně zobrazovaného názvu každé položky na rozlišující název položky.
#include <shlobj.h>
#include <dsclient.h>
#include <atlbase.h>
/**********
WideCharToLocal()
***********/
int WideCharToLocal(LPTSTR pLocal, LPWSTR pWide, DWORD dwChars)
{
*pLocal = NULL;
size_t nWideLength = 0;
wchar_t *pwszSubstring;
nWideLength = wcslen(pWide);
#ifdef UNICODE
if(nWideLength < dwChars)
{
wcsncpy_s(pLocal, pWide, dwChars);
}
else
{
wcsncpy_s(pLocal, pWide, dwChars-1);
pLocal[dwChars-1] = NULL;
}
#else
if(nWideLength < dwChars)
{
WideCharToMultiByte( CP_ACP,
0,
pWide,
-1,
pLocal,
dwChars,
NULL,
NULL);
}
else
{
pwszSubstring = new WCHAR[dwChars];
wcsncpy_s(pwszSubstring,pWide,dwChars-1);
pwszSubstring[dwChars-1] = NULL;
WideCharToMultiByte( CP_ACP,
0,
pwszSubstring,
-1,
pLocal,
dwChars,
NULL,
NULL);
delete [] pwszSubstring;
}
#endif
return lstrlen(pLocal);
}
/**********
BrowseCallback()
***********/
int CALLBACK BrowseCallback(HWND hWnd,
UINT uMsg,
LPARAM lParam,
LPARAM lpData)
{
switch(uMsg)
{
case DSBM_QUERYINSERT:
{
BOOL fReturn = FALSE;
DSBITEM *pItem = (DSBITEM*)lParam;
/*
If this is to the root item, get the distinguished name
for the object and set the display name to the
distinguished name.
*/
if(!(pItem->dwState & DSBS_ROOT))
{
HRESULT hr;
IADs *pads;
hr = ADsGetObject(pItem->pszADsPath ,
IID_IADs, (LPVOID*)&pads);
if(SUCCEEDED(hr))
{
VARIANT var;
VariantInit(&var);
hr = pads->Get(CComBSTR("distinguishedName"),
&var);
if(SUCCEEDED(hr))
{
if(VT_BSTR == var.vt)
{
WideCharToLocal(pItem->szDisplayName,
var.bstrVal,
DSB_MAX_DISPLAYNAME_CHARS);
pItem->dwMask |= DSBF_DISPLAYNAME;
fReturn = TRUE;
}
VariantClear(&var);
}
pads->Release();
}
}
return fReturn;
}
break;
}
return FALSE;
}
/***********
BrowseForContainer()
************/
HRESULT BrowseForContainer(HWND hwndParent,
LPOLESTR *ppContainerADsPath)
{
HRESULT hr = E_FAIL;
DSBROWSEINFO dsbi;
OLECHAR wszPath[MAX_PATH * 2];
DWORD result;
if(!ppContainerADsPath)
{
return E_INVALIDARG;
}
ZeroMemory(&dsbi, sizeof(dsbi));
dsbi.hwndOwner = hwndParent;
dsbi.cbStruct = sizeof (DSBROWSEINFO);
dsbi.pszCaption = TEXT("Browse for a Container");
dsbi.pszTitle = TEXT("Select an Active Directory container.");
dsbi.pszRoot = NULL;
dsbi.pszPath = wszPath;
dsbi.cchPath = sizeof(wszPath)/sizeof(OLECHAR);
dsbi.dwFlags = DSBI_INCLUDEHIDDEN |
DSBI_IGNORETREATASLEAF|
DSBI_RETURN_FORMAT;
dsbi.pfnCallback = BrowseCallback;
dsbi.lParam = 0;
dsbi.dwReturnFormat = ADS_FORMAT_X500;
// Display the browse dialog box.
// Returns -1, 0, IDOK, or IDCANCEL.
result = DsBrowseForContainer(&dsbi);
if(IDOK == result)
{
// Allocate memory for the string.
*ppContainerADsPath = (OLECHAR*)CoTaskMemAlloc(
sizeof(OLECHAR)*(wcslen(wszPath) + 1));
if(*ppContainerADsPath)
{
wcscpy_s(*ppContainerADsPath, wszPath);
// Caller must free using CoTaskMemFree.
hr = S_OK;
}
else
{
hr = E_FAIL;
}
}
else
{
hr = E_FAIL;
}
return hr;
}