powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение адреса overload метода
49 сообщений из 49, показаны все 2 страниц
Получение адреса overload метода
    #39536487
Доброго времени суток.
Получение адреса метода делается обычно так - @TStringStream.Create. Но мне нужно получить адрес этого же метода, но с параметром @TStringStream.Create(const AString: string) (это понятное дело не работает). Как его тогда получить?
p.s. TStringStream взят для примера.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39536514
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже в теме, возможно поможет следующий код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
function GetAddrConstructor: pointer;
label
  L_Exit;
begin
  asm
               mov     eax, @AddrCall.Pointer     // адрес команды
               sub     eax, 4                     // адрес смещения функции УТОЧНИТЬ В ОТЛАДЧИКЕ (ОКНО ASSWMBLER)
               mov     eax, [eax]                 // адрес конструктора
               jmp     L_Exit                     // выход
  @AddrCall:
               dd      L_Exit
  end;
  TStringStream.Create('');
L_Exit:
end;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39536565
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь предлагают вариант решения.

А зачем это нужно? Какая исходная задача?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39536890
Спасибо за варианты.
Делаю встроенный компилятор, что-то вроде PaxCompiler, но на много проще, более узконаправленный.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39536957
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже в теме,

И тебе понадобилась такими ярыстными средствами сделать вызов ? Или чего???


Используй RTTI почти (Если не всё) можно им управлять.


Вот к примеру я когда то привязал к PHP 7.1 полное управление с GUI

[youtube=
YouTube Video
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537045
Для использования RTTI нужно в классах делать "видимыми" поля, методы, свойства и другое, что не входит в видимость published. Мне проще прописать несколько нужных методов с адресами вызова.
p.s. за видео спасибо.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537073
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже в теме,

RTTI работает со всеми секциями почти, кроме private. Кстати, published не может содержать overload а значит вы используете public
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537094
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик, блажен кто верует
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537098
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom,

Не понял что ты хотел сказать своим бестолковым - бесполезным, оффтопным приложением.

Нормальный RTTI появился в Delphi 2010. Всё что было в прошлых средах - жалкие мало функциональные, жалкие функции. Лишь для малых нужд.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537099
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтопным * сообщением
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537100
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И во первых - использование кеугена это не воровство приложение.

Это значит - что я нашёл ключик под ковриком, и зашёл к себе (в чужой дом. Что бы его использовать пока в хозяева на отдыхе)

Это не значит что я собираюсь себе что - то прикарманить.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537108
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Няшик Кстати, published не может содержать overload а значит вы используете public
На части снимка экрана показал откомпилированный код с перекрываемой процедурой (procedure Test; virtual) в разделе published
Няшик Всё что было в прошлых средах - жалкие мало функциональные, жалкие функции. Лишь для малых нужд.
Тем не менее это не мешало ни Borland ни последующим разработчикам Delphi, так же как и большинству разработчикам
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537109
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикКстати, published не может содержать overload а значит вы используете public

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure Test; overload;
  published
    procedure Test(const S: string); overload;
  end;



Может.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537111
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лошарик,

ты по вечерам напиваешься, что ли.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537113
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Я про сам published

E2266 Only one of a set of overloaded methods can be published
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537114
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик...Only one of a set of overloaded methods can be publishedНяшик...published не может содержать overload а значит вы используете publicТы не видишь разницы?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537115
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикчччД,

Я про сам published

E2266 Only one of a set of overloaded methods can be published

Я даже надеюсь, ты знаешь, почему.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537116
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНяшик...Only one of a set of overloaded methods can be publishedНяшик...published не может содержать overload а значит вы используете publicТы не видишь разницы?

Блин.. Реально ошибся в высказываниях. Имелось введу больше двух. Это всё усталость после6 работы.


В общем, с published RTTI в токио отлично работает.



Class
Код: pascal
1.
2.
3.
4.
5.
type
  TestClass = class
  published
    function TestFunc(a: Integer; f: TestClass): string; overload;
  end;



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, rtti, Test;

var
  с: TRttiContext;

begin
  Writeln(с.FindType('Test.TestClass').GetMethod('TestFunc').ToString);
  Readln;

end.



Выведет function TestFunc(a: Integer; f: TestClass): string
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537120
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имхо, для разрешения "проблемы" с адресами overload методов могли бы ввести вспомогательный синтаксис, с указанием типов параметров, как в сях, что-то вроде:

Код: pascal
1.
2.
3.
4.
5.
6.
procedure  P; overload;
procedure  P(aInt : integer); overload;
...
begin
... :=  @P; // Метод без параметров
... :=  @P(integer); // С параметром типа integer


Но это был бы уже дедушка, если бы такое было.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537141
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДдля разрешения "проблемы" с адресами overload методов могли бы ввести вспомогательный синтаксис
Ни к чему это баловство, всё решается переменной процедурного типа:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure test; overload;
begin
end;

procedure test(a:string); overload;
begin
end;

var

 proc : procedure(a:string);

begin
 proc := @test;
end.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537142
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Код: pascal
1.
2.
3.
begin
 proc := test;
end
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537145
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

:0) D2007
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure test; overload;
begin
  writeln('test()');
