Расширение оснастки Active Directory Users and Computers
От: OM777 Россия  
Дата: 26.07.07 04:22
Оценка:
Не знаю, куда задать вопрос. Наверное все таки сюда..
Система — Win 2003 Standart Server
Пишу я расширение оснастки mmc. Расширение для Property Page.
Задача — получить DN для пользователя. Код такой (взят из Platform SDK)


HWND CPropSheetExtension::CreateADsNotificationObject(IDataObject *pDataObject)
{
    STGMEDIUM   stm;
    FORMATETC   fe;
    HRESULT     hr;
    HWND        hwndNotifyObject = NULL;

    /*
    The "DsAdminMultiSelectClipFormat" clipboard format is supported by the 
    data object if the Active Directory Users and Computers snap-in supports 
    multi-selection property sheets.
    */
    fe.cfFormat = RegisterClipboardFormat(TEXT("DsAdminMultiSelectClipFormat"));
    fe.ptd = NULL;
    fe.dwAspect = DVASPECT_CONTENT;
    fe.lindex = -1;
    fe.tymed = TYMED_HGLOBAL;
    hr = pDataObject->GetData(&fe, &stm);
    if (SUCCEEDED(hr))
    {
        PWSTR pwzUniqueID = (LPWSTR)GlobalLock(stm.hGlobal);

        if (pwzUniqueID)
        {
            hr = ADsPropCreateNotifyObj(pDataObject, pwzUniqueID, &hwndNotifyObject);

            GlobalUnlock(stm.hGlobal);
        }
            
        ReleaseStgMedium(&stm);
    }
    else
    {
        fe.cfFormat = RegisterClipboardFormat(CFSTR_DSOBJECTNAMES);
        fe.ptd = NULL;
        fe.dwAspect = DVASPECT_CONTENT;
        fe.lindex = -1;
        fe.tymed = TYMED_HGLOBAL;
        hr = pDataObject->GetData(&fe, &stm);
        if(SUCCEEDED(hr))
        {
            LPDSOBJECTNAMES pdson = (LPDSOBJECTNAMES)GlobalLock(stm.hGlobal);

            if(pdson)
            {
                LPWSTR  pwszName = (LPWSTR)((LPBYTE)pdson + pdson->aObjects[0].offsetName);
                
                hr = ADsPropCreateNotifyObj(pDataObject, pwszName, &hwndNotifyObject);

                GlobalUnlock(stm.hGlobal);
            }
            
            ReleaseStgMedium(&stm);
        }
    }

    return hwndNotifyObject;
}


Данный код работает правильно, только если берутся свойства для одного пользовательского объекта. Причем ClipboardFormat в данном случае не важен — отрабатывается правильно оба варианта — правильный DN помещается в pwszName.
Если же выбрать несколько объектов — в строке
hr = pDataObject->GetData(&fe, &stm);

выдается ошибка — ошибка в структуре FORMATETC опять же для обоих случаях if. В чем тут может быть затык?

В MSDN написано, что возможность написания расширений для проперти пэйджа в случае множественного выбора появилась только в Win 2003, а ClipboardFormat — DsAdminMultiSelectClipFormat даже нет в заголовочных файлах. Тем не менее, вроде как это должно работать — не зря же в MSDN есть пример..

Вообще интересно, кто-нибудь писал подобное? ) Перерыл весь интернет — только лишь ссылки на MSDN и то не везде)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.