// //---------------------------------------------------------------------------- // ObjectComponents // (C) Copyright 1994 by Borland International, All Rights Reserved // // OLE Registration definitions //---------------------------------------------------------------------------- #if !defined(OCF_OCREG_H) #define OCF_OCREG_H #if !defined(OCF_AUTODEFS_H) # include #endif #if !defined(OSL_GEOMETRY_H) # include // defines TPointer #endif class _EXPCLASS istream; class _EXPCLASS ostream; //____________________________________________________________________________ // // TXRegistry - Windows Registry related exception object //____________________________________________________________________________ class TXRegistry : public TXBase { public: TXRegistry(const char* msg, const char* key); TXRegistry(const TXRegistry& copy); static void Check(long stat, const char* key); const char* Key; }; inline TXRegistry::TXRegistry(const char* msg, const char* key) : TXBase(msg), Key(key) {} inline TXRegistry::TXRegistry(const TXRegistry& src) : TXBase(src), Key(src.Key) {} //____________________________________________________________________________ // // Clipboard and registry data transfer format definitions //____________________________________________________________________________ const int ocrVerbLimit = 8; // maximum number of verbs registered per class const int ocrFormatLimit = 8; // maximum number of data formats per class // format: standard clipboard numeric format, or name of custom format // enum ocrClipFormat { ocrText = 1, // CF_TEXT ocrBitmap = 2, // CF_BITMAP ocrMetafilePict = 3, // CF_METAFILEPICT ocrSylk = 4, // CF_SYLK ocrDif = 5, // CF_DIF ocrTiff = 6, // CF_TIFF ocrOemText = 7, // CF_OEMTEXT ocrDib = 8, // CF_DIB ocrPalette = 9, // CF_PALETTE ocrPenData = 10, // CF_PENDATA ocrRiff = 11, // CF_RIFF ocrWave = 12, // CF_WAVE ocrUnicodeText = 13, // CF_UNICODETEXT Win32 only ocrEnhMetafile = 14, // CF_ENHMETAFILE Win32 only }; #define ocrRichText "Rich Text Format" #define ocrEmbedSource "Embed Source" #define ocrEmbeddedObject "Embedded Object" #define ocrLinkSource "Link Source" #define ocrObjectDescriptor "Object Descriptor" #define ocrLinkSrcDescriptor "Link Source Descriptor" // aspect: view types supported by transfer // enum ocrAspect { ocrContent = 1, // DVASPECT_CONTENT normal display representation ocrThumbnail = 2, // DVASPECT_THUMBNAIL picture appropriate for browser ocrIcon = 4, // DVASPECT_ICON iconized representation of object ocrDocPrint = 8, // DVASPECT_DOCPRINT print preview representation }; // medium: means of data transfer // enum ocrMedium { ocrNull = 0, ocrHGlobal = 1, // TYMED_HGLOBAL global memory handle ocrFile = 2, // TYMED_FILE data as contents of file ocrIStream = 4, // TYMED_ISTREAM instance of an IStream object ocrIStorage = 8, // TYMED_ISTORAGE streams within an instance of IStorage ocrGDI = 16, // TYMED_GDI GDI object in global handle ocrMfPict = 32, // TYMED_MFPICT CF_METAFILEPICT containing global handle ocrStaticMed = 1024 // OLE 2 static object }; // direction: transfer directions supported // enum ocrDirection { ocrGet = 1, ocrSet = 2, ocrGetSet = 3, }; //____________________________________________________________________________ // // Miscellaneous registry definitions //____________________________________________________________________________ // IOleObject miscellaneous status flags, defined for each or all aspects // enum ocrObjectStatus { ocrRecomposeOnResize = 1, // request redraw on container resize ocrOnlyIconic = 2, // only useful context view is Icon ocrInsertNotReplace = 4, // should not replace current select. ocrStatic = 8, // object is an OLE static object ocrCantLinkInside = 16, // should not be the link source ocrCanLinkByOle1 = 32, // only used in OBJECTDESCRIPTOR ocrIsLinkObject = 64, // set by OLE2 link for OLE1 compat. ocrInsideOut = 128, // can be activated concurrently ocrActivateWhenVisible = 256, // hint to cntnr when ocrInsideOut set ocrRenderingIsDeviceIndependent= 512, // no decisions made based on target ocrNoSpecialRendering = 512, // older enum for previous entry }; // IOleObject verb menu flags // enum ocrVerbMenuFlags { ocrGrayed = 1, // MF_GRAYED ocrDisabled = 2, // MF_DISABLED ocrChecked = 8, // MF_CHECKED ocrMenuBarBreak= 32, // MF_MENUBARBREAK ocrMenuBreak = 64, // MF_MENUBAR }; // IOleObject verb attribute flags // enum ocrVerbAttributes { ocrNeverDirties = 1, // verb can never cause object to become dirty ocrOnContainerMenu = 2, // only useful context view is Icon }; // Entries for registration parameter, class factory registration mode // #define ocrSingleUse "1" // single client per instance #define ocrMultipleUse "2" // multiple clients per instance #define ocrMultipleLocal "3" // multiple clients, separate inproc server long // returns numeric value of OcRegisterClass(TRegList& regInfo, // obj holding array of reg parameters HINSTANCE hInst, // 0 defaults to current task ostream& out, // open ostream to stream reg entries TLangId lang, // language for registration char* filter = 0, // internal use to restrict entries TRegItem* defaults = 0,// optional registration default list TRegItem* extra = 0); // optional registration override list int // returns error count, 0 if success OcUnregisterClass(TRegList& regInfo, // registration table used for register TRegItem* extra=0); // optional additional regitration item int OcRegistryValidate(istream& in); // returns number of mismatched entires void OcRegistryUpdate(istream& in); int // return: 0=no debug reg, -1=user clsid, 1=default used OcSetupDebugReg(TRegList& regInfo, // original registration list TRegItem* regDebug, // temp override list[DebugReplaceCount] TLangId lang, // language for registration char* clsid); // default temp debug clsid string buf const int DebugRegCount = 4+1; // replacements + room for terminator extern char AppDebugFilter[]; // templates needed for debug app reg extern char DocDebugFilter[]; // templates needed for debug doc reg extern TRegItem OcRegNoDebug[]; // override list to shut off "debugger" extern TRegItem OcRegNotDll[]; // override to shut off EXE-only items //____________________________________________________________________________ // // TRegistrar - Application registration manager interface class //____________________________________________________________________________ // application running mode and registration flags // these are initialized when processing command line or registration requests // the application's copy of the initial option flags is dynamically updated // enum TOcAppMode { amRegServer = 0x0001, // complete registration database update requested amUnregServer = 0x0002, // registration database unregistration requested amAutomation = 0x0004, // set from cmdline when EXE lauched for automation amEmbedding = 0x0008, // cmdline, overridden per Instance if embedded DLL amLangId = 0x0010, // user registration requested a particular LangId amTypeLib = 0x0020, // requested typelib to be generated and registered amDebug = 0x0040, // user requested launching for debugging amNoRegValidate= 0x0080, // user request to suppress registry validation amExeModule = 0x0100, // set for EXE components, 0 if DLL inproc server amExeMode = 0x0200, // may be overridden per instance if running DLL amServedApp = 0x0400, // per instance flag, app refcnt held by container amSingleUse = 0x0800, // set from app reg, may be forced on per instance amQuietReg = 0x1000, // suppress error UI during registration processing amRun = 0x2000, // set in factory call to run application msg loop amShutdown = 0x4000, // set in factory call to shutdown/delete app amAnyRegOption = amRegServer | amUnregServer | amTypeLib, }; typedef IUnknown* (*TComponentFactory)(IUnknown* outer, uint32 options, uint32 id = 0); class _ICLASS TAppDescriptor; class _ICLASS TRegistrar { public: TRegistrar(TRegList& regInfo, TComponentFactory callback, string& cmdLine, HINSTANCE hInst = ::_hInstance); virtual ~TRegistrar(); TUnknown* CreateAutoApp(TObjectDescriptor app, uint32 options, IUnknown* outer=0); void ReleaseAutoApp(TObjectDescriptor app); TUnknown* CreateAutoObject(TObjectDescriptor doc, TServedObject& app, IUnknown* outer=0); TUnknown* CreateAutoObject(const void* obj, const typeinfo& objInfo, const void* app, const typeinfo& appInfo, IUnknown* outer=0); virtual void far* GetFactory(const GUID& clsid, const GUID far& iid); virtual int Run(); // run an instance of an app if it is an EXE virtual void Shutdown(IUnknown* releasedObj, uint32 options); virtual bool CanUnload(); static TRegistrar* GetNext(TRegistrar* reg);// walk linked list of registrars // Registration management functions void RegisterAppClass(); void UnregisterAppClass(); // Command line options accessors bool IsOptionSet(uint32 option) const; uint32 GetOptions() const; void SetOption(uint32 bit, bool state); void ProcessCmdLine(string& cmdLine); TAppDescriptor& GetAppDescriptor() {return AppDesc;} // internal use protected: TRegistrar(TAppDescriptor& appDesc); TAppDescriptor& AppDesc; private: static TRegistrar* RegistrarList; // linked list of registrar objects TRegistrar* Next; // next link in registrar list }; //____________________________________________________________________________ // // Factory for automated OLE components, no linking/embedding support //____________________________________________________________________________ template class TOcAutoFactory { public: operator TComponentFactory() {return Create;} // Callouts to allow replacement of individual creation steps // static T* CreateApp(HINSTANCE hInst, uint32 options); static int RunApp(T* app); static void DestroyApp(T* app); // Main Create callback function called to create app and/or object // static IUnknown* Create(IUnknown* outer, uint32 options, uint32 id); }; // // Called when the app is not found and needs to be created // template T* TOcAutoFactory::CreateApp(HINSTANCE hInst, uint32 options) { T* app = new T(hInst, options); return app; } // // Called to run the application message loop if an EXE, or DLL in amExeMode // template int TOcAutoFactory::RunApp(T* /*app*/) { MSG msg; while(GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } // // Called to destroy the application previously created // template void TOcAutoFactory::DestroyApp(T* app) { delete app; } // // Main Create callback function called to create app // template IUnknown* TOcAutoFactory::Create(IUnknown* outer, uint32 options, uint32 /*id*/) { static T* exeApp; // used to hold EXE object until OLE factory call T* app; IUnknown* ifc = 0; if (options & amShutdown) return (options & amServedApp) ? 0 : outer; if ((options & amAutomation) && (options & amServedApp)) { app = exeApp; // if EXE, retrieve app created on initial call from main } else { app = CreateApp(_hInstance, options); } if ((options & amAutomation) && !(options & amServedApp)) { exeApp = app; // if EXE, hold app until factory call when outer known } else { ifc = *::Registrar->CreateAutoApp(TAutoObjectDelete(app),options,outer); } if (options & amRun) { RunApp(app); DestroyApp(app); } // else DLL server, ifc will be released by controller, which deletes app return ifc; } //____________________________________________________________________________ #if !defined(OCF_APPDESC_H) # include // private for inline implementation only #endif inline TUnknown* TRegistrar::CreateAutoApp(TObjectDescriptor app, uint32 opts, IUnknown* outer) {return AppDesc.CreateAutoApp(app, opts, outer);} inline void TRegistrar::ReleaseAutoApp(TObjectDescriptor app) {AppDesc.ReleaseAutoApp(app);} inline TUnknown* TRegistrar::CreateAutoObject(TObjectDescriptor doc, TServedObject& app, IUnknown* outer) {return AppDesc.CreateAutoObject(doc, app, outer);} inline TUnknown* TRegistrar::CreateAutoObject(const void* obj, const typeinfo& objInfo, const void* app, const typeinfo& appInfo, IUnknown* outer) {return AppDesc.CreateAutoObject(obj, objInfo, app, appInfo, outer);} inline void TRegistrar::RegisterAppClass() {AppDesc.RegisterClass();} inline void TRegistrar::UnregisterAppClass() {AppDesc.UnregisterClass();} inline bool TRegistrar::IsOptionSet(uint32 option) const {return AppDesc.IsOptionSet(option);} inline uint32 TRegistrar::GetOptions() const {return AppDesc.GetOptions();} inline void TRegistrar::SetOption(uint32 bit, bool state) {AppDesc.SetOption(bit,state);} inline void TRegistrar::ProcessCmdLine(string& cmdLine) {AppDesc.ProcessCmdLine(cmdLine);} #endif // OCF_OCREG_H