end;

procedure test(a:string); overload;
begin
  writeln('test(string)');
end;

var
 proc : procedure;
 procS : procedure(a:string);

begin
  proc := @test;
  procS := @test;

  proc;
  procS('aaa');

  readln;
end.

...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537146
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...а если поменять местами порядок объявления процедур test; и test(a:string), то получаем AV.

Ибо в D2007 для данного случая - "кто первый встал - того и тапки".

Возможно, в новых D's ситуация изменилась.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537147
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДИбо в D2007 для данного случая - "кто первый встал - того и тапки
Оно так не только в 2007. Просто нужно убрать взятие адреса .
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537149
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

ТС желает адрес, в один прием. :)
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537151
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДТС желает адрес, в один прием. :)
Переменная и будет содержать адрес. А про "в один приём" речи небыло.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537152
Не в одну строку. .... хоть как-нибудь. Пока более менее нормально можно получить адрес как указано тут . Только ссылка в call (на TStringStream.Create('');) не абсолютная, а относительная.

Представить TStringStream.Create('') в виде
Код: pascal
1.
2.
var
  proc: procedure(a:string);


не получилось, может мозгов не хватает.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537154
Вот так получает адрес:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
function GetAddr: Pointer;
label
  L_Exit;
begin
  asm
               mov     eax, @AddrCall.Pointer     // адрес команды
               mov     ebx, eax
               sub     eax, 4                     // адрес смещения функции УТОЧНИТЬ В ОТЛАДЧИКЕ (ОКНО ASSWMBLER)
               mov     eax, [eax]                 // адрес конструктора
               add     ebx, eax
               jmp     L_Exit                     // выход
  @AddrCall:
               dd      L_Exit
  end;
  TStringStream.Create('');
L_Exit:
end;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537155
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже в темеПредставить TStringStream.Create('') в виде
Адрес конструктора таким cпособом получить нельзя. А нужем именно адрес конструктора? Нельзя классовой ссылкой обойтись?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537156
Kazantsev Alexey,
С классовой ссылкой нужно делать обработку. Вызов непосредственно по адресу работает быстрее.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537158
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тоже в темеВызов непосредственно по адресу работает быстрее.
Что, настолько быстрее, что на фоне работы ММ заметно?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537174
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на целых несколько инструкций быстрее - выгода просто колоссальная!

Оптимизации уровня Няшика - неделями ускоряем одно место, имея пару десятков реальных узких мест.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537194
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже в теме,
Код: pascal
1.
               add     ebx, eax


Результат будет в EBX, а результат функции возвращается через EAX
EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте"
Теоретически можно воспользоваться другим регистром общего назначения, но не готов сказать, какие и как используются при разных флагах оптимизации. Лучше воспользоваться конструкцией:
Код: pascal
1.
2.
3.
4.
              push    ecx
              mov     ecx, @AddrCall.Pointer
              add     eax, ecx
              pop     ecx
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537204
jmp_original
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И всё-таки, кто-нибудь из гениев ассемблеро-строения объяснит, почему нельзя просто воспользоваться типизированной переменной?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537259
Vizit0rна целых несколько инструкций быстрее - выгода просто колоссальная!
Оптимизации уровня Няшика - неделями ускоряем одно место, имея пару десятков реальных узких мест.
Вызов через адрес уже работал для всех нужных мне классов. Так что эти "недели" уже позади. Только для конструкторов с overload были прикручены костыли. Вот и хотелось узнать есть ли варианты получения их адресов.

FreedoomТоже в теме,
Результат будет в EBX, а результат функции возвращается через EAX
Странно, но у меня Result именно в EBX. ( Delphi 2010 )
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537309
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomEBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте"

Если не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537325
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiЕсли не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой.
Как говорит классик: ... и опыт, сын ошибок трудных ... - практика при использовании ассемблерных вставок и функций на Delphi. Последние несколько лет перешёл на Lazarus, и с ориентированием на кроссплатформенность, стараюсь использовать ассемблер в крайних случаях. Возможно, после Borland, в Delphi немного поменялись соглашения об использовании регистров. Не отслеживал изменения, но думаю, что кардинально ни чего не изменилось.

