gpt4 book ai didi

TLanguages 实用程序中的 Delphi 访问冲突

转载 作者:行者123 更新时间:2023-12-03 15:12:12 25 4
gpt4 key购买 nike

出于某种原因,尝试使用单例或直接调用构造函数来创建由 SysUtils header 提供的 TLanguages 对象会在野外引起麻烦,一些用户报告此错误(X 有所不同):

Access violation at address X. Write of address X (at address X)

...当执行以下看似无害的代码行时:

TLanguages.Create;

澄清一下,这与上下文无关。我可以将此行放在任何我喜欢的地方(例如,作为空程序的唯一代码行),但问题仍然存在。

奇怪的是,这个类是 Delphi 标准 header 的一部分,它不应该失败(对吗?)。

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;

构造函数尝试使用成员函数作为 EnumSystemLocales 回调,这似乎会导致崩溃,因为将 TLanguages.LocalesCallback 函数复制到全局范围并将其传递给 EnumSystemLocales 工作得很好。

该结构包含以下 Intel x86 程序集,其中每个项目均由其操作码给出:

pop  edx
mov eax Self
push eax
push edx
jmp JmpOffset

谁能解释一下这个技巧是如何工作的,并告诉我为什么它没有按预期工作?

最佳答案

正如我在对该问题的评论中猜测的那样,这似乎是旧版 Delphi 版本的一个已知问题,与 DEP 相关。很明显,当启用 DEP 时,RTL 中的代码无法工作。

这里有一个链接来证实这个理论:http://codecentral.embarcadero.com/Item/23411

尽管 CodeCentral 文章包含修复 Delphi 5 中问题的代码,但看起来它也适用于 Delphi 7。该修复通过 Hook SysUtils.Languages 函数来实现。因此,出于显而易见的原因,请确保您始终使用它,而不是自己调用 TLanguages.Create

关于TLanguages 实用程序中的 Delphi 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15723909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com