- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
(extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
BT game source (never mixed into CODE/). Round 1-3 state:
* 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
(BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
since 1996.
* BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
its binary-recorded line 400 exactly.
* BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
(Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
TeamScore=12 flagged [T4]).
* MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
(VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
the period compiler is the drift detector).
* Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
(per-TU verification sweep under authentic OPT.MAK flags).
* README: corrected roadmap - MECH.HPP is the capstone grown with the mech
TU reconstructions; BTREG.CPP green = the header-family milestone.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
361 lines
14 KiB
C++
361 lines
14 KiB
C++
//
|
|
//----------------------------------------------------------------------------
|
|
// 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 <ocf/autodefs.h>
|
|
#endif
|
|
#if !defined(OSL_GEOMETRY_H)
|
|
# include <osl/geometry.h> // 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 <usage> 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 <docflags>
|
|
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 T> 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 <class T> T*
|
|
TOcAutoFactory<T>::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 <class T> int
|
|
TOcAutoFactory<T>::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 <class T> void
|
|
TOcAutoFactory<T>::DestroyApp(T* app)
|
|
{
|
|
delete app;
|
|
}
|
|
|
|
//
|
|
// Main Create callback function called to create app
|
|
//
|
|
template <class T> IUnknown*
|
|
TOcAutoFactory<T>::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<T>(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 <ocf/appdesc.h> // 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
|
|
|