powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача аннонимной функции в cи библиотеку
53 сообщений из 53, показаны все 3 страниц
Передача аннонимной функции в cи библиотеку
    #39787893
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется
Код: plaintext
1.
 size_t (*write)(const char *str, size_t len); // Тут менялись соглашения о вызове. 



Всё хорошо, пока не назначить анонимную функцию delphi
Код: pascal
1.
2.
3.
4.
5.
 Engine.write:= 
 function(const str: PAnsiChar; len: size_t): size_t cdecl // Тут были перечислены все соглашения. Но по стандарту должен cdecl  
 begin
   // Тут код никогда не выполняется
 end;




Код: pascal
1.
2.
3.
 Twrite =  function(const str: PAnsiChar; len: size_t): size_t cdecl; // Так работает для присвоение Си но НЕ работает для Delphi

 Twrite =  reference to function(const str: PAnsiChar; len: size_t): size_t cdecl; // Вот так, НЕ работает для СИ, но работает для Delphi



Анонимные функции это вообще что??? Мне казалось что это обычная функция, только анонимная.

Обычная функция
Код: 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.
31.
32.
33.
34.
35.
005D080F 33C0             xor eax,eax
005D0811 55               push ebp
005D0812 6860085D00       push $005d0860
005D0817 64FF30           push dword ptr fs:[eax]
005D081A 648920           mov fs:[eax],esp
Project1.dpr.18: write(UTF8String(str));
005D081D 8D45F8           lea eax,[ebp-$08]
005D0820 8B5508           mov edx,[ebp+$08]
005D0823 B9E9FD0000       mov ecx,$0000fde9
005D0828 E8FBA9E3FF       call @LStrFromPChar
005D082D 8B55F8           mov edx,[ebp-$08]
005D0830 A1A8EB5D00       mov eax,[$005deba8]
005D0835 E80A7EE3FF       call @Write0LString
005D083A E83D73E3FF       call @Flush
005D083F E8E867E3FF       call @_IOTest
Project1.dpr.19: Result := len;
005D0844 8B450C           mov eax,[ebp+$0c]
005D0847 8945FC           mov [ebp-$04],eax
Project1.dpr.20: end;
005D084A 33C0             xor eax,eax
005D084C 5A               pop edx
005D084D 59               pop ecx
005D084E 59               pop ecx
005D084F 648910           mov fs:[eax],edx
005D0852 6867085D00       push $005d0867
005D0857 8D45F8           lea eax,[ebp-$08]
005D085A E8E9A2E3FF       call @LStrClr
005D085F C3               ret 
005D0860 E9DB98E3FF       jmp @HandleFinally
005D0865 EBF0             jmp $005d0857
005D0867 8B45FC           mov eax,[ebp-$04]
005D086A 59               pop ecx
005D086B 59               pop ecx
005D086C 5D               pop ebp
005D086D C3               ret 




Анонимная функция
Код: 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.
005D0C4F 33C0             xor eax,eax
005D0C51 55               push ebp
005D0C52 68A00C5D00       push $005d0ca0
005D0C57 64FF30           push dword ptr fs:[eax]
005D0C5A 648920           mov fs:[eax],esp
Project1.dpr.93: write(UTF8String(str));
005D0C5D 8D45F8           lea eax,[ebp-$08]
005D0C60 8B550C           mov edx,[ebp+$0c]
005D0C63 B9E9FD0000       mov ecx,$0000fde9
005D0C68 E8BBA5E3FF       call @LStrFromPChar
005D0C6D 8B55F8           mov edx,[ebp-$08]
005D0C70 A1A8EB5D00       mov eax,[$005deba8]
005D0C75 E8CA79E3FF       call @Write0LString
005D0C7A E8FD6EE3FF       call @Flush
005D0C7F E8A863E3FF       call @_IOTest
Project1.dpr.94: Result := len;
005D0C84 8B4510           mov eax,[ebp+$10]
005D0C87 8945FC           mov [ebp-$04],eax
Project1.dpr.95: end;
005D0C8A 33C0             xor eax,eax
005D0C8C 5A               pop edx
005D0C8D 59               pop ecx
005D0C8E 59               pop ecx
005D0C8F 648910           mov fs:[eax],edx
005D0C92 68A70C5D00       push $005d0ca7
005D0C97 8D45F8           lea eax,[ebp-$08]
005D0C9A E8A99EE3FF       call @LStrClr
005D0C9F C3               ret 



