class CNDSClass;


class CNDSClass : INHERIT_TRACKING,
                     public CCoreADsObject,
                     public ISupportErrorInfo,
                     public IADsClass
{
public:

    /* IUnknown methods */
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) ;

    DECLARE_STD_REFCOUNTING

    DECLARE_IDispatch_METHODS

    DECLARE_ISupportErrorInfo_METHODS

    DECLARE_IADs_METHODS

    DECLARE_IADsClass_METHODS

    CNDSClass::CNDSClass();

    CNDSClass::~CNDSClass();

    static
    HRESULT
    CNDSClass::CreateClass(
        BSTR Parent,
        BSTR CommonName,
        LPNDS_CLASS_DEF lpClassDefs,
        CCredentials& Credentials,
        DWORD dwObjectState,
        REFIID riid,
        void **ppvObj
        );

    static
    HRESULT
    CNDSClass::CreateClass(
        BSTR Parent,
        BSTR CommonName,
        HANDLE hTree,
        CCredentials& Credentials,
        DWORD dwObjectState,
        REFIID riid,
        void **ppvObj
        );

    static
    HRESULT
    CNDSClass::AllocateClassObject(
        CCredentials& Credentials,
        CNDSClass ** ppClass
        );

    STDMETHOD(GetInfo)(
        THIS_ DWORD dwApiLevel,
        BOOL fExplicit
        );

protected:

    VARIANT     _vFilter;
    BSTR        _bstrCLSID;
    BSTR        _bstrOID;
    BSTR        _bstrPrimaryInterface;
    BSTR        _bstrHelpFileName;
    LONG        _lHelpFileContext;

    DWORD       _dwFlags;
    LPWSTR      _lpClassName;
    DWORD       _dwNumberOfSuperClasses;
    PPROPENTRY  _lpSuperClasses;
    DWORD       _dwNumberOfContainmentClasses;
    PPROPENTRY  _lpContainmentClasses;
    DWORD       _dwNumberOfNamingAttributes;
    PPROPENTRY  _lpNamingAttributes;
    DWORD       _dwNumberOfMandatoryAttributes;
    PPROPENTRY  _lpMandatoryAttributes;
    DWORD       _dwNumberOfOptionalAttributes;
    PPROPENTRY  _lpOptionalAttributes;

    CCredentials _Credentials;
    CDispatchMgr FAR * _pDispMgr;
};

HRESULT
MakeVariantFromPropList(
    PPROPENTRY pPropList,
    DWORD dwNumEntries,
    VARIANT * pVarList
    );

PPROPENTRY
CreatePropertyList(
    LPWSTR_LIST  lpStringList
    );