Тоже в темеСтранно, но у меня Result именно в EBX. ( Delphi 2010 )
У меня нет возможности посмотреть ассемблерный код, генерируемый компиляторм. Глянь в отладчике код функции
Код: pascal
1.
2.
3.
4.
function Test: integer;
begin
  Result := $45
end;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537334
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jmp_original, попробуй описать типизированную переменную для конструкторов класса TStringBuilder
Код: pascal
1.
2.
3.
4.
5.
6.
constructor Create; overload;
constructor Create(aCapacity: Integer); overload;
constructor Create(const Value: string); overload;
constructor Create(aCapacity: Integer; aMaxCapacity: Integer); overload;
constructor Create(const Value: string; aCapacity: Integer); overload;
constructor Create(const Value: string; StartIndex: Integer; Length: Integer; aCapacity: Integer); overload;
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537387
FreedoomУ меня нет возможности посмотреть ассемблерный код, генерируемый компиляторм. Глянь в отладчике код функции
Код: pascal
1.
2.
3.
4.
function Test: integer;
begin
  Result := $45
end;


Для этой функции Result в EAX. А для той, что описана выше Делфи в конце подставляет:
Код: pascal
1.
2.
3.
mov eax, ebx
pop ebx
ret


Пардон я не правильно написал, Result конечно же в EAX.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537456
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А через RTTI разве нельзя получить описание параметров метода?
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537477
Cobalt747,
Попробовал через RTTI.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  aRttiContext:=TRttiContext.Create;
  try
    aRttiType := aRttiContext.GetType(aClass);
    for aRttiMethod in aRttiType.GetDeclaredMethods do
      begin
        aCodeAddress := aRttiMethod.CodeAddress;
        aMethodStr := aRttiMethod.ToString;
      end;
  ....      


Странно, но сейчас получает корректно. Пробовал раньше, но не работало как нужно. Тогда извиняюсь, что дурил все голову.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537635
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomschiЕсли не трудно, поделись источником сокровенных знаний про использование регистра EBX...Ну или травой.
Как говорит классик: ... и опыт, сын ошибок трудных ... - практика при использовании ассемблерных вставок и функций на Delphi.

Врет классик. При передаче в методы классов, Self передается в eax (если используется register calling conventions), внутри метода Self может присваиваться локальной переменной (ebp-xx, esp+xx) или любому, в зависимости от random-а, регистру - esi, edi, ebx.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537643
Конструкторы в делфи используют доп. параметр, который передается в регистре DL. Потому верная передача параметров в конструктор не тривиальная задача. Это не простые методы класса.
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537665
Freedoom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schiВрет классик. При передаче в методы классов, Self передается в eax
Классик он на то и классик, что не врёт
Фразой "EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" хотел описать ситуацию, показанную на рисунке
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537675
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По теме, вот тут как раз в интерпретаторе и используется RTTI

https://github.com/nakijun/dwscript/blob/e6b21982a1f6e0c3befb6753625ed4332430d6cd/Source/dwsRTTIExposer.pas#L17
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537684
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Freedoom,

это если ты паскалевский код с ассемблерным мешаешь внутри функции. ТАм ко всем регистрам лучше осторожно относиться.

но к чисто-паскалевским и чисто-ассемблерным функциям это не относится.

там автоматического mov EBX, EAX быть не должно

....кстати, интересно, почему там MOV а не XCHG
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537719
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FreedoomschiВрет классик. При передаче в методы классов, Self передается в eax
Классик он на то и классик, что не врёт
Фразой "EBX нужно использовать очень аккуратно, т.к. при компиляции он используется для параметра Self Возможны AccessViolation "на ровном месте" хотел описать ситуацию, показанную на рисунке

Я хотел сказать, что не только к ebx надо относиться осторожно, но и к esi,edi и т.п.

"EBX must not be altered (unless you restore it before the end of the procedure/function), and so must not ESP, EBP, ESI, or EDI either."
https://stackoverflow.com/questions/3557500/what-cpu-registers-are-to-be-restored-at-the-end-of-an-asm-procedure-in-delphi
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39537720
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Получение адреса overload метода
    #39538133
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jmp_originalИ всё-таки, кто-нибудь из гениев ассемблеро-строения объяснит, почему нельзя просто воспользоваться типизированной переменной?
на XE2 уже не работает :-(

рабочие были вот такие варианты:
если фунция в bpl можно реальное имя посмотреть и через GetProcAddress

в хелпере метод с вменяемым названием и вызовом исходного сделать
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Получение адреса overload метода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]