home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / oleaut / browseh / browseh.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-24  |  18.6 KB  |  500 lines

  1. #ifdef WIN32
  2.  
  3. #ifdef UNICODE
  4.     #define FROM_OLE_STRING(str) str
  5.     #define TO_OLE_STRING(str) str 
  6. #else
  7.     #define FROM_OLE_STRING(str) ConvertToAnsi(str)
  8.     char FAR* ConvertToAnsi(OLECHAR FAR* szW);  
  9.     #define TO_OLE_STRING(str) ConvertToUnicode(str)
  10.     OLECHAR FAR* ConvertToUnicode(char FAR* szA);   
  11.     // Maximum length of string that can be converted between Ansi & Unicode
  12.     #define STRCONVERT_MAXLEN 300         
  13. #endif
  14.  
  15. #else  // WIN16
  16.   #define TCHAR char
  17.   #define TEXT(sz) sz 
  18.   #define FROM_OLE_STRING(str) str  
  19.   #define TO_OLE_STRING(str) str  
  20.   #define LPTSTR LPSTR
  21. #endif
  22.       
  23. #include "mydisp.h"
  24. #include "tlb.h"
  25.  
  26. // MAX len of string table entries
  27. #define STR_LEN   200
  28.  
  29. // String table constants
  30. #define IDS_SERVERNAME             1
  31. // These exception strings IDs that is will used in EXCEPINFO.wCode   
  32. #define IDS_Unexpected             1001
  33. #define IDS_OutOfMemory            1002   
  34. #define IDS_InvalidIndex           1003
  35. #define IDS_CollectionFull         1004
  36. #define IDS_CannotFindTypeLibrary  1005
  37. #define IDS_TypeLibraryCreationFailed 1006    
  38. #define IDS_WrongType               1007
  39. #define IDS_InvalidProgid           1008
  40. #define IDS_CouldNotCreateObject    1009
  41. #define IDS_ObjectDoesNotSupportAutomation   1010       
  42. #define IDS_ObjectDoesNotProvideTypeInfo  1011
  43. #define IDS_NotDualInterface 1012
  44.  
  45. // Function prototypes
  46. BOOL InitDLL (HINSTANCE hInstance);
  47. extern "C" STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv);   
  48. extern "C" STDAPI DllCanUnloadNow(void);
  49.  
  50. //Forward declarations.
  51. class CArrayBound;
  52.  
  53. class FAR CBrowseHelperCF : public IClassFactory
  54. {
  55. public:
  56.     // IUnknown methods 
  57.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  58.     STDMETHOD_(ULONG, AddRef)(void);
  59.     STDMETHOD_(ULONG, Release)(void); 
  60.     
  61.     // IClassFactory methods
  62.     STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
  63.     STDMETHOD(LockServer)(BOOL fLock);    
  64.     
  65.     CBrowseHelperCF();
  66.     
  67. private:
  68.     ULONG m_cRef;                   // Reference count
  69. }; 
  70.  
  71.     
  72. class FAR CBrowseHelper : public IBrowseHelper
  73. {
  74. public:
  75.     // IBrowseHelper automation exposed methods
  76.     STDMETHOD_(ITypeLibrary FAR*, BrowseTypeLibrary)(BSTR bstrPath);     
  77.     
  78.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  79.     static HRESULT Create(CBrowseHelper FAR* FAR* ppBrowseHelper); // Creates and intializes Applicaton object 
  80.     CBrowseHelper();
  81.     ~CBrowseHelper();
  82. };
  83.  
  84. class FAR CTypeLibrary : public ITypeLibrary
  85. {
  86. public:
  87.     // ITypeLibrary automation exposed properties & methods 
  88.     STDMETHOD_(BSTR, get_Name)();
  89.     STDMETHOD_(BSTR, get_Documentation)();
  90.     STDMETHOD_(long, get_HelpContext)();
  91.     STDMETHOD_(BSTR, get_HelpFile)();
  92.     STDMETHOD_(long, get_LocaleID)();
  93.     STDMETHOD_(int, get_MajorVersion)();
  94.     STDMETHOD_(int, get_MinorVersion)();
  95.     STDMETHOD_(BSTR, get_GUIDAsString)();
  96.     STDMETHOD_(ICollection FAR*, get_TypeInfos)();   
  97.     
  98.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  99.     static HRESULT Create(LPTYPELIB ptlib, CTypeLibrary FAR* FAR* ppTypeLibrary); // Creates and intializes TypeLibrary object 
  100.     CTypeLibrary();
  101.     ~CTypeLibrary();
  102.     
  103. private:    
  104.     BSTR m_bstrName;               // Type Library name
  105.     BSTR m_bstrDocumentation;      // Documentation
  106.     unsigned long m_ulHelpContext; // HelpContext
  107.     BSTR m_bstrHelpFile;           // HelpFile
  108.     GUID m_guid;                   // GUID
  109.     LPOLESTR m_pszGUID;            // String form of GUID
  110.     LCID m_lcid;                   // Locale ID
  111.     unsigned short m_wMajorVer;    // Major version
  112.     unsigned short m_wMinorVer;    // Minor version
  113.     LPTYPELIB m_ptlib;             // ITypeLib* of type library.
  114.     LPDISPATCH m_pdispTypeInfos;   // Collection of typeinfos contained by this typelib
  115. };
  116.  
  117. // CTypeInfo is the base class for all the TypeInfos (CInterface, CDispinterface,
  118. // CModule, CCoClass, CEnum, CStruct, CUnion, CAlias)
  119. class FAR CTypeInfo : public ITypeInformation
  120. {
  121. public:
  122.     // ITypeInfo automation exposed properties & methods 
  123.     STDMETHOD_(BSTR, get_Name)();
  124.     STDMETHOD_(BSTR, get_Documentation)();
  125.     STDMETHOD_(long, get_HelpContext)();
  126.     STDMETHOD_(BSTR, get_HelpFile)();
  127.     STDMETHOD_(TYPEKIND, get_TypeInfoKind)();
  128.     STDMETHOD_(short, get_TypeFlags)();
  129.     STDMETHOD_(BSTR, get_GUIDAsString)();
  130.     
  131.     STDMETHOD_(REFCLSID, GetInterfaceID)();
  132.     STDMETHOD(_InitTypeInfo)(LPTYPEINFO ptinfo); // Called by derived class to intialize this base class
  133.     static HRESULT Create(LPTYPEINFO ptinfo, CTypeInfo FAR* FAR* ppTypeInfo); // Creates and intializes TypeInfo object 
  134.     CTypeInfo();
  135.     ~CTypeInfo();
  136.  
  137. protected:
  138.     short m_wTypeFlags;            // TYPEFLAGS
  139.  
  140. private:    
  141.     BSTR m_bstrName;               // TypeInfo name
  142.     BSTR m_bstrDocumentation;      // Documentation 
  143.     unsigned long m_ulHelpContext; // Help context
  144.     BSTR m_bstrHelpFile;           // Help file
  145.     TYPEKIND m_typekind;           // Type of TypeInfo. See TYPEKIND enumeration.
  146.     GUID m_guid;                   // GUID
  147.     LPOLESTR m_pszGUID;            // String form of GUID
  148. };
  149.  
  150. class FAR CInterface : public CTypeInfo       
  151. {
  152. public:
  153.     // IInterface automation exposed properties & methods 
  154.     STDMETHOD_(ICollection FAR*, get_Functions)();
  155.     STDMETHOD_(IInterface FAR*, get_BaseInterface)();
  156.     
  157.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  158.     static HRESULT Create(LPTYPEINFO ptinfo, CInterface FAR* FAR* ppInterface); // Creates and intializes Interface object 
  159.     CInterface();
  160.     ~CInterface();
  161.     
  162. private:
  163.     LPTYPEINFO m_ptinfo;             // ITypeInfo* of interface typeinfo.
  164.     LPDISPATCH m_pdispFunctions;     // Collection of functions in interface.
  165.     LPDISPATCH m_pdispBaseInterface; // Base interface of this interface.
  166. };
  167.  
  168. class FAR CDispinterface : public CTypeInfo
  169. {
  170. public:
  171.     // IDispinterface automation exposed properties & methods 
  172.     STDMETHOD_(ICollection FAR*, get_Properties)();
  173.     STDMETHOD_(ICollection FAR*, get_Methods)();
  174.     STDMETHOD_(IInterface FAR*, get_Interface)();
  175.     
  176.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  177.     static HRESULT Create(LPTYPEINFO ptinfo, CDispinterface FAR* FAR* ppDispinterface); // Creates and intializes Dispinterface object 
  178.     CDispinterface();
  179.     ~CDispinterface();
  180.     
  181. private:
  182.     LPTYPEINFO m_ptinfo;              // ITypeInfo* of dispinterface typeinfo.
  183.     LPDISPATCH m_pdispProperties;     // Collection of properties in dispinterface
  184.     LPDISPATCH m_pdispMethods;        // Collection of methods in dispinterface
  185.     LPDISPATCH m_pdispInterface;      // Interface part of dual interface, if this is a dual interface
  186. };  
  187.  
  188. class FAR CModule : public CTypeInfo       
  189. {
  190. public:
  191.     // IModule automation exposed properties & methods 
  192.     STDMETHOD_(ICollection FAR*, get_Functions)();    
  193.     
  194.     STDMETHOD_(REFCLSID, GetInterfaceID)();   
  195.     static HRESULT Create(LPTYPEINFO ptinfo, CModule FAR* FAR* ppInterface); // Creates and intializes Module object 
  196.     CModule();
  197.     ~CModule();
  198.     
  199. private:                             
  200.     LPTYPEINFO m_ptinfo;              // ITypeInfo* of module typeinfo.
  201.     LPDISPATCH m_pdispFunctions;      // Collection of functions in module
  202. };
  203.  
  204. class FAR CCoClass : public CTypeInfo
  205. {
  206. public:   
  207.     // ICoClass automation exposed properties & methods 
  208.     STDMETHOD_(ICollection FAR*, get_Interfaces)();     
  209.     
  210.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  211.     static HRESULT Create(LPTYPEINFO ptinfo, CCoClass FAR* FAR* ppCoClass); // Creates and intializes CoClass object     
  212.     CCoClass();
  213.     ~CCoClass();
  214.     
  215. private:
  216.     LPTYPEINFO m_ptinfo;              // ITypeInfo* of coclass typeinfo.
  217.     LPDISPATCH m_pdispInterfaces;     // Collection of interfaces/dispinterfaces in coclass
  218. }; 
  219.  
  220. class FAR CEnum : public CTypeInfo
  221. {
  222. public:
  223.     // IEnum automation exposed properties & methods
  224.     STDMETHOD_(ICollection FAR*, get_Elements)();    
  225.     
  226.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  227.     static HRESULT Create(LPTYPEINFO ptinfo, CEnum FAR* FAR* ppEnum); // Creates and intializes Enum object 
  228.     CEnum();
  229.     ~CEnum();
  230.     
  231. private:
  232.     LPTYPEINFO m_ptinfo;             // ITypeInfo* of enum typeinfo.
  233.     LPDISPATCH m_pdispElements;      // Collection of elements in enum.
  234. };
  235.  
  236. class FAR CStruct : public CTypeInfo
  237. {
  238. public: 
  239.      // IStruct automation exposed properties & methods 
  240.     STDMETHOD_(ICollection FAR*, get_Members)(); 
  241.     
  242.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  243.     static HRESULT Create(LPTYPEINFO ptinfo, CStruct FAR* FAR* ppStruct); // Creates and intializes Struct object 
  244.     CStruct();
  245.     ~CStruct();
  246.     
  247. private:
  248.     LPTYPEINFO m_ptinfo;            // ITypeInfo* of struct typeinfo.
  249.     LPDISPATCH m_pdispMembers;      // Collection of members in struct.
  250. };
  251.  
  252. class FAR CUnion : public CTypeInfo
  253. {  
  254. public:
  255.     // IUnion automation exposed properties & methods  
  256.     STDMETHOD_(ICollection FAR*, get_Members)();   
  257.     
  258.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  259.     static HRESULT Create(LPTYPEINFO ptinfo, CUnion FAR* FAR* ppUnion); // Creates and intializes Struct object 
  260.     CUnion();
  261.     ~CUnion();
  262.     
  263. private:
  264.     LPTYPEINFO m_ptinfo;            // ITypeInfo* of union typeinfo.
  265.     LPDISPATCH m_pdispMembers;      // Collection of members in union.
  266. };
  267.  
  268.  
  269. class FAR CAlias : public CTypeInfo
  270. public:    
  271.     // IAlias automation exposed properties & methods  
  272.     STDMETHOD_(ITypeDesc FAR*, get_BaseType)(); 
  273.     
  274.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  275.     static HRESULT Create(LPTYPEINFO ptinfo, CAlias FAR* FAR* ppAlias); // Creates and intializes Alias object 
  276.     CAlias();
  277.     ~CAlias();
  278.     
  279. private:
  280.     LPTYPEINFO m_ptinfo;             // ITypeInfo* of alias typeinfo.
  281.     LPDISPATCH m_pdispTypeDescBase;  // IDispatch of ITypeDesc which describes the base type of this alias.
  282. };  
  283.  
  284. // CFunction represents all functions (including methods).
  285. class FAR CFunction : public IFunction
  286. {
  287. public:
  288.     // IFunction automation exposed properties & methods 
  289.     STDMETHOD_(BSTR, get_Name)();
  290.     STDMETHOD_(BSTR, get_Documentation)();
  291.     STDMETHOD_(long, get_HelpContext)();
  292.     STDMETHOD_(BSTR, get_HelpFile)();
  293.     STDMETHOD_(ITypeDesc FAR*, get_ReturnType)();
  294.     STDMETHOD_(ICollection FAR*, get_Parameters)(); 
  295.     STDMETHOD_(MEMBERID, get_Memberid)();
  296.     STDMETHOD_(CALLCONV, get_CallConvention)(); 
  297.     STDMETHOD_(FUNCKIND, get_FuncKind)();
  298.     STDMETHOD_(INVOKEKIND, get_InvocationKind)();
  299.     STDMETHOD_(short, get_NumberOfOptionalParams)();
  300.     STDMETHOD_(short, get_OffsetInVtbl)();
  301.     STDMETHOD_(unsigned short, get_FuncFlags)();
  302.     STDMETHOD_(OBJTYPE, get_Kind)();      
  303.     
  304.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  305.     static HRESULT Create(LPTYPEINFO ptinfo, unsigned short nIndex, CFunction FAR* FAR* ppFunction); // Creates and intializes Function object 
  306.     CFunction();
  307.     ~CFunction();
  308.     
  309. private:   
  310.     BSTR m_bstrName;                     // Function name.
  311.     BSTR m_bstrDocumentation;            // Documentation.
  312.     unsigned long m_ulHelpContext;       // Help context.
  313.     BSTR m_bstrHelpFile;                 // Help file.
  314.     LPDISPATCH m_pdispTypeDesc;          // IDispatch of ITypeDesc that described return type.
  315.     LPDISPATCH m_pdispParameters;        // Collection of parameters function.
  316.     LPFUNCDESC m_pfuncdesc;              // FUNCDESC of function.
  317.     LPTYPEINFO m_ptinfoFunction;         // TypeInfo of which this function is an element.
  318. };
  319.  
  320. // CProperty represents dispinterface properties and structure & union members.
  321. class FAR CProperty : public IProperty
  322. {
  323. public:
  324.     // IProperty automation exposed properties & methods 
  325.     STDMETHOD_(BSTR, get_Name)();
  326.     STDMETHOD_(BSTR, get_Documentation)();
  327.     STDMETHOD_(long, get_HelpContext)();
  328.     STDMETHOD_(BSTR, get_HelpFile)();
  329.     STDMETHOD_(ITypeDesc FAR*, get_Type)();
  330.     STDMETHOD_(MEMBERID, get_Memberid)(); 
  331.     STDMETHOD_(OBJTYPE, get_Kind)();  
  332.     
  333.     STDMETHOD_(REFCLSID, GetInterfaceID)();   
  334.     static HRESULT Create(LPTYPEINFO ptinfo, LPVARDESC pvardesc, CProperty FAR* FAR* ppProperty); // Creates and intializes Property object 
  335.     CProperty();
  336.     ~CProperty();
  337.     
  338. private:        
  339.     BSTR m_bstrName;                     // Property name.
  340.     BSTR m_bstrDocumentation;            // Documentation.
  341.     unsigned long m_ulHelpContext;       // Help Context.
  342.     BSTR m_bstrHelpFile;                 // Helpfile.
  343.     MEMBERID m_memid;                    // MEMBERID of property.
  344.     LPDISPATCH m_pdispTypeDesc;          // ITypeDesc that describes type of property.
  345. };
  346.  
  347. class FAR CConstant : public IConstant
  348. {
  349. public:
  350.     // IConstant automation exposed properties & methods
  351.     STDMETHOD_(BSTR, get_Name)();
  352.     STDMETHOD_(BSTR, get_Documentation)();
  353.     STDMETHOD_(long, get_HelpContext)();
  354.     STDMETHOD_(BSTR, get_HelpFile)();
  355.     STDMETHOD_(ITypeDesc FAR*, get_Type)();    
  356.     STDMETHOD_(VARIANT, get_Value)();      
  357.     STDMETHOD_(MEMBERID, get_Memberid)(); 
  358.     STDMETHOD_(OBJTYPE, get_Kind)();  
  359.     
  360.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  361.     static HRESULT Create(LPTYPEINFO ptinfo, LPVARDESC pvardesc, CConstant FAR* FAR* ppConstant); // Creates and intializes Constant object 
  362.     CConstant();
  363.     ~CConstant();
  364.     
  365. private:        
  366.     BSTR m_bstrName;                       // Constant name
  367.     BSTR m_bstrDocumentation;              // Documentation
  368.     unsigned long m_ulHelpContext;         // Help context
  369.     BSTR m_bstrHelpFile;                   // Helpfile
  370.     LPDISPATCH m_pdispTypeDesc;            // ITypeDesc that describes type of constant.
  371.     MEMBERID m_memid;                      // MEMBERID.
  372.     VARIANT m_vValue;                      // Constant value.
  373. };
  374.  
  375. class FAR CParameter : public IParameter
  376. {
  377. public:
  378.     // IParameter automation exposed properties & methods 
  379.     STDMETHOD_(BSTR, get_Name)();
  380.     STDMETHOD_(ITypeDesc FAR*, get_Type)(); 
  381.     STDMETHOD_(int, get_IDLFlags)();
  382.     STDMETHOD_(OBJTYPE, get_Kind)();    
  383.     
  384.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  385.     static HRESULT Create(LPTYPEINFO ptinfo, BSTR bstrName, TYPEDESC FAR* ptypedesc, 
  386.          IDLDESC FAR* pidldesc, CParameter FAR* FAR* ppParameter);  // Creates and intializes Parameter object 
  387.     CParameter();
  388.     ~CParameter();
  389.     
  390. private:  
  391.     BSTR m_bstrName;                      // Parameter name.
  392.     unsigned short m_wIDLFlags;           // specifies in/out/in-out/none
  393.     LPDISPATCH m_pdispTypeDesc;           // ITypeDesc* that describes type of parameter.
  394. };  
  395.  
  396. // Describes a type
  397. class FAR CTypeDesc : public ITypeDesc
  398. {
  399. public:   
  400.     // ITypeDesc automation exposed properties & methods
  401.     STDMETHOD_(short, get_Type)();
  402.     STDMETHOD_(ITypeInformation FAR*, get_UserDefinedDesc)();
  403.     STDMETHOD_(IArrayDesc FAR*, get_ArrayDesc)();
  404.     STDMETHOD_(ITypeDesc FAR*, get_PointerDesc)();  
  405.  
  406.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  407.     static HRESULT Create(LPTYPEINFO ptinfo, TYPEDESC FAR* ptypedesc, CTypeDesc FAR* FAR* ppTypeDesc); // Creates and intializes TypeDesc object 
  408.     CTypeDesc();
  409.     ~CTypeDesc();
  410.     
  411. private:
  412.     VARTYPE m_vartype;                  // Type
  413.     LPDISPATCH m_pdispUserDefinedDesc;  // If m_vartype==VT_USERDEFINED, contains ITypeInformation* of user-defined type., 
  414.     LPDISPATCH m_pdispArrayDesc;        // if m_vartype==VT_CARRAY, contains IArrayDesc* 
  415.     LPDISPATCH m_pdispPointerDesc;      // if m_vartype==VT_PTR contains ITypeDesc* of type pointed to.
  416. };
  417.  
  418. // Describes C-Style array
  419. class FAR CArrayDesc : public IArrayDesc
  420. {
  421. public:     
  422.     // IArrayDesc automation exposed properties & methods
  423.     STDMETHOD_(ITypeDesc FAR*, get_ElementType)();
  424.     STDMETHOD_(ICollection FAR*, get_ArrayBounds)();   
  425.  
  426.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  427.     static HRESULT Create(LPTYPEINFO ptinfo, ARRAYDESC FAR* parraydesc, CArrayDesc FAR* FAR* ppArrayDesc); // Creates and intializes ArrayDesc object 
  428.     CArrayDesc();
  429.     ~CArrayDesc();
  430.     
  431. private:
  432.     LPDISPATCH m_pdispTypeDescElement;     // ITypeDesc that descibed type of array element.
  433.     LPDISPATCH m_pdispArrayBounds;         // IArrayBound that describes array bounds.
  434. };
  435.  
  436. class FAR CArrayBound : public IArrayBound
  437. {
  438. public:
  439.     // IArrayBound automation exposed properties & methods
  440.     STDMETHOD_(long, get_ElementsCount)();
  441.     STDMETHOD_(long, get_LowerBound)();  
  442.  
  443.     STDMETHOD_(REFCLSID, GetInterfaceID)();    
  444.     static HRESULT Create(unsigned long cElements, long lLBound, CArrayBound FAR* FAR* ppArrayBound); // Creates and intializes ArrayBound object
  445.     
  446. private:
  447.     unsigned long m_cElements;             // Count of elements in array.
  448.     long m_lLBound;                        // Lower bound of array.
  449. };
  450.  
  451. // Generic collection class that holds all collections.
  452. class FAR CCollection : public ICollection
  453. {
  454. public:
  455.     // ICollection automation exposed properties & methods
  456.     STDMETHOD_(long, get_Count)();
  457.     STDMETHOD_(LPDISPATCH, get_Item)(long lIndex);
  458.     STDMETHOD_(LPUNKNOWN, get__NewEnum)();
  459.     
  460.     // CCollection methods 
  461.     STDMETHOD_(void, Add)(LPDISPATCH pdispItem);  
  462.     STDMETHOD_(REFCLSID, GetInterfaceID)();   
  463.     static HRESULT Create(ULONG lMaxSize, long lLBound, CCollection FAR* FAR* ppCollection); // Creates and intializes Collection object 
  464.     CCollection();
  465.     ~CCollection();
  466.     
  467. private:
  468.     SAFEARRAY FAR *m_psa;          // Safe array that holds Collection collection items.
  469.     ULONG m_cElements;             // Number of items in Collection collection.
  470.     ULONG m_cMax;                  // Maximum number of items Collection collection can hold.
  471.     long m_lLBound;                // Lower bound of index of Collection collection.
  472. };
  473.  
  474. class FAR CEnumVariant : public IEnumVARIANT
  475. {
  476. public:
  477.     // IUnknown methods 
  478.     STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
  479.     STDMETHOD_(ULONG, AddRef)();
  480.     STDMETHOD_(ULONG, Release)();
  481.  
  482.     // IEnumVARIANT methods 
  483.     STDMETHOD(Next)(ULONG cElements, VARIANT FAR* pvar, ULONG FAR* pcElementFetched);
  484.     STDMETHOD(Skip)(ULONG cElements);
  485.     STDMETHOD(Reset)();
  486.     STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
  487.     
  488.     static HRESULT Create(SAFEARRAY FAR*, ULONG, CEnumVariant FAR* FAR*); // Creates and intializes Enumerator
  489.     CEnumVariant();
  490.     ~CEnumVariant();
  491.     
  492. private:
  493.     ULONG m_cRef;           // Reference count                                 
  494.     ULONG m_cElements;      // Number of elements in enumerator. 
  495.     long m_lLBound;         // Lower bound of index.
  496.     long m_lCurrent;        // Current index.
  497.     SAFEARRAY FAR* m_psa;   // Safe array that holds elements.
  498. };  
  499.