home *** CD-ROM | disk | FTP | other *** search
/ C Programming Starter Kit 2.0 / SamsPublishing-CProgrammingStarterKit-v2.0-Win31.iso / bc45 / ocfinc.pak / APPDESC.H next >
C/C++ Source or Header  |  1997-07-23  |  13KB  |  267 lines

  1. //
  2. //----------------------------------------------------------------------------
  3. // ObjectComponents
  4. // (C) Copyright 1994 by Borland International, All Rights Reserved
  5. //
  6. //   TAppDescriptor - OLE application descriptor definitions
  7. //----------------------------------------------------------------------------
  8. #if !defined(OCF_APPDESC_H)
  9. #define OCF_APPDESC_H
  10.  
  11. #if !defined(OCF_AUTODEFS_H)
  12. # include <ocf/autodefs.h>
  13. #endif
  14.  
  15. //____________________________________________________________________________
  16. //
  17. // TAppDescriptor - application registration and browsing facilities
  18. //____________________________________________________________________________
  19.  
  20. class _ICLASS TServedObject;
  21. class _ICLASS TTypeLibrary;
  22. class _ICLASS TCoClassInfo;
  23. class _BIDSCLASS TRegLink;
  24.  
  25. typedef IUnknown*
  26. (*TComponentFactory)(IUnknown* outer, uint32 options, uint32 id = 0);
  27.  
  28. class _ICLASS TAppDescriptor : public IClassFactory {
  29.   public:
  30.     TAppDescriptor(TRegList& regInfo, TComponentFactory callback,
  31.                    string& cmdLine, HINSTANCE hInst = _hInstance,
  32.                    const TRegLink* regLink = 0);
  33.    ~TAppDescriptor();
  34.     operator IUnknown*() {return this;}
  35.     bool IsAutomated() const {return ClassCount > 0;}
  36.     TComponentFactory GetFactory() const {return FactoryCallback;}
  37.     const TRegLink* GetRegLinkHead() const {return LinkHead;}
  38.  
  39.     // Command line options accessors
  40.     bool IsOptionSet(uint32 option) const {return ToBool(Options&option);}
  41.     uint32 GetOptions() const {return Options;}
  42.     void SetOption(uint32 bit, bool state) {if (state) Options |= bit; else Options &= ~bit;}
  43.     void ProcessCmdLine(string& cmdLine);
  44.     void SetLangId(TLangId prevLang, const char* langIdStr);
  45.  
  46.     // Registration management functions
  47.     void RegisterClass();
  48.     void UnregisterClass();
  49.     bool RegisterObject(TObjectDescriptor app);
  50.     void UnregisterObject();
  51.     TClassId GetLinkGuid(int index);
  52.     void RegisterServer(TLangId lang, const char* regFile = 0);
  53.     void UnregisterServer(TLangId lang = 0, const char* = 0);
  54.     void MakeTypeLib(TLangId lang, const char* = 0);
  55.  
  56.     // TAutoClass management functions
  57.     void MergeAutoClasses();
  58.  
  59.     // TypeLibrary management functions
  60.     ITypeLib*   GetTypeLibrary();  // caller MUST do a Release()
  61.     ITypeInfo*  CreateITypeInfo(TAutoClass& cls);  // caller must release
  62.     int         GetClassCount() {return ClassCount;}
  63.     TLangId     GetAppLang() {return AppLang;}
  64.     int         GetClassIndex(TAutoClass* cls);  // returns -1 if not found
  65.     bool        GetClassId(TAutoClass* cls, GUID& retId);
  66.     TAutoClass* GetAutoClass(unsigned index);
  67.     TAutoClass* GetAutoClass(const GUID far& clsid);
  68.     TRegLink*   GetRegLink(const GUID far& clsid);
  69.     uint16      GetVersionField(uint field);
  70.     const char* GetAppName(TLangId lang) {return AppName->Translate(lang);}
  71.     const char* GetAppDoc(TLangId lang)  {return AppDoc->Translate(lang);}
  72.     const char* GetHelpFile(TLangId lang){return HelpFile->Translate(lang);}
  73.     void        WriteTypeLibrary(TLangId lang, const char far* file);
  74.  
  75.     // TServedObject management functions
  76.     TUnknown*      CreateAutoApp(TObjectDescriptor app, uint32 options,
  77.                                  IUnknown* outer=0);
  78.     void           ReleaseAutoApp(TObjectDescriptor app);
  79.     TUnknown*      CreateAutoObject(TObjectDescriptor obj, TServedObject& app,
  80.                                     IUnknown* outer=0);
  81.     TUnknown*      CreateAutoObject(const void* obj, const typeinfo& objInfo,
  82.                                     const void* app, const typeinfo& appInfo,
  83.                                     IUnknown* outer=0);
  84.     TServedObject* FindServed(const void far* mostDerivedObj);
  85.     TServedObject* FindServed(TObjectDescriptor& objDesc);
  86.     void AddServed(TServedObject& obj);
  87.     void RemoveServed(TServedObject& obj);
  88.     void InvalidateObject(const void far* obj);
  89.     void ReleaseObject(const void far* obj);
  90.     bool IsBound() {return static_cast<bool>(ServedList != 0 || LockCount != 0);}
  91.     bool IsActiveObject(TServedObject* obj) {return ActiveObject == obj;}
  92.     void FlushServed();
  93.  
  94.     TBaseClassId  AppClassId;
  95.  
  96.   private:
  97.     void           Init(IMalloc* alloc = 0);  // called only from constructor
  98.     TServedObject* ServedList;   // list of outstanding IDispatch/ITypeInfo objs
  99.     TServedObject* ActiveObject;   // currently registered active object
  100.     TRegList&      RegInfo;        // registration list for application
  101.     const char*    Version;        // library version, stored as text string
  102.     TLocaleString* AppProgId;      // progid of application
  103.     TLocaleString* AppName;        // name of application, localizable
  104.     TLocaleString* AppDoc;         // description of application, localizable
  105.     TLocaleString* HelpFile;       // name of help file, localizable
  106.     TAutoClass::TAutoClassRef*
  107.                    ClassList;      // array of automated class references
  108.     int            ClassCount;     // count of classes, set when first scanned
  109.     int            DebugGuidOffset;// GUID offset for /Debug registration
  110.     int            LibGuidOffset;  // GUID offset for the app library
  111.     int            LinkGuidOffset; // GUID offset for the first doc template
  112.     int            LinkGuidCount;  // count of GUIDs assigned to doc templates
  113.     TLangId        AppLang;        // language Id for this running instance
  114.     TTypeLibrary*  TypeLib;        // type library, only while referenced
  115.     const TRegLink* LinkHead;      // reglink list of reglists to register
  116.     TComponentFactory FactoryCallback;  // callback to create/destroy instance
  117.     HINSTANCE      AppInstance;
  118.     unsigned long  RefCnt;
  119.     unsigned       LockCount;
  120.     unsigned long  RegClassHdl;    // for unregistration
  121.     unsigned long  RegObjectHdl;   // for unregistration
  122.     uint32         Options;        // Command line option bit flags
  123.  
  124.     // for EXE or DLL component main, provide direct access for destructors
  125.     // for auxilliary DLLs, a table must be maintained of AppDesc vs. task Id
  126.     //
  127.     static TAppDescriptor* This; // set by constructor to component instance
  128.  
  129.     // IUnknown interface
  130.     HRESULT _IFUNC QueryInterface(const IID far& iid, void far* far* retIface);
  131.     unsigned long _IFUNC AddRef();
  132.     unsigned long _IFUNC Release();
  133.  
  134.   public:
  135.  
  136.     // IClassFactory interface
  137.     HRESULT _IFUNC CreateInstance(IUnknown* outer, const IID FAR& iid,
  138.                                   void far* far* retObject);
  139.     HRESULT _IFUNC LockServer(BOOL lock);
  140.  
  141.   friend class _ICLASS TTypeLibrary;
  142.   friend class _ICLASS TCoClassInfo;
  143.   friend TAppDescriptor* GetAppDescriptor();
  144. };
  145.  
  146. //
  147. // for EXE and DLL component main module, provide direct access to descriptor
  148. // for auxilliary DLLs, must use table of app descriptor vs. task Id
  149. //
  150. inline TAppDescriptor* GetAppDescriptor() {return TAppDescriptor::This;}
  151.  
  152. class _ICLASS TTypeLibrary : public ITypeLib {
  153.   public:
  154.     TTypeLibrary(TAppDescriptor& appDesc, TLangId lang);
  155.    ~TTypeLibrary();
  156.     operator IUnknown&() {return *this;}
  157.     ITypeInfo*  CreateCoClassInfo();// component typeinfo, caller must release
  158.  
  159.   private:
  160.     TAppDescriptor& AppDesc;
  161.     unsigned long   RefCnt;
  162.     TLangId         Lang;
  163.     uint16          CoClassFlags;      // type flags combined from autoclasses
  164.     int             CoClassImplCount;  // number of interfaces in coclass
  165.  
  166.     // IUnknown interface
  167.     HRESULT _IFUNC QueryInterface(const IID far& iid, void far* far* retIface);
  168.     unsigned long _IFUNC AddRef();
  169.     unsigned long _IFUNC Release();
  170.  
  171.     // ITypeLib interface
  172.     unsigned int _IFUNC GetTypeInfoCount();
  173.     HRESULT _IFUNC GetTypeInfo(unsigned index, ITypeInfo* far* retInfo);
  174.     HRESULT _IFUNC GetTypeInfoType(unsigned index, TYPEKIND far* retKind);
  175.     HRESULT _IFUNC GetTypeInfoOfGuid(const GUID far& guid,
  176.                                      ITypeInfo* far* retInfo);
  177.     HRESULT _IFUNC GetLibAttr(TLIBATTR far* far* retAttr);
  178.     HRESULT _IFUNC GetTypeComp(ITypeComp* far* retComp);
  179.     HRESULT _IFUNC GetDocumentation(int index, BSTR far* retName,
  180.                                     BSTR far* retDoc,
  181.                                     unsigned long far* retHelpContext,
  182.                                     BSTR far* retHelpFile);
  183.     HRESULT _IFUNC IsName(OLECHAR far* nameBuf, unsigned long hashVal,
  184.                           int far* retFound);
  185.     HRESULT _IFUNC FindName(OLECHAR far* nameBuf, unsigned long lHashVal,
  186.                             ITypeInfo* far* retInfo, MEMBERID far* retId,
  187.                             unsigned short far* inoutCount);
  188.     void    _IFUNC ReleaseTLibAttr(TLIBATTR far* attr);
  189. };
  190.  
  191. class _ICLASS TCoClassInfo : public ITypeInfo {
  192.   public:
  193.     TCoClassInfo(TAppDescriptor& appDesc, uint16 typeFlags, int implCount);
  194.    ~TCoClassInfo();
  195.     operator IUnknown&() {return *this;}
  196.  
  197.   private:
  198.     TAppDescriptor& AppDesc;
  199.     unsigned long   RefCnt;
  200.     uint16          TypeFlags;   // type flags combined from autoclasses
  201.     int             ImplCount;   // number of interfaces in coclass
  202.     unsigned*       ImplList;    // array of indices to autoclasses        
  203.     int             Default;     // interface marked as default
  204.     int             DefaultEvent;// event interface marked as default,source
  205.  
  206.     // IUnknown interface
  207.     HRESULT _IFUNC QueryInterface(const IID far& iid, void far* far* retIface);
  208.     unsigned long _IFUNC AddRef();
  209.     unsigned long _IFUNC Release();
  210.  
  211.     // ITypeInfo implementation
  212.     HRESULT _IFUNC GetTypeAttr(TYPEATTR far* far* pptypeattr);
  213.     HRESULT _IFUNC GetTypeComp(ITypeComp* far* pptcomp);
  214.     HRESULT _IFUNC GetFuncDesc(unsigned int index, FUNCDESC far* far* ppfuncdesc);
  215.     HRESULT _IFUNC GetVarDesc(unsigned int index, VARDESC far* far* ppvardesc);
  216.     HRESULT _IFUNC GetNames(MEMBERID memid, BSTR far* rgbstrNames,
  217.                             unsigned int cMaxNames,
  218.                             unsigned int far* pcNames);
  219.     HRESULT _IFUNC GetRefTypeOfImplType(unsigned int index, HREFTYPE far* phreftype);
  220.     HRESULT _IFUNC GetImplTypeFlags(unsigned int index, int far* pimpltypeflags);
  221.     HRESULT _IFUNC GetIDsOfNames(OLECHAR far* far* rgszNames,
  222.                                  unsigned int cNames,
  223.                                  MEMBERID far* rgmemid);
  224.     HRESULT _IFUNC Invoke(void far* pvInstance, MEMBERID memid,
  225.                           unsigned short wFlags,
  226.                           DISPPARAMS far *pdispparams,
  227.                           VARIANT far *pvarResult,
  228.                           EXCEPINFO far *pexcepinfo,
  229.                           unsigned int far *puArgErr);
  230.     HRESULT _IFUNC GetDocumentation(MEMBERID memid,
  231.                                     BSTR far* pbstrName,
  232.                                     BSTR far* pbstrDocString,
  233.                                     ulong far* pdwHelpContext,
  234.                                     BSTR far* pbstrHelpFile);
  235.     HRESULT _IFUNC GetDllEntry(MEMBERID memid, INVOKEKIND invkind,
  236.                                BSTR far* pbstrDllName,
  237.                                BSTR far* pbstrName,
  238.                                unsigned short far* pwOrdinal);
  239.     HRESULT _IFUNC GetRefTypeInfo(HREFTYPE hreftype,
  240.                                   ITypeInfo* far* pptinfo);
  241.     HRESULT _IFUNC AddressOfMember(MEMBERID memid, INVOKEKIND invkind,
  242.                                    void far* far* ppv);
  243.     HRESULT _IFUNC CreateInstance(IUnknown* punkOuter, const IID far& riid,
  244.                                   void far* far* ppvObj);
  245.     HRESULT _IFUNC GetMops(MEMBERID memid, BSTR far* pbstrMops);
  246.     HRESULT _IFUNC GetContainingTypeLib(ITypeLib* far* pptlib,
  247.                                         uint far* pindex);
  248.     void _IFUNC ReleaseTypeAttr(TYPEATTR far* ptypeattr);
  249.     void _IFUNC ReleaseFuncDesc(FUNCDESC far* pfuncdesc);
  250.     void _IFUNC ReleaseVarDesc(VARDESC far* pvardesc);
  251. };
  252.  
  253. //
  254. // external entry points for DLL servers
  255. //
  256. typedef HRESULT STDAPICALLTYPE (*TDllCanUnloadNow)();
  257. typedef HRESULT STDAPICALLTYPE (*TDllGetClassObject)(const GUID far& clsid,
  258.                                                      const GUID far& iid,
  259.                                                      void far* far* retObj);
  260. typedef HRESULT STDAPICALLTYPE (*TDllRegisterServer)();
  261. typedef HRESULT STDAPICALLTYPE (*TDllUnregisterServer)();
  262. typedef HRESULT STDAPICALLTYPE (*TDllRegisterCommand)(const char far* cmdLine);
  263.  
  264. #endif // OCF_APPDESC_H
  265.  
  266.  
  267.