- OBJCORE.CPP
- AFX.INL
- AFXCOLL.H
- AFXOLE.H
- AFXPRIV.H
- AFXDLGS.H
- AFXEXT.H
- AFXWIN.H
- AFX.H
- AFXPEN.H
Alle Änderungen an den MFC-Files werden durch ein PreProcessor-Statement eingeschlossen, um sicherzustellen, daß das Makro __BORLANDC__ definiert ist. Damit ist garantiert, daß die Änderungen nur dann wirksam werden, wenn die Quellen mit dem Borland C++ Compiler kompiliert werden.
Ein Großteil der Änderungen erfolgt über eine neue Header-Datei AFX4BC.H. Die vollständige Datei ist auf der CD enthalten und soll hier nicht noch einmal wiederholt werden.
Modifikation von OBJCORE.CPP
In der Datei OBJCORE.CPP sind mehrere Änderungen vorzunehmen. Die erste Änderung betrifft die Funktion AfxAssertValidObject(), die auf near vptrs umgestellt werden muß, sofern nicht permanent far vtables benutzt werden:
#ifdef _DEBUG
extern "C" void AFXAPI AfxAssertValidObject(const CObject* pOb,
LPCSTR lpszFileName, int nLine)
{
if (pOb == NULL) {
TRACE0("ASSERT_VALID fails with NULL pointer\n");
AfxAssertFailedLine(lpszFileName, nLine);
return; // quick escape
}
if (!AfxIsValidAddress(pOb, sizeof(CObject))) {
TRACE0("ASSERT_VALID fails with illegal pointer\n");
AfxAssertFailedLine(lpszFileName, nLine);
return; // quick escape
}
#ifndef _M_I86SM
#if !defined(__BORLANDC__)
ASSERT(sizeof(CObject) == sizeof(void FAR*));
#endif
Die nächste Modifikation betrifft nur die near Data-Modelle und kann entfallen, wenn nur Compact- und Large-Speichermodelle verwendet werden. Ansonsten ist die Funktion CRuntimeClass::ConstructObject() wie folgt zu ändern:
BOOL CRuntimeClass::ConstructObject(void* pThis)
{
#if defined(__BORLANDC__)
ASSERT(AfxIsValidAddress((const void FAR*)pThis, nObjectSize));
#else
ASSERT(AfxIsValidAddress(pThis, nObjectSize));
#endif
Die letzte Änderung ist in der Funktion AfxInitialize() erforderlich. Es wird ein Cast hinzugefügt, da AfxNewHandler() nicht auf den Parametertyp von _AfxSetNewHandler() paßt.
static BOOL AfxInitialize()
{
(void)_afx_version();
#ifdef _DEBUG
for CodeView
(void)afxTraceEnabled;
(void)afxMemDF;
#ifdef _WINDOWS
(void)afxTraceFlags;
#endif
if (!AfxDiagnosticInit())
return FALSE;
#endif //_DEBUG
#if defined(__BORLANDC__)
_AfxSetNewHandler( ( void (*)() )
AfxNewHandler );
#else
_AfxSetNewHandler(AfxNewHandler);
#endif
return TRUE;
}
Änderungen in AFX.INL
Da BC++ den _segname Modifier nicht unterstützt, muß die Funktion _AfxGetPtrFromFarPtr() wie folgt geändert werden. Dabei ist zu beachten, daß der neue Code nicht mehr verifiziert, ob der far-Zeiger auf _DATA zeigt.
AFX_INLINE void* PASCAL _AfxGetPtrFromFarPtr(void FAR* lp)
{
#ifdef _NEARDATA
#if defined(__BORLANDC__)
return(void*)_AFX_FP_OFF(lp);
#else
ASSERT(_AFX_FP_SEG(lp) == _segname("_DATA"));
return (void*)_AFX_FP_OFF(lp);
#endif
#else
return lp;
#endif
}
Änderungen in AFX.H
Wie bereits erwähnt, können eine Reihe von Änderungen über die Datei AFX4BC.H abgewickelt werden. Damit die dort enthaltenen neuen Definitionen und Redefinitionen für alle Framework-Sourcen sichtbar sind, sollte diese Datei einfach in AFX.H per #include integriert werden:
|