Registriert seit: 1. Dez 2004
Ort: Köln
1.294 Beiträge
Delphi 12 Athens
|
Nach Update auf Delphi12 startet compiliertes Prog nicht mehr. Fehler bei LoadResStri
20. Jun 2024, 09:23
Delphi-Version: 12 Athens
Ich bin von Delphi 11 auf Delphi 12 umgestiegen. Eigentlich alles gut. Nun habe ich festgestellt, dass ein Programm nicht mehr startet.
Breakpoint auf die erste Zeile im Projekt-Quelltext gesetzt. Dort kommt das Programm erst gar nicht an.
Also mit F7 gestartet und festgestellt, dass beim initialisieren der Units der Fehler auftritt.
In der Procedure InitUnits (Zeile 242003) aus der Unit System werden die einzelnen Units initialisiert.
Delphi-Quellcode:
// Unit System
procedure InitUnits;
var
Count, I: Integer;
Table: PUnitEntryTable;
P: Pointer;
begin
{$IF defined(EXTERNALLINKER)}
dbk_RTL_initialized := 0;
{$ENDIF}
if InitContext.InitTable = nil then
exit;
Count := InitContext.InitTable^.UnitCount;
I := 0;
Table := InitContext.InitTable^.UnitInfo;
{$IF defined(LINUX) and not defined(EXTERNALLINKER)}
Inc(PByte(Table), InitContext.Module^.GOT);
{$ENDIF}
try
while I < Count do
begin
P := Table^[I].Init;
Inc(I);
InitContext.InitCount := I;
if Assigned(P) and Assigned(Pointer(P^)) then
begin
{$IF defined(MSWINDOWS)}
TProc(P)(); // <----- Hier wird zum Initialisieren in die jeweilige Unit gesprungen.
{$ELSEIF (defined(POSIX) and defined(CPUX86)) and defined(ASSEMBLER)}
CallProc(P, InitContext.Module^.GOT);
{$ELSE}
TProc(P)();
{$ENDIF}
end;
end;
except
FinalizeUnits;
raise;
end;
{$IF defined(EXTERNALLINKER)}
dbk_RTL_initialized := 1;
{$ENDIF}
end;
Bei der Unit " Soap.XSBuiltIns" lande ich sofort in der letzten QuellcodeZeile
Delphi-Quellcode:
// Letzte Zeilen der Unit Soap.XSBuiltIns
procedure InitXSTypes;
begin
RemClassRegistry.RegisterXSClass(TXSDateTime, XMLSchemaNameSpace, ' dateTime', ' ',True);
RemClassRegistry.RegisterXSClass(TXSTimeInstant, XMLSchemaNameSpace, ' timeInstant', ' ', True);
RemClassRegistry.RegisterXSClass(TXSTime, XMLSchemaNameSpace, ' time', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDate, XMLSchemaNameSpace, ' date', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDuration, XMLSchemaNameSpace, ' duration', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDuration, XMLSchemaNameSpace, ' timeDuration', ' ', True);
RemClassRegistry.RegisterXSClass(TXSHexBinary, XMLSchemaNamespace, ' hexBinary', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDecimal, XMLSchemaNamespace, ' decimal', ' ', True);
{
RemClassRegistry.RegisterXSClass(TXSDecimal, XMLSchemaNamespace, 'integer', '', True);
}
RemClassRegistry.RegisterXSClass(TXSString, XMLSchemaNamespace, ' string', ' ', True);
RemClassRegistry.RegisterXSClass(TXSBoolean, XMLSchemaNamespace, ' boolean', ' ', True);
RemClassRegistry.RegisterXSClass(TXSInteger, XMLSchemaNamespace, ' int', ' ', True);
RemClassRegistry.RegisterXSClass(TXSLong, XMLSchemaNamespace, ' long', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDecimal, XMLSchemaNamespace, ' negativeInteger', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDecimal, XMLSchemaNamespace, ' nonNegativeInteger', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDecimal, XMLSchemaNamespace, ' nonPositiveInteger', ' ', True);
RemClassRegistry.RegisterXSClass(TXSDecimal, XMLSchemaNamespace, ' positiveInteger', ' ', True);
end;
end. // <---- Von TProc(P)(); landet der Debugger hier
Dann geht es weiter mit F7 in die Procedure _InitResStringImports
Delphi-Quellcode:
procedure _InitResStringImports(InitTable: Pointer);
//...
//...
//...
@@ustring:
CALL LoadResStringU
Dort geht es weiter mit F7 in die Procedure LoadResStringU
Delphi-Quellcode:
function LoadResStringU(ResStringRec: PResStringRec): UnicodeString;
begin
Result := UnicodeString(LoadResString(ResStringRec));
end;
Und zum Schluss geht es weiter mit F7 in die Procedure LoadResString
Delphi-Quellcode:
function LoadResString(ResStringRec: PResStringRec): string;
var
Buffer: array [0..4095] of Char;
begin // <--- Hier landet der Debugger. Mit F8 erscheint sofort die Exception
if ResStringRec = nil then Exit;
if Assigned(LoadResStringFunc) then
Exit(LoadResStringFunc(ResStringRec));
if ResStringRec.Identifier < 64*1024 then
SetString(Result, Buffer,
LoadString(FindResourceHInstance(ResStringRec.Module^),
ResStringRec.Identifier, Buffer, Length(Buffer)))
else
Result := PChar(ResStringRec.Identifier);
end;
Dann erscheint sofort die Exception
Code:
Im Projekt comcept3.exe ist eine Exception der Klasse $C0000005 mit der Meldung ' access violation at 0xce93d58d: access of address 0xce93d58d' aufgetreten.
Ab hier stehe ich auf dem Schlauch.
Hat jemand eine Idee, wo ich weiter suchen kann?
|