Это если вызвать из Delphi кода. А если вызвать из СИ то вываливается в av даже не вызвав функцию по адресу

... Может быть так что этот адрес известен только для Delphi ? А СИ менеджер памяти о нём совершенно ничего не знает?
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39787911
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcАнонимные функции это вообще что???
Анонимная функция это интерфейс с методом Invoke.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39787944
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,

Простыми словами, вызвать анонимную функцию из сей не получится. А жаль.. Удобно было бы пилить вложенные функции, не разбрасывая их по пространству. Так как запихав их в класс, то после вызова метод класса не знает ничего о классе. Это не TMethod
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39787964
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

а зачем конкретно этим методам "знать что-то о классе", а тем более об объекте ?

делай в классе статические КЛАССОВЫЕ методы, они по сути глобальные функции скрытые из глобального namespace, аналогично классовые переменные - скрытые глобальные
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39787986
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,

Класс имеет загруженный интерфейс, дёргая методы из которого можно управлять библиотекой. Приходится брать инициализированную переменную классом, и из переменной дёргать вызовы


Я подумал, что использовав анонимные переменные, я всегда буду иметь ссылку на класс из self процедуры, раз объявление
Код: pascal
1.
 Twrite =  function(const str: PAnsiChar; len: size_t): size_t of object cdecl; 



не работает
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788003
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так этот интерфейс, он в момент времени один единственный, или их может быть одновременно много?

В случае первого - его можно положить в глобальную переменную, а чтобы "не засорять пространство" - функции и переменную спрятать в класс
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788035
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcArioch,

Класс имеет загруженный интерфейс, дёргая методы из которого можно управлять библиотекой. Приходится брать инициализированную переменную классом, и из переменной дёргать вызовы


Я подумал, что использовав анонимные переменные, я всегда буду иметь ссылку на класс из self процедуры, раз объявление
Код: pascal
1.
 Twrite =  function(const str: PAnsiChar; len: size_t): size_t of object cdecl; 



не работает
Вынесите методы которые являются параметрами чужого API в отдельный подкласс и просто используйте по назначению

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TGodObject = class
private
  type
    TWinApi = class
    public
      class function Write(const str: PAnsiChar; len: size_t): size_t; cdecl; static; // class function и static обязательны
    end;
public
  // .... тут 100500 ваших методов
end;



Код: pascal
1.
ApiCall(TWinApi.Write); или ApiCall(@TWinApi.Write);

смотря как там описан вызов
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788108
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин. Нашёл вариант! В начале функции, мы присвоим self-у адрес на созданный класс

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var
  Enigne: TEngine;

function TEngine.Write(const str: PAnsiChar; len: size_t): size_t;
begin
  Self := Enigne;

  BeginScene();
  Draw2DText(50,100, UTF8String(str), clred, 8);
  EndScene();
end;



Всё заполняется как надо. Но костыль не самый плохой
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788112
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcВсё заполняется как надо. Но костыль не самый плохой
Случай ...
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788113
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Arefiev,

я привык к тому, если под 64 битный компилятор тоже работает, и менеджер утечек молчит. Значит всё в порядке.

Вот так на много быстрее работает
Код: pascal
1.
  Move(Enigne, Self, SizeOf(TestEnigne));



А утечки памяти и не может быть. Потому что мы заимствуем память существующую. И когда мы уничтожим главный объект, все строки - листы, и прочее будет уничтожено в первом классе. А в скопированном будет лежать мусор, который уже не будет нужный
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788114
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне интересно, а можно вообще без копирования обойтись? Тоже так же как это делает TMethod при вызове.. Он же не создаёт класс заново?
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788124
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyАнонимная функция это интерфейс с методом Invoke.Точнее экземпляр наследника TInterfacedObject с полями-параметрами
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788127
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё одно решение

Код: pascal
1.
2.
3.
  asm
    mov [self], offset Enigne
  end;



