Orw*_*ell 5 delphi locale delphi-7
出于某种原因,尝试通过使用单例或通过直接调用构造函数来创建由SysUtils头提供的TLanguages对象在野外引起麻烦,其中一些用户报告此错误(X变化):
Access violation at address X. Write of address X (at address X)
Run Code Online (Sandbox Code Playgroud)
......当执行以下看似无辜的代码行时:
TLanguages.Create;
Run Code Online (Sandbox Code Playgroud)
澄清一下,这与背景无关.我可以把这行放在我喜欢的任何地方(例如,作为空程序的唯一代码行),但问题仍然存在.
奇怪的是,这个类是Delphi标准头文件的一部分,它不应该失败(对吧?).
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;
Run Code Online (Sandbox Code Playgroud)
构造函数尝试使用成员函数作为EnumSystemLocales回调,这似乎导致崩溃,因为将TLanguages.LocalesCallback函数复制到全局作用域并将其传递给EnumSystemLocales非常正常.
该结构包含以下Intel x86程序集,其中每个项目由其操作码给出:
pop edx
mov eax Self
push eax
push edx
jmp JmpOffset
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个技巧是如何工作的,并告诉我为什么它没有按预期工作?
正如我在对该问题的评论中猜测的那样,这似乎是旧版 Delphi 版本的一个已知问题,与 DEP 相关。很明显,当启用 DEP 时,RTL 中的代码无法工作。
这是证实该理论的链接:http://codecentral.embarcadero.com/Item/23411
尽管 CodeCentral 文章包含修复 Delphi 5 中问题的代码,但看起来它也适用于 Delphi 7。该修复通过挂钩SysUtils.Languages函数来实现。因此,出于显而易见的原因,请确保您始终使用该名称而不是自己称呼TLanguages.Create自己。
| 归档时间: |
|
| 查看次数: |
407 次 |
| 最近记录: |