gpt4 book ai didi

delphi - RTTI 访问 VCL 的私有(private)方法,例如TCustomForm.SetWindowState

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

在关于关闭 Delphi 10.1 Berlin 中允许轻松访问类的私有(private)成员(字段和方法)的类帮助程序漏洞的争论中,人们经常声称

  • 扩展 RTTI 允许访问在启用(扩展)RTTI 的情况下编译的类的私有(private)成员,并且
  • 所有 VCL/RTL/FMX 类都启用了此功能。

但是,如果我运行这个简单的单元(一个带有一个 TListBox 的简单表单,仅此而已):

unit RttiAccessTest;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Rtti, Vcl.StdCtrls;

type
TForm16 = class(TForm)
ListBox1: TListBox;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form16: TForm16;

implementation

{$R *.dfm}

function GetMethodString(const MethodName: string): string;
var
M: TRTTIMethod;
I: Integer;
begin
M := TRttiContext.Create.GetType(TCustomForm).GetMethod(MethodName);
if Assigned(M) then
Result := 'Method ' + MethodName + ': ''' + M.ToString + ';'''
else
Result := 'Method ' + MethodName + ' cannot be found';
end;

procedure TForm16.FormCreate(Sender: TObject);
begin
Listbox1.Items.Add(GetMethodString('SetWindowState'));
Listbox1.Items.Add(GetMethodString('ShowModal'));
end;

end.

列表框中的文本是:

Method SetWindowState cannot be found 
Method ShowModal: 'function ShowModal: Integer;'

这意味着我无法访问 TCustomForm 的这个私有(private)方法 SetWindowState。这是因为并非 RTL/VCL/FMX 中的所有类都扩展了 RTTI,还是我做错了什么?

如果我做错了什么或忘记了什么,那怎么办?换句话说,我需要做什么才能让 RTTI 访问 TCustomFormSetWindowState ?我在西雅图或更早的地方也无法获得此访问权限。

注意

无论如何,我知道如何访问该方法,利用类助手仍然可以获取私有(private)方法的地址,但这不是我的问题。 我特别询问如何使用 RTTI 做到这一点

最佳答案

明显的结论是,虽然此类型是使用扩展 RTTI 编译的,但私有(private)方法不包含 RTTI。

关于delphi - RTTI 访问 VCL 的私有(private)方法,例如TCustomForm.SetWindowState,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37905306/

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