gpt4 book ai didi

delphi - 尝试访问类属性时出错

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

我有这门课:

{$RTTI EXPLICIT FIELDS([vcProtected]) PROPERTIES([vcProtected])}
const
PP_VEHICLE_FIELD = 'VEICULO_ID';
PP_DRIVER_FIELD = 'MOTORISTA_ID';
PP_TRIP_FIELD = 'VIAGEM_ID';
PP_DATE = 'DATA';

type
[TAttrDBTable('NONE')]
TReportItem = class(TObject)
protected
[TAttrDBField(PP_VEHICLE_FIELD)]
FVeiculoId: integer;
[TAttrDBField(PP_DRIVER_FIELD)]
FMotoristaId: integer;
[TAttrDBField(PP_TRIP_FIELD)]
FViagemId: integer;
[TAttrDBField(PP_DATE)]
FDataRelatorio: TDate;
published
class function GetTableName<T: class, constructor>: string;
end.

class function TReportItem.GetTableName<T>: string;
var
LRttiContext: TRttiContext;
LRttiType: TRttiType;
LCustomAttribute: TCustomAttribute;
LType: T;
begin
LType := T.Create;
try
LRttiContext := TRttiContext.Create;
LRttiType := LRttiContext.GetType(LType.ClassType);
for LCustomAttribute in LRttiType.GetAttributes do
if LCustomAttribute is TAttrDBTable then
begin
Result := TAttrDBTable(LCustomAttribute).TableName;
Break;
end;
finally
LType.Free;
end;
end;

我这样调用它:TReportItem.GetTableName<TReportItem> ; <>可以是继承 TReportItem 的任何类.

但是,有时当我打电话时:TReportItem.GetTableName在命令 LRttiType.GetAttributes 中我遇到访问冲突,有时不是,这取决于“编译”。它像魔术一样工作和停止。我不知道发生了什么事。有人可以给我提示吗?

问题出在GetAttributes上,如果我用它来获取字段、方法等中的属性。它会给我带来访问冲突。是否有一些指令需要我打开或关闭才能使用它?

如果我使用 Shift+F9 进行编译,则 GetAttributes如果我修改单元中的任何行并使用 F9 进行编译,请给我 AV GetAttributes有效。

不仅仅是我的机器有这个问题,其他8个程序员也有同样的问题。德尔福XE。

错误发生在rtti.pas中的这段代码中:

function FindCtor(AttrType: TRttiInstanceType; CtorAddr: Pointer): TRttiMethod;
type
PPPointer = ^PPointer;
var
p: PByte;
imp: Pointer;
begin
for Result in AttrType.GetMethods do
if Result.CodeAddress = CtorAddr then
Exit;
// expect a package (i.e. DLL) import
p := CtorAddr;
Assert(p^ = $FF); // $FF $25 => indirect jump m32
Inc(p);
Assert(p^ = $25);
Inc(p);
imp := PPPointer(p)^^; //ERROR HAPPENS HERE
for Result in attrType.GetMethods do
if Result.CodeAddress = imp then
Exit;
Result := nil;
end;

最佳答案

今天我在 Rtti.pas 中的 imp := PPPointer(p)^^ 上遇到了完全相同的问题几个小时,同样的 AV。

我发现我的项目中 2 个不相关的单元中的 2 个属性使用了相同的名称:在我重命名其中一个后,不再有 AV!

关于delphi - 尝试访问类属性时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9499135/

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