|
|
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Имеется Код: plaintext 1. Всё хорошо, пока не назначить анонимную функцию delphi Код: pascal 1. 2. 3. 4. 5. Код: pascal 1. 2. 3. Анонимные функции это вообще что??? Мне казалось что это обычная функция, только анонимная. Обычная функция Код: 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. Анонимная функция Код: 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. Это если вызвать из Delphi кода. А если вызвать из СИ то вываливается в av даже не вызвав функцию по адресу ... Может быть так что этот адрес известен только для Delphi ? А СИ менеджер памяти о нём совершенно ничего не знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 16:19 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
FoxpcАнонимные функции это вообще что??? Анонимная функция это интерфейс с методом Invoke. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 16:34 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Простыми словами, вызвать анонимную функцию из сей не получится. А жаль.. Удобно было бы пилить вложенные функции, не разбрасывая их по пространству. Так как запихав их в класс, то после вызова метод класса не знает ничего о классе. Это не TMethod ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 17:04 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Foxpc, а зачем конкретно этим методам "знать что-то о классе", а тем более об объекте ? делай в классе статические КЛАССОВЫЕ методы, они по сути глобальные функции скрытые из глобального namespace, аналогично классовые переменные - скрытые глобальные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 17:25 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Arioch, Класс имеет загруженный интерфейс, дёргая методы из которого можно управлять библиотекой. Приходится брать инициализированную переменную классом, и из переменной дёргать вызовы Я подумал, что использовав анонимные переменные, я всегда буду иметь ссылку на класс из self процедуры, раз объявление Код: pascal 1. не работает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 17:50 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Ну так этот интерфейс, он в момент времени один единственный, или их может быть одновременно много? В случае первого - его можно положить в глобальную переменную, а чтобы "не засорять пространство" - функции и переменную спрятать в класс ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 18:10 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
FoxpcArioch, Класс имеет загруженный интерфейс, дёргая методы из которого можно управлять библиотекой. Приходится брать инициализированную переменную классом, и из переменной дёргать вызовы Я подумал, что использовав анонимные переменные, я всегда буду иметь ссылку на класс из self процедуры, раз объявление Код: pascal 1. не работает Вынесите методы которые являются параметрами чужого API в отдельный подкласс и просто используйте по назначению Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: pascal 1. смотря как там описан вызов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 19:39 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Блин. Нашёл вариант! В начале функции, мы присвоим self-у адрес на созданный класс Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Всё заполняется как надо. Но костыль не самый плохой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 22:46 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
FoxpcВсё заполняется как надо. Но костыль не самый плохой Случай ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 23:12 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev, я привык к тому, если под 64 битный компилятор тоже работает, и менеджер утечек молчит. Значит всё в порядке. Вот так на много быстрее работает Код: pascal 1. А утечки памяти и не может быть. Потому что мы заимствуем память существующую. И когда мы уничтожим главный объект, все строки - листы, и прочее будет уничтожено в первом классе. А в скопированном будет лежать мусор, который уже не будет нужный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 23:26 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Мне интересно, а можно вообще без копирования обойтись? Тоже так же как это делает TMethod при вызове.. Он же не создаёт класс заново? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2019, 23:29 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Kazantsev AlexeyАнонимная функция это интерфейс с методом Invoke.Точнее экземпляр наследника TInterfacedObject с полями-параметрами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 00:51 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Ещё одно решение Код: pascal 1. 2. 3. Но без ассемблера через код, никак такое не удалось сделать. Может кто подскажет как правильно написать ?Что бы он такое же с генерировал без писанины ассемблера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 01:24 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
white_niggerТочнее экземпляр наследника TInterfacedObject с полями-параметрами Нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 01:29 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 02:27 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Анонимки 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 02:38 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
С форматированием Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 02:39 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
FoxpcМне интересно, а можно вообще без копирования обойтись? а это в зависимости от 21836382 AriochНу так этот интерфейс, он в момент времени один единственный, или их может быть одновременно много? потому что AriochВ случае первого - его можно положить в глобальную переменную, а чтобы "не засорять пространство" - функции и переменную спрятать в класс а как сделать последнее тебе и написали Ariochделай в классе статические КЛАССОВЫЕ методы, они по сути глобальные функции скрытые из глобального namespace, аналогично классовые переменные - скрытые глобальные и даже показали X-CiteВынесите методы которые являются параметрами чужого API в отдельный подкласс и просто используйте по назначению Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 11:19 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Foxpcмы присвоим self-у адрес на созданный класс не на класс, а на объект на класс никаких указателей не надо, он у тебя и так есть ,если функция не фиртуальная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 11:24 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
FoxpcЕщё одно решение Код: pascal 1. 2. 3. Но без ассемблера через код, никак такое не удалось сделать. Может кто подскажет как правильно написать ?Что бы он такое же с генерировал без писанины ассемблера Код: pascal 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 11:27 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Я использую вот эту CnCallBack.pas StdcallMethodToCallBack(Self, @метод класса) Ограничения: 1. только stdcall 2. реализована для x86. Для 64 битного режима не работает, там все сложнее. Хотя надо бы реализовать до кучи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 11:38 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Я это пробовал, не работает. Он помещает указатель на self в edx а в eax адрес на pointer и потом делает mov [edx],eax и в итоге в регистре eax лежат левые данные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 11:53 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
Foxpc, какая разница что в eax? покажи код, тебе же надо в Self поместить адрес объекта с этой трактовки offset Enigne выглядит довольно странно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 12:14 |
|
||
|
Передача аннонимной функции в cи библиотеку
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), Не странно, когда это класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.03.2019, 12:38 |
|
||
|
|

start [/forum/search_topic.php?author=Cheguevara&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
205ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
88ms |
get tp. blocked users: |
2ms |
| others: | 444ms |
| total: | 805ms |

| 0 / 0 |