Но без ассемблера через код, никак такое не удалось сделать. Может кто подскажет как правильно написать ?Что бы он такое же с генерировал без писанины ассемблера
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788128
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerТочнее экземпляр наследника TInterfacedObject с полями-параметрами
Нет.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788132
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kazantsev Alexey,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// Тут кидает в процедуру с первым jmp 
005D0D75 83442404F4       add dword ptr [esp+$04],-$0c
005D0D7A E911010000       jmp Enigne.CreateInit$ActRec.$0$Body 


005D0D7F 83442404F4       add dword ptr [esp+$04],-$0c
005D0D84 E9D7F0E3FF       jmp TInterfacedObject.QueryInterface
005D0D89 83442404F4       add dword ptr [esp+$04],-$0c
005D0D8E E9F5F0E3FF       jmp TInterfacedObject._AddRef
005D0D93 83442404F4       add dword ptr [esp+$04],-$0c
005D0D98 E907F1E3FF       jmp TInterfacedObject._Release
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788134
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анонимки
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, System.Rtti;

type

TAnonFunc = reference to function(const a, b : string) : string;

TAnonFuncImpl = class(TInterfacedObject, TAnonFunc)

function Invoke(const a, b : string) : string;

end;

{ TAnonFuncImpl }

function TAnonFuncImpl.Invoke(const a, b : string) : string;
begin
result := '(' + a + b + ')';
end;

function GetAnonFunc(const APrefix : string) : TAnonFunc;
begin
result := function(const a, b : string) : string
begin
result := APrefix + a + b;
end;
end;

var

func : TAnonFunc;
intf : IInterface absolute func;
f : TRttiField;

begin

func := function(const a, b : string) : string // 1
begin
result := a + b;
end;

// func := GetAnonFunc('text - '); // 2

WriteLn(func('1', '2'));

for f in TRttiContext.Create.GetType(TObject(intf).ClassType).GetFields do
WriteLn(f.ToString);

func := TAnonFuncImpl.Create as TAnonFunc;

WriteLn(func('1', '2'));

ReadLn;

end.


1. Анонимки это интерфейсы.
2. Поля не для параметров, а для контекста (закомментировать 1, раскомментировать 2)
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788135
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С форматированием
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils, System.Rtti;

type

 TAnonFunc = reference to function(const a, b : string) : string;

 TAnonFuncImpl = class(TInterfacedObject, TAnonFunc)

  function Invoke(const a, b : string) : string;

 end;

{ TAnonFuncImpl }

function TAnonFuncImpl.Invoke(const a, b : string) : string;
begin
 result := '(' + a + b + ')';
end;

function GetAnonFunc(const APrefix : string) : TAnonFunc;
begin
 result := function(const a, b : string) : string
           begin
            result := APrefix + a + b;
           end;
end;

var

 func : TAnonFunc;
 intf : IInterface absolute func;
 f    : TRttiField;

begin

 func := function(const a, b : string) : string // 1
         begin
          result := a + b;
         end;

// func := GetAnonFunc('text - '); // 2

 WriteLn(func('1', '2'));

 for f in TRttiContext.Create.GetType(TObject(intf).ClassType).GetFields do
  WriteLn(f.ToString);

 func := TAnonFuncImpl.Create as TAnonFunc;

 WriteLn(func('1', '2'));

 ReadLn;

end.

...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788263
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcМне интересно, а можно вообще без копирования обойтись?

а это в зависимости от 21836382

AriochНу так этот интерфейс, он в момент времени один единственный, или их может быть одновременно много?

потому что

AriochВ случае первого - его можно положить в глобальную переменную, а чтобы "не засорять пространство" - функции и переменную спрятать в класс

а как сделать последнее тебе и написали

Ariochделай в классе статические КЛАССОВЫЕ методы, они по сути глобальные функции скрытые из глобального namespace, аналогично классовые переменные - скрытые глобальные

и даже показали


X-CiteВынесите методы которые являются параметрами чужого API в отдельный подкласс и просто используйте по назначению

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
TGodObject = class
private
  type
    TWinApi = class
    public
      class function Write(const str: PAnsiChar; len: size_t): size_t; cdecl; static; // class function и static обязательны
    end;
