home *** CD-ROM | disk | FTP | other *** search
- #ifdef WIN32
-
- #ifdef UNICODE
- #define FROM_OLE_STRING(str) str
- #define TO_OLE_STRING(str) str
- #else
- #define FROM_OLE_STRING(str) ConvertToAnsi(str)
- char FAR* ConvertToAnsi(OLECHAR FAR* szW);
- #define TO_OLE_STRING(str) ConvertToUnicode(str)
- OLECHAR FAR* ConvertToUnicode(char FAR* szA);
- // Maximum length of string that can be converted between Ansi & Unicode
- #define STRCONVERT_MAXLEN 300
- #endif
-
- #else // WIN16
- #define TCHAR char
- #define TEXT(sz) sz
- #define FROM_OLE_STRING(str) str
- #define TO_OLE_STRING(str) str
- #define LPTSTR LPSTR
- #endif
-
- #include "mydisp.h"
- #include "tlb.h"
-
- // MAX len of string table entries
- #define STR_LEN 200
-
- // String table constants
- #define IDS_SERVERNAME 1
- // These exception strings IDs that is will used in EXCEPINFO.wCode
- #define IDS_Unexpected 1001
- #define IDS_OutOfMemory 1002
- #define IDS_InvalidIndex 1003
- #define IDS_CollectionFull 1004
- #define IDS_CannotFindTypeLibrary 1005
- #define IDS_TypeLibraryCreationFailed 1006
- #define IDS_WrongType 1007
- #define IDS_InvalidProgid 1008
- #define IDS_CouldNotCreateObject 1009
- #define IDS_ObjectDoesNotSupportAutomation 1010
- #define IDS_ObjectDoesNotProvideTypeInfo 1011
- #define IDS_NotDualInterface 1012
-
- // Function prototypes
- BOOL InitDLL (HINSTANCE hInstance);
- extern "C" STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv);
- extern "C" STDAPI DllCanUnloadNow(void);
-
- //Forward declarations.
- class CArrayBound;
-
- class FAR CBrowseHelperCF : public IClassFactory
- {
- public:
- // IUnknown methods
- STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
- STDMETHOD_(ULONG, AddRef)(void);
- STDMETHOD_(ULONG, Release)(void);
-
- // IClassFactory methods
- STDMETHOD(CreateInstance)(IUnknown FAR* punkOuter, REFIID riid, void FAR* FAR* ppv);
- STDMETHOD(LockServer)(BOOL fLock);
-
- CBrowseHelperCF();
-
- private:
- ULONG m_cRef; // Reference count
- };
-
-
- class FAR CBrowseHelper : public IBrowseHelper
- {
- public:
- // IBrowseHelper automation exposed methods
- STDMETHOD_(ITypeLibrary FAR*, BrowseTypeLibrary)(BSTR bstrPath);
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(CBrowseHelper FAR* FAR* ppBrowseHelper); // Creates and intializes Applicaton object
- CBrowseHelper();
- ~CBrowseHelper();
- };
-
- class FAR CTypeLibrary : public ITypeLibrary
- {
- public:
- // ITypeLibrary automation exposed properties & methods
- STDMETHOD_(BSTR, get_Name)();
- STDMETHOD_(BSTR, get_Documentation)();
- STDMETHOD_(long, get_HelpContext)();
- STDMETHOD_(BSTR, get_HelpFile)();
- STDMETHOD_(long, get_LocaleID)();
- STDMETHOD_(int, get_MajorVersion)();
- STDMETHOD_(int, get_MinorVersion)();
- STDMETHOD_(BSTR, get_GUIDAsString)();
- STDMETHOD_(ICollection FAR*, get_TypeInfos)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPELIB ptlib, CTypeLibrary FAR* FAR* ppTypeLibrary); // Creates and intializes TypeLibrary object
- CTypeLibrary();
- ~CTypeLibrary();
-
- private:
- BSTR m_bstrName; // Type Library name
- BSTR m_bstrDocumentation; // Documentation
- unsigned long m_ulHelpContext; // HelpContext
- BSTR m_bstrHelpFile; // HelpFile
- GUID m_guid; // GUID
- LPOLESTR m_pszGUID; // String form of GUID
- LCID m_lcid; // Locale ID
- unsigned short m_wMajorVer; // Major version
- unsigned short m_wMinorVer; // Minor version
- LPTYPELIB m_ptlib; // ITypeLib* of type library.
- LPDISPATCH m_pdispTypeInfos; // Collection of typeinfos contained by this typelib
- };
-
- // CTypeInfo is the base class for all the TypeInfos (CInterface, CDispinterface,
- // CModule, CCoClass, CEnum, CStruct, CUnion, CAlias)
- class FAR CTypeInfo : public ITypeInformation
- {
- public:
- // ITypeInfo automation exposed properties & methods
- STDMETHOD_(BSTR, get_Name)();
- STDMETHOD_(BSTR, get_Documentation)();
- STDMETHOD_(long, get_HelpContext)();
- STDMETHOD_(BSTR, get_HelpFile)();
- STDMETHOD_(TYPEKIND, get_TypeInfoKind)();
- STDMETHOD_(short, get_TypeFlags)();
- STDMETHOD_(BSTR, get_GUIDAsString)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- STDMETHOD(_InitTypeInfo)(LPTYPEINFO ptinfo); // Called by derived class to intialize this base class
- static HRESULT Create(LPTYPEINFO ptinfo, CTypeInfo FAR* FAR* ppTypeInfo); // Creates and intializes TypeInfo object
- CTypeInfo();
- ~CTypeInfo();
-
- protected:
- short m_wTypeFlags; // TYPEFLAGS
-
- private:
- BSTR m_bstrName; // TypeInfo name
- BSTR m_bstrDocumentation; // Documentation
- unsigned long m_ulHelpContext; // Help context
- BSTR m_bstrHelpFile; // Help file
- TYPEKIND m_typekind; // Type of TypeInfo. See TYPEKIND enumeration.
- GUID m_guid; // GUID
- LPOLESTR m_pszGUID; // String form of GUID
- };
-
- class FAR CInterface : public CTypeInfo
- {
- public:
- // IInterface automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Functions)();
- STDMETHOD_(IInterface FAR*, get_BaseInterface)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CInterface FAR* FAR* ppInterface); // Creates and intializes Interface object
- CInterface();
- ~CInterface();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of interface typeinfo.
- LPDISPATCH m_pdispFunctions; // Collection of functions in interface.
- LPDISPATCH m_pdispBaseInterface; // Base interface of this interface.
- };
-
- class FAR CDispinterface : public CTypeInfo
- {
- public:
- // IDispinterface automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Properties)();
- STDMETHOD_(ICollection FAR*, get_Methods)();
- STDMETHOD_(IInterface FAR*, get_Interface)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CDispinterface FAR* FAR* ppDispinterface); // Creates and intializes Dispinterface object
- CDispinterface();
- ~CDispinterface();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of dispinterface typeinfo.
- LPDISPATCH m_pdispProperties; // Collection of properties in dispinterface
- LPDISPATCH m_pdispMethods; // Collection of methods in dispinterface
- LPDISPATCH m_pdispInterface; // Interface part of dual interface, if this is a dual interface
- };
-
- class FAR CModule : public CTypeInfo
- {
- public:
- // IModule automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Functions)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CModule FAR* FAR* ppInterface); // Creates and intializes Module object
- CModule();
- ~CModule();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of module typeinfo.
- LPDISPATCH m_pdispFunctions; // Collection of functions in module
- };
-
- class FAR CCoClass : public CTypeInfo
- {
- public:
- // ICoClass automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Interfaces)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CCoClass FAR* FAR* ppCoClass); // Creates and intializes CoClass object
- CCoClass();
- ~CCoClass();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of coclass typeinfo.
- LPDISPATCH m_pdispInterfaces; // Collection of interfaces/dispinterfaces in coclass
- };
-
- class FAR CEnum : public CTypeInfo
- {
- public:
- // IEnum automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Elements)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CEnum FAR* FAR* ppEnum); // Creates and intializes Enum object
- CEnum();
- ~CEnum();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of enum typeinfo.
- LPDISPATCH m_pdispElements; // Collection of elements in enum.
- };
-
- class FAR CStruct : public CTypeInfo
- {
- public:
- // IStruct automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Members)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CStruct FAR* FAR* ppStruct); // Creates and intializes Struct object
- CStruct();
- ~CStruct();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of struct typeinfo.
- LPDISPATCH m_pdispMembers; // Collection of members in struct.
- };
-
- class FAR CUnion : public CTypeInfo
- {
- public:
- // IUnion automation exposed properties & methods
- STDMETHOD_(ICollection FAR*, get_Members)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CUnion FAR* FAR* ppUnion); // Creates and intializes Struct object
- CUnion();
- ~CUnion();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of union typeinfo.
- LPDISPATCH m_pdispMembers; // Collection of members in union.
- };
-
-
- class FAR CAlias : public CTypeInfo
- {
- public:
- // IAlias automation exposed properties & methods
- STDMETHOD_(ITypeDesc FAR*, get_BaseType)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, CAlias FAR* FAR* ppAlias); // Creates and intializes Alias object
- CAlias();
- ~CAlias();
-
- private:
- LPTYPEINFO m_ptinfo; // ITypeInfo* of alias typeinfo.
- LPDISPATCH m_pdispTypeDescBase; // IDispatch of ITypeDesc which describes the base type of this alias.
- };
-
- // CFunction represents all functions (including methods).
- class FAR CFunction : public IFunction
- {
- public:
- // IFunction automation exposed properties & methods
- STDMETHOD_(BSTR, get_Name)();
- STDMETHOD_(BSTR, get_Documentation)();
- STDMETHOD_(long, get_HelpContext)();
- STDMETHOD_(BSTR, get_HelpFile)();
- STDMETHOD_(ITypeDesc FAR*, get_ReturnType)();
- STDMETHOD_(ICollection FAR*, get_Parameters)();
- STDMETHOD_(MEMBERID, get_Memberid)();
- STDMETHOD_(CALLCONV, get_CallConvention)();
- STDMETHOD_(FUNCKIND, get_FuncKind)();
- STDMETHOD_(INVOKEKIND, get_InvocationKind)();
- STDMETHOD_(short, get_NumberOfOptionalParams)();
- STDMETHOD_(short, get_OffsetInVtbl)();
- STDMETHOD_(unsigned short, get_FuncFlags)();
- STDMETHOD_(OBJTYPE, get_Kind)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, unsigned short nIndex, CFunction FAR* FAR* ppFunction); // Creates and intializes Function object
- CFunction();
- ~CFunction();
-
- private:
- BSTR m_bstrName; // Function name.
- BSTR m_bstrDocumentation; // Documentation.
- unsigned long m_ulHelpContext; // Help context.
- BSTR m_bstrHelpFile; // Help file.
- LPDISPATCH m_pdispTypeDesc; // IDispatch of ITypeDesc that described return type.
- LPDISPATCH m_pdispParameters; // Collection of parameters function.
- LPFUNCDESC m_pfuncdesc; // FUNCDESC of function.
- LPTYPEINFO m_ptinfoFunction; // TypeInfo of which this function is an element.
- };
-
- // CProperty represents dispinterface properties and structure & union members.
- class FAR CProperty : public IProperty
- {
- public:
- // IProperty automation exposed properties & methods
- STDMETHOD_(BSTR, get_Name)();
- STDMETHOD_(BSTR, get_Documentation)();
- STDMETHOD_(long, get_HelpContext)();
- STDMETHOD_(BSTR, get_HelpFile)();
- STDMETHOD_(ITypeDesc FAR*, get_Type)();
- STDMETHOD_(MEMBERID, get_Memberid)();
- STDMETHOD_(OBJTYPE, get_Kind)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, LPVARDESC pvardesc, CProperty FAR* FAR* ppProperty); // Creates and intializes Property object
- CProperty();
- ~CProperty();
-
- private:
- BSTR m_bstrName; // Property name.
- BSTR m_bstrDocumentation; // Documentation.
- unsigned long m_ulHelpContext; // Help Context.
- BSTR m_bstrHelpFile; // Helpfile.
- MEMBERID m_memid; // MEMBERID of property.
- LPDISPATCH m_pdispTypeDesc; // ITypeDesc that describes type of property.
- };
-
- class FAR CConstant : public IConstant
- {
- public:
- // IConstant automation exposed properties & methods
- STDMETHOD_(BSTR, get_Name)();
- STDMETHOD_(BSTR, get_Documentation)();
- STDMETHOD_(long, get_HelpContext)();
- STDMETHOD_(BSTR, get_HelpFile)();
- STDMETHOD_(ITypeDesc FAR*, get_Type)();
- STDMETHOD_(VARIANT, get_Value)();
- STDMETHOD_(MEMBERID, get_Memberid)();
- STDMETHOD_(OBJTYPE, get_Kind)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, LPVARDESC pvardesc, CConstant FAR* FAR* ppConstant); // Creates and intializes Constant object
- CConstant();
- ~CConstant();
-
- private:
- BSTR m_bstrName; // Constant name
- BSTR m_bstrDocumentation; // Documentation
- unsigned long m_ulHelpContext; // Help context
- BSTR m_bstrHelpFile; // Helpfile
- LPDISPATCH m_pdispTypeDesc; // ITypeDesc that describes type of constant.
- MEMBERID m_memid; // MEMBERID.
- VARIANT m_vValue; // Constant value.
- };
-
- class FAR CParameter : public IParameter
- {
- public:
- // IParameter automation exposed properties & methods
- STDMETHOD_(BSTR, get_Name)();
- STDMETHOD_(ITypeDesc FAR*, get_Type)();
- STDMETHOD_(int, get_IDLFlags)();
- STDMETHOD_(OBJTYPE, get_Kind)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, BSTR bstrName, TYPEDESC FAR* ptypedesc,
- IDLDESC FAR* pidldesc, CParameter FAR* FAR* ppParameter); // Creates and intializes Parameter object
- CParameter();
- ~CParameter();
-
- private:
- BSTR m_bstrName; // Parameter name.
- unsigned short m_wIDLFlags; // specifies in/out/in-out/none
- LPDISPATCH m_pdispTypeDesc; // ITypeDesc* that describes type of parameter.
- };
-
- // Describes a type
- class FAR CTypeDesc : public ITypeDesc
- {
- public:
- // ITypeDesc automation exposed properties & methods
- STDMETHOD_(short, get_Type)();
- STDMETHOD_(ITypeInformation FAR*, get_UserDefinedDesc)();
- STDMETHOD_(IArrayDesc FAR*, get_ArrayDesc)();
- STDMETHOD_(ITypeDesc FAR*, get_PointerDesc)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, TYPEDESC FAR* ptypedesc, CTypeDesc FAR* FAR* ppTypeDesc); // Creates and intializes TypeDesc object
- CTypeDesc();
- ~CTypeDesc();
-
- private:
- VARTYPE m_vartype; // Type
- LPDISPATCH m_pdispUserDefinedDesc; // If m_vartype==VT_USERDEFINED, contains ITypeInformation* of user-defined type.,
- LPDISPATCH m_pdispArrayDesc; // if m_vartype==VT_CARRAY, contains IArrayDesc*
- LPDISPATCH m_pdispPointerDesc; // if m_vartype==VT_PTR contains ITypeDesc* of type pointed to.
- };
-
- // Describes C-Style array
- class FAR CArrayDesc : public IArrayDesc
- {
- public:
- // IArrayDesc automation exposed properties & methods
- STDMETHOD_(ITypeDesc FAR*, get_ElementType)();
- STDMETHOD_(ICollection FAR*, get_ArrayBounds)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(LPTYPEINFO ptinfo, ARRAYDESC FAR* parraydesc, CArrayDesc FAR* FAR* ppArrayDesc); // Creates and intializes ArrayDesc object
- CArrayDesc();
- ~CArrayDesc();
-
- private:
- LPDISPATCH m_pdispTypeDescElement; // ITypeDesc that descibed type of array element.
- LPDISPATCH m_pdispArrayBounds; // IArrayBound that describes array bounds.
- };
-
- class FAR CArrayBound : public IArrayBound
- {
- public:
- // IArrayBound automation exposed properties & methods
- STDMETHOD_(long, get_ElementsCount)();
- STDMETHOD_(long, get_LowerBound)();
-
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(unsigned long cElements, long lLBound, CArrayBound FAR* FAR* ppArrayBound); // Creates and intializes ArrayBound object
-
- private:
- unsigned long m_cElements; // Count of elements in array.
- long m_lLBound; // Lower bound of array.
- };
-
- // Generic collection class that holds all collections.
- class FAR CCollection : public ICollection
- {
- public:
- // ICollection automation exposed properties & methods
- STDMETHOD_(long, get_Count)();
- STDMETHOD_(LPDISPATCH, get_Item)(long lIndex);
- STDMETHOD_(LPUNKNOWN, get__NewEnum)();
-
- // CCollection methods
- STDMETHOD_(void, Add)(LPDISPATCH pdispItem);
- STDMETHOD_(REFCLSID, GetInterfaceID)();
- static HRESULT Create(ULONG lMaxSize, long lLBound, CCollection FAR* FAR* ppCollection); // Creates and intializes Collection object
- CCollection();
- ~CCollection();
-
- private:
- SAFEARRAY FAR *m_psa; // Safe array that holds Collection collection items.
- ULONG m_cElements; // Number of items in Collection collection.
- ULONG m_cMax; // Maximum number of items Collection collection can hold.
- long m_lLBound; // Lower bound of index of Collection collection.
- };
-
- class FAR CEnumVariant : public IEnumVARIANT
- {
- public:
- // IUnknown methods
- STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppvObj);
- STDMETHOD_(ULONG, AddRef)();
- STDMETHOD_(ULONG, Release)();
-
- // IEnumVARIANT methods
- STDMETHOD(Next)(ULONG cElements, VARIANT FAR* pvar, ULONG FAR* pcElementFetched);
- STDMETHOD(Skip)(ULONG cElements);
- STDMETHOD(Reset)();
- STDMETHOD(Clone)(IEnumVARIANT FAR* FAR* ppenum);
-
- static HRESULT Create(SAFEARRAY FAR*, ULONG, CEnumVariant FAR* FAR*); // Creates and intializes Enumerator
- CEnumVariant();
- ~CEnumVariant();
-
- private:
- ULONG m_cRef; // Reference count
- ULONG m_cElements; // Number of elements in enumerator.
- long m_lLBound; // Lower bound of index.
- long m_lCurrent; // Current index.
- SAFEARRAY FAR* m_psa; // Safe array that holds elements.
- };
-