Projektoptionen -> Zugriffsverletzung
-
Hallo Forum!
Bin gerade echt am verzweifeln.
Ich benutze seit ca. einem Jahr C++Builder6 Personal auf dem selben Rechner.
Seit ein paar Tagen kommt, wenn ich die Projektoptionen aufrufe:Zugriffsverletzung bei Adresse 0012F93F. Schreiben von Adresse 0012F93F
und
Zugriffsverletzung bei Adresse 0012FAAF. Schreiben von Adresse 0012FAAF
Hab schon alles probiert, Admin-Rechte etc., nichts hilft!
Ach ja, ich habe einen Laptop mit Vista drauf!
Ihr seid meine letzte HoffnungMfG Chris_
-
Hallo Chris,
ich habe auch schon so einige Zugriffsverletzungen gehabt. Immer dann, wenn ich mit meinem Programm eine nicht erreichbare Datenbank connecten wollte. Nutzt Du denn eine DB in Deinem Programm?Gruß Torsten
-
Der Fehler ist an der folgenden Stelle in der C++Builder 6-RTL begründet:
// SysUtils.pas, l.13193: constructor TLanguages.Create; type TCallbackThunk = packed record POPEDX: Byte; MOVEAX: Byte; SelfPtr: Pointer; PUSHEAX: Byte; PUSHEDX: Byte; JMP: Byte; JmpOffset: Integer; end; var Callback: TCallbackThunk; begin inherited Create; Callback.POPEDX := $5A; Callback.MOVEAX := $B8; Callback.SelfPtr := Self; Callback.PUSHEAX := $50; Callback.PUSHEDX := $52; Callback.JMP := $E9; Callback.JmpOffset := Integer(@TLanguages.LocalesCallback) - Integer(@Callback.JMP) - 5; EnumSystemLocales(TFNLocaleEnumProc(@Callback), LCID_SUPPORTED); end;
Das zugrundeliegende Problem ist EnumSystemLocales(), das an die Callback-Funktion keinen Kontext-Parameter weiterreicht - eine Designschwäche in der WinAPI. Als Workaround generiert obige Implementation on-the-fly eine Callback-Funktion, die den Kontextzeiger enthält. Das Problem ist nur, daß diese Callback-Funktion irgendwo im Datensegment liegt - jedoch die Ausführung von Daten als Code von DEP verhindert wird (da Windows im Jahre 2002 DEP noch nicht unterstützte, wird daran niemand gedacht haben). Seit einem der Service-Packs ist DEP auf Windows XP aber standardmäßig aktiviert - daher verursacht der Aufruf obigen Codes eine DEP-Exception, deren Ausdruck deine Zugriffsverletzung ist. Wenn du C++Builder 6 zu den DEP-Ausnahmen hinzufügst (Google nach "windows dep" sollte helfen), kommst du entsprechend auch wieder in die Projektoptionen.
(In späteren RTL-Versionen wurde das Problem durch Benutzung einer globalen Variable etwas weniger elegant, aber wenigstens DEP-kollisionsfrei umgangen.)
-
Vielen Dank an audacia,
aber auch an torsten_156 für die Hinweise!
Funktioniert endlich wieder!Chris_