public
  // .... тут 100500 ваших методов
end;
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788266
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpcмы присвоим self-у адрес на созданный класс

не на класс, а на объект

на класс никаких указателей не надо, он у тебя и так есть ,если функция не фиртуальная
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788270
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcЕщё одно решение

Код: pascal
1.
2.
3.
  asm
    mov [self], offset Enigne
  end;



Но без ассемблера через код, никак такое не удалось сделать. Может кто подскажет как правильно написать ?Что бы он такое же с генерировал без писанины ассемблера

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure SetPtr(var Obj; Ptr: Pointer); inline;
begin
  Pointer(Obj) := Ptr;
end;

...
  SetPtr(Self, nil);
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788283
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использую вот эту CnCallBack.pas
StdcallMethodToCallBack(Self, @метод класса)
Ограничения:
1. только stdcall
2. реализована для x86. Для 64 битного режима не работает, там все сложнее. Хотя надо бы реализовать до кучи.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788296
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan),

Я это пробовал, не работает. Он помещает указатель на self в edx а в eax адрес на pointer и потом делает mov [edx],eax и в итоге в регистре eax лежат левые данные
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788320
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

какая разница что в eax?
покажи код, тебе же надо в Self поместить адрес объекта

с этой трактовки offset Enigne выглядит довольно странно
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788340
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan),

Не странно, когда это класс.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788341
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788346
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем вообще заниматься хакерством, если можно всё сделать на чистом Delphi и не лезть во внутренние структуры классов?

21836485
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788351
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм.. Вот так тоже работает корректно

Код: pascal
1.
2.
     mov self, 1703180
     mov self,  offset Enigne



Я взял адрес (EBP(0x0019FD04)) + 0x08 = 1703180

И структура self заполнилась
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788357
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот так вообще никак не реагирует

Код: pascal
1.
  PPointer(1703180)^ := @Enigne;
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788359
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это я ошибся. Ложная инфа. self оставил.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788371
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мозг уже кипит. Мне совершенно непонятно с какой магической помощью работает данный ассемблер.

Почему вот это работает
Код: pascal
1.
2.
3.
4.
  asm
      mov [self], offset Enigne
  end;
= mov [ebp+$08],$005e61b4




А вот это не работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
  asm    mov eax,  [self]
    mov [eax], offset Enigne
  end;

=

mov eax,[ebp+$08]
mov [eax],$005e61b4



Притом если написать
mov eax, offset Enigne

То ничего не изменится в конечном результате.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788390
Tactical Nuclear Penguin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcМозг уже кипит. Мне совершенно непонятно с какой магической помощью работает данный ассемблер.



почитайте, что означают квадратные скобки в ассемблере
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788399
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tactical Nuclear Penguin,

Да pointer ^^^ Я знаю это. Но от них не избавится через обычный код
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788449
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых тут вообще не нужен ассемблер.

Во вторых, чем отличается x := p^ от x := p^^ ?

В третьих, чем отличается

x := p;
x^ := n;

от

x := p^;
x := n;

?
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788451
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
впрочем, баги в Дельфи-ассемблере бывают совершенно великолепный, вплоть до компиляции кода прямо противоположного написанному.
Но это не тот случай.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788469
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpc,

лучше не парься, объяви static функцию, как советует X-Cite, и в ней вызывай свой метод, проиграешь чуток на вызове, но кучу проблем избежишь

и с полиморфом, как советует ziv-2014, возиться не советую, очень уж неровно к ним антивирусы относятся, да и на 64-битном коде особого выигрыша они не дают, зато проблем создают ещё больше
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788498
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)проиграешь чуток на вызове

с хрена ли? это обычная глобальная функция, только с переменной Self (которая всё равно константа)
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788506
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)и с полиморфом, как советует ziv-2014, возиться не советую

нет там никакого полиморфа, обычное создание функции-заглушки на лету
тот же вызов DLL, только сложнее.

Это всё тот же старый вопрос:

Ariochа это в зависимости от 21836382

AriochНу так этот интерфейс, он в момент времени один единственный, или их может быть одновременно много?

