- 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>
236 lines
7.7 KiB
C++
236 lines
7.7 KiB
C++
//----------------------------------------------------------------------------
|
|
// ObjectComponents - (C) Copyright 1994 by Borland International
|
|
// OLE registration test
|
|
//----------------------------------------------------------------------------
|
|
#include "ocf/ocreg.h"
|
|
#include "regtest.rh"
|
|
|
|
#if !defined(BI_PLAT_WIN16)
|
|
inline int GetTextExtent(HDC hDC, const char* buf, int len) {
|
|
SIZE s;
|
|
GetTextExtentPoint(hDC, buf, len, &s);
|
|
return s.cx; // return width portion
|
|
}
|
|
#endif
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Example registration tables
|
|
//____________________________________________________________________________
|
|
|
|
REGISTRATION_FORMAT_BUFFER(100)
|
|
|
|
BEGIN_REGISTRATION(myappreg)
|
|
REGDATA(clsid, "{01234567-1234-5678-1122-334455667788}")
|
|
REGDATA(progid, "MySample.Application.1")
|
|
REGDATA(description,"My Sample 1.0 Application")
|
|
REGDATA(appname, "My Sample 1.0")
|
|
REGDATA(cmdline, "/automation")
|
|
REGDATA(version, "1.2")
|
|
END_REGISTRATION
|
|
|
|
BEGIN_REGISTRATION(mydocreg)
|
|
REGDATA(description,"My Sample 1.0 Document")
|
|
REGDATA(extension, "myd")
|
|
REGDATA(directory, "c:\temp")
|
|
REGDATA(docfilter, "*.drw;*.drx")
|
|
REGDATA(debugger, "tdw -l")
|
|
REGDATA(clsid, "{01234568-1234-5678-1122-334455667788}")
|
|
REGDATA(progid, "MySample.Document.1")
|
|
REGDATA(menuname, "Document")
|
|
REGDATA(insertable,0)
|
|
REGDATA(usage, ocrMultipleUse)
|
|
REGDATA(verb0, "&Edit")
|
|
REGDATA(verb1, "&Open")
|
|
REGDATA(verb2, "&Play")
|
|
REGVERBOPT(verb2, ocrGrayed, ocrOnContainerMenu | ocrNeverDirties)
|
|
REGFORMAT(0, ocrEmbedSource, ocrContent, ocrIStorage, ocrGet)
|
|
REGFORMAT(1, ocrText, ocrContent, ocrHGlobal, ocrGetSet)
|
|
REGFORMAT(2, ocrMetafilePict, ocrContent, ocrMfPict, ocrGet)
|
|
REGFORMAT(3, ocrRichText, ocrContent, ocrHGlobal, ocrGetSet)
|
|
REGSTATUS(all, ocrNoSpecialRendering)
|
|
REGSTATUS(icon, ocrOnlyIconic)
|
|
REGSTATUS(content, ocrRecomposeOnResize)
|
|
REGICON(1)
|
|
REGITEM("CLSID\\<clsid>\\Conversion\\Readable\\Main","FormatX,FormatY")
|
|
END_REGISTRATION
|
|
|
|
BEGIN_REGISTRATION(mytplreg)
|
|
REGDATA(description,"My Sample Draw View")
|
|
REGDATA(filter, "*.drw;*.drx")
|
|
REGDATA(defaultext, "DVW")
|
|
REGDATA(directory, 0)
|
|
END_REGISTRATION
|
|
|
|
TRegItem regAppName[2] = {{"appname",{myappreg["appname"]}}, {0,{0}}};
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Example registration table processing
|
|
//____________________________________________________________________________
|
|
|
|
TRegList* MyRegClasses[] = { &myappreg, &mydocreg, 0 };
|
|
|
|
const char*
|
|
RegisterClasses(TRegList** regClasses, // null-term. array of reg lists
|
|
HINSTANCE module, // 0 defaults to current task
|
|
ostream& out, // open ostream to stream reg entries
|
|
TLangId lang = LangSysDefault, // language for registration
|
|
char* filter = 0, // internal use to restrict entries
|
|
TRegItem* defaults = regAppName)// optional registration default list
|
|
{
|
|
// write registration file header
|
|
//
|
|
out << "REGEDIT\n";
|
|
|
|
// loop to register each class
|
|
//
|
|
for ( ; *regClasses != 0; regClasses++) {
|
|
try {
|
|
::OcRegisterClass(**regClasses, module, out, lang, filter, defaults);
|
|
}
|
|
catch (TXRegistry& xcpt) {
|
|
return xcpt.Key;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int UnregisterClasses(TRegList** regClasses)
|
|
{
|
|
int errorCount = 0;
|
|
for ( ; *regClasses != 0; regClasses++) { // loop to unregister each class
|
|
errorCount += OcUnregisterClass(**regClasses);
|
|
}
|
|
return errorCount;
|
|
}
|
|
|
|
//____________________________________________________________________________
|
|
//
|
|
// Example code to exercise registration
|
|
//____________________________________________________________________________
|
|
|
|
#include <fstream.h>
|
|
#include <strstrea.h>
|
|
|
|
#define WM_USERSTAT (WM_USER + 100)
|
|
|
|
bool CALLBACK __export
|
|
DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if (msg == WM_INITDIALOG) {
|
|
return 1;
|
|
} else if (msg == WM_COMMAND) {
|
|
::PostMessage(hDlg, WM_USERSTAT, wParam, lParam);
|
|
return 1;
|
|
} else if (msg == WM_CLOSE) {
|
|
::PostMessage(hDlg, WM_USERSTAT, IDABORT, 0);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int PASCAL
|
|
WinMain(HINSTANCE hInst, HINSTANCE/*prev*/, char far* /*cmdLine*/, int/*show*/)
|
|
{
|
|
HWND hWnd = ::CreateDialog(hInst, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC)DlgProc);
|
|
if (!hWnd) {
|
|
::MessageBox(0, "Could Not Create Dialog Box", "Error", MB_OK);
|
|
return 1;
|
|
}
|
|
for (;;){
|
|
try {
|
|
MSG msg;
|
|
int id = 0;
|
|
while (!id && ::GetMessage(&msg, 0, 0, 0)) {
|
|
if (msg.message == WM_USERSTAT)
|
|
id = msg.wParam;
|
|
else
|
|
::IsDialogMessage(hWnd, &msg);
|
|
}
|
|
if (id == IDABORT || id == IDOK)
|
|
break;
|
|
int errorCount = 0;
|
|
const char* errorText = 0;
|
|
switch (id) {
|
|
case IDC_DISPLAY: { // Show reg entries in listbox
|
|
::SendDlgItemMessage(hWnd, IDC_REGLIST, LB_RESETCONTENT, 0, 0);
|
|
strstream strm;
|
|
errorText = RegisterClasses(MyRegClasses, hInst, strm);
|
|
if (errorText) {
|
|
break;
|
|
}
|
|
char buf[512];
|
|
strm.getline(buf, sizeof(buf)); // skip reg file header written above
|
|
int maxlen = 0;
|
|
HDC hDC = ::GetDC(hWnd);
|
|
HFONT hFont = (HFONT)::SendDlgItemMessage(hWnd, IDC_REGLIST, WM_GETFONT,0,0);
|
|
HFONT oldFont = (HFONT)::SelectObject(hDC, hFont);
|
|
while (!strm.eof()) {
|
|
strm.getline(buf, sizeof(buf));
|
|
::SendDlgItemMessage(hWnd, IDC_REGLIST, LB_ADDSTRING,
|
|
0, (LPARAM)(char far*)buf);
|
|
int n = (int)::GetTextExtent(hDC, buf, lstrlen(buf));
|
|
if (n > maxlen)
|
|
maxlen = n;
|
|
}
|
|
::SelectObject(hDC, oldFont);
|
|
::ReleaseDC(hWnd, hDC);
|
|
::SendDlgItemMessage(hWnd, IDC_REGLIST, LB_SETHORIZONTALEXTENT,
|
|
maxlen, 0);
|
|
break;
|
|
}
|
|
case IDC_REGISTER: { // Write all info to registry
|
|
strstream strm;
|
|
errorText = RegisterClasses(MyRegClasses, hInst, strm);
|
|
if (errorText) {
|
|
break;
|
|
}
|
|
try {
|
|
OcRegistryUpdate(strm);
|
|
}
|
|
catch (TXRegistry& xcpt) {
|
|
errorText = xcpt.Key;
|
|
}
|
|
break;
|
|
}
|
|
case IDC_UNREGISTER: { // Delete all info from registry
|
|
errorCount = UnregisterClasses(MyRegClasses);
|
|
break;
|
|
}
|
|
case IDC_WRITEFILE: { // Write registration file
|
|
ofstream out;
|
|
out.open("myapp.reg");
|
|
errorText = RegisterClasses(MyRegClasses, hInst, out);
|
|
out.close();
|
|
break;
|
|
}
|
|
case IDC_VERIFY: { // Validate registration file with single check
|
|
strstream strm;
|
|
RegisterClasses(MyRegClasses, hInst, strm,LangSysDefault,"\001");
|
|
errorCount = OcRegistryValidate(strm);
|
|
break;
|
|
}
|
|
case IDC_COMPARE: { // Validate entire registration file
|
|
strstream strm;
|
|
RegisterClasses(MyRegClasses, hInst, strm);
|
|
errorCount = OcRegistryValidate(strm);
|
|
break;
|
|
}
|
|
default:
|
|
continue;
|
|
}
|
|
char buf[40];
|
|
::GetDlgItemText(hWnd, id, buf, sizeof(buf)-1);
|
|
::SetDlgItemText(hWnd, IDC_OP, buf);
|
|
if (!errorText)
|
|
wsprintf(((char*)errorText = buf), "%d", errorCount);
|
|
::SetDlgItemText(hWnd, IDC_ERRORS, buf);
|
|
}
|
|
catch (TXBase& x) {
|
|
::MessageBox(0, x.why().c_str(), "OLE Exception", MB_OK);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|