Если несколько - то одной глобальной переменной не хватит, и придётся плодить функции.
Если один - то просто классовый статический метод.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788584
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochkealon(Ruslan)проиграешь чуток на вызове

с хрена ли? это обычная глобальная функция, только с переменной Self (которая всё равно константа)static метод без потайного параметра, указывающего на класс
в вызове потеряешь если нужно выйти с него на нормальный объект


Ariochkealon(Ruslan)и с полиморфом, как советует ziv-2014, возиться не советую

нет там никакого полиморфа, обычное создание функции-заглушки на лету
тот же вызов DLL, только сложнее.
смотри внимательно

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
StdcallCode: TCnCallback =
    ($8B,$04,$24,$50,$B8,$00,$00,$00,$00,$89,$44,$24,$04,$E9,$00,$00,$00,$00);

  {----------------------------}
  { Stdcall CallbackCode ASM   }
  {----------------------------}
  {    MOV EAX, [ESP];         }
  {    PUSH EAX;               }
  {    MOV EAX, ASelf;         }
  {    MOV [ESP+4], EAX;       }
  {    JMP AMethodAddr;        }
  {----------------------------}


выделение места в куче под код и называется полиморфом
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788618
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут типа что то подобное.. Но НАДО разбираться в этой помойке

https://github.com/pyscripter/python4delphi/blob/e6607599147084a61dc832413867826ea43f0aab/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788635
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FoxpcТут типа что то подобное.. Но НАДО разбираться в этой помойке

https://github.com/pyscripter/python4delphi/blob/e6607599147084a61dc832413867826ea43f0aab/PythonForDelphi/Components/Sources/Core/MethodCallBack.pas тоже самое, просто чуть более ленивый программист
зачем это для питона, где и так есть способы передать указатель, тоже непонятно
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788656
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)в вызове потеряешь если нужно выйти с него на нормальный объект

а зачем "выходить на нормальный объект", если объект всего лишь один (или вообще ноль) и лежит в глобальной переменной?

kealon(Ruslan)выделение места в куче под код и называется полиморфом

Нет, полиморфом называется изменение кода программы, чтобы все команды были другими, а результат их выполнения - тот же самый. Поли-морф, много разных кодов для одного и того же результата. Изначально (MtE, Mutation engine) это вообще было бинарной перекомпиляцией ЕМНИП.

Создание нового кода программы, хоть в куче, хоть где - рядовое дело.
Например Delphi ваш код компилирует.
Например LoadLibrary грузит DLL, у которой статическая линковка зависимых DLL
Например VirtualDub создаёт дерево фильтров для копирования видео с обработкой.

Надо ещё на всякие мульти-ивенты в spring4D внимательно посмотреть
На TVirtualMethodInterceptor из Delphi XE
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788658
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, антивирусы иногда и на банальный FPC RTL стойку делают.

А на запрос отвечают "ну нам так проще, все равно нормальных программ на этом языке не пишут, так что не жалко"
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788666
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,

через годик - два и на простой компилятор delphi будут антивирусы орать
я видел билдеры которые используют чистый компилятор delphi (15 мб размером) для злых умыслов.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788711
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

FoxpcЕщё одно решение

Код: pascal
1.
2.
3.
  asm
    mov [self], offset Enigne
  end;



Но без ассемблера через код, никак такое не удалось сделать.

pointer( Self ) := @Form1;

С уважением, Polesov.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788713
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovpointer( Self ) := @Form1;
pointer( Self ) := @Enigne;

Копи/паст, блин )
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788715
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochkealon(Ruslan)в вызове потеряешь если нужно выйти с него на нормальный объект

а зачем "выходить на нормальный объект", если объект всего лишь один (или вообще ноль) и лежит в глобальной переменной?

kealon(Ruslan)выделение места в куче под код и называется полиморфом

Нет, полиморфом называется изменение кода программы, чтобы все команды были другими, а результат их выполнения - тот же самый. Поли-морф, много разных кодов для одного и того же результата. Изначально (MtE, Mutation engine) это вообще было бинарной перекомпиляцией ЕМНИП.

Создание нового кода программы, хоть в куче, хоть где - рядовое дело.
Например Delphi ваш код компилирует.
Например LoadLibrary грузит DLL, у которой статическая линковка зависимых DLL
Например VirtualDub создаёт дерево фильтров для копирования видео с обработкой.

Надо ещё на всякие мульти-ивенты в spring4D внимательно посмотреть
На TVirtualMethodInterceptor из Delphi XE
загрузчик dll рассматривать как полиморф смысла нет, ибо это часть системы, а свои всегда ровнее

под "выделением места в куче под код" подразумевается естественно и выставление ему флагов на запуск PAGE_EXECUTE и исполнение, а не компиляция

TVirtualMethodInterceptor можешь не копать, нет там полиморфного кода

ну а насчёт рядового дела, неизвестные "загрузчики-распаковщики" вызывают дикие позывы у антивирусов


Полиморф - это любая программа, которая модифицирует свой код(если я дорисую к подписи чёрточки это же модификация? так?), а как она это делает выделяет ли на куче или в кодовом блоке правит не особо важно. Очень так живенько с VCL весь полиморфный код выпиливали.


по сабжу, тынц - довольно старая статья, показывающая как раньше это было круто, и там же длинный ряд комментов
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788722
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey1. Анонимки это интерфейсы.
2. Поля не для параметров, а для контекста (закомментировать 1, раскомментировать 2)
1. Под капотом создается TInterfacedObject
2. Интерфейс не способен захватить контекст и нужен только для соглашения вызова в Invoke
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788730
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

И без уточнений понятно, что за интерфейсом всегда стоит реализация. Оперируя анонимкой - оперируешь интерфейсом, в этом была суть вопроса. А уж какими средствами он реализуется - дело десятое.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788732
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,
Абсолютно согласен. Только изначальный мой пост был для желающего передать анонимку к сишную процедуру. Я хотел уточнить, что это в итоге выльется в вызов метода наследника со всеми вытекающими.
А так понятно что интерфейсы юзаются для чистоты и чтоб в итоге очистить объект, реализующий анонимку.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788790
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerKazantsev Alexey1. Анонимки это интерфейсы.
2. Поля не для параметров, а для контекста (закомментировать 1, раскомментировать 2)
1. Под капотом создается TInterfacedObject
2. Интерфейс не способен захватить контекст и нужен только для соглашения вызова в Invoke
Способен, потому что в зависимости от контекста, этот интерфейс для анонимной процедуры будет разным, а именно там будут поля для переменных контекста.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788890
Foxpc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PolesovНо без ассемблера через код, никак такое не удалось сделать.

pointer( Self ) := @Form1;

С уважением, Polesov.[/quot]

Это не работает в новых делфях. Нельзя присвоить правый к левому.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39788898
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)Полиморф - это любая программа, которая модифицирует свой код

Нет, "самомодифицирующийся код" - это отдельный термин.

Полиморфные генераторы — исполнимые модули в составе компьютерных вирусов, главной функцией которых является шифрование тела вируса случайным ключом и генерация соответствующего случайного, но работающего расшифровщика. В итоге копии вирусов, зашифрованные полиморфными генераторами, могут не совпадать ни в одном байте и иметь разную длину.

При этом это делается при заражении - т.е. создании новых копий вируса на новых файлах, т.е. никакие PAGE_EXECUTE не нужны

https://en.wikipedia.org/wiki/Polymorphic_engine
https://en.wikipedia.org/wiki/Self-modifying_code

Есть пересечение этих множеств

https://en.wikipedia.org/wiki/Polymorphic_code

In computer terminology, polymorphic code is code that uses a polymorphic engine to mutate while keeping the original algorithm intact . That is, the code changes itself each time it runs, but the function of the code (its semantics) will not change at all. For example, 1+3 and 6-2 both achieve the same result while using different values and operations.

....но данный случай сюда не подходит, потому что алгоритм меняется. Появл\яются новые функции,, которых ранее не было.
...
Рейтинг: 0 / 0
Передача аннонимной функции в cи библиотеку
    #39789220
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Foxpcpointer( Self ) := @Form1;
Это не работает в новых делфях. Нельзя присвоить правый к левому.
Проверял на XE7 - работает. Новее у меня нету.
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Передача аннонимной функции в cи библиотеку
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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