Magic Pointers («красивые» указатели на функции, вызов)

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение ger_kar » 29.03.2012 (Чт) 21:30

Хакер писал(а):Либо это просто баг от моих кривых рук.
Вообще то пока никаких глюков в работе я не заметил, вроде все работает тип-топ.
Артур, ты просто изучаешь ради изучения или у тебя глюк проявился?
Бороться и искать, найти и перепрятать

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 30.03.2012 (Пт) 19:45

ger_kar писал(а):Вообще то пока никаких глюков в работе я не заметил, вроде все работает тип-топ.

Это не значит, что бага нет.

Код, необходимый, чтобы баг проявился.
Код: Выделить всё
Private Declare Sub test_ptr Lib "*" ()
Sub a(): Debug.Print "Всё плохо": End Sub
Sub b(): Debug.Print "Всё хорошо": End Sub
Sub main()
    MagicPointersOnOff True
        FuncPointer("test_ptr") = L_(AddressOf a)
        Call test_ptr
    MagicPointersOnOff False
   
    MagicPointersOnOff True
        FuncPointer("test_ptr") = L_(AddressOf b)
        Call test_ptr
    MagicPointersOnOff False
End Sub


Ожидаемый результат (вывод в Immediate Pane):
Код: Выделить всё
Всё плохо
Всё хорошо


Реальный результат:
Код: Выделить всё
Всё плохо
Всё плохо


После исправления той строчки, которая вызвала сомнения у Артура, баг проходит. Так что это точно баг. Спасибо, Артур. Ты прям тестер :)
Выложу версию с исправлением двоих найденных тобою ошибок.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 30.03.2012 (Пт) 20:19

Выложил. Просьба о багах писать в той теме, а не в этой.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

max255
Начинающий
Начинающий
Аватара пользователя
 
Сообщения: 1
Зарегистрирован: 23.11.2010 (Вт) 10:47

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение max255 » 02.04.2012 (Пн) 9:06

Это вещь... Теперь есть еще больше возможностей в VB6.
Правда еще не совсем понял как все это работает... Буду разбираться...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 02.04.2012 (Пн) 9:10

Спасибо. Вот доделаю «кирпич для обеспечения многопоточности», тогда будет реально больше :)
Я должен был доделать его ещё в прошлом году, но вынужден заниматься другой работы. Там совсем-совсем чуть-чуть осталось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Adam Smith » 26.12.2012 (Ср) 19:06

Не сдавайся! ))))))))))))))))))))))

Кирпич для устойчивой многопоточности вещь нужная.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 26.12.2012 (Ср) 19:07

Я понимаю, но со свободным временем такая напряжёнка, что я уже думаю, вот было бы хорошо отдать его кому-нибудь, чтобы доделали. Но ведь не разберутся.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Adam Smith » 28.12.2012 (Пт) 16:48

Как-то изучая чужие идеи я написал несколько-поточную прогу ),
так она запускается только на 5 версиях msvbvm60.dll, и то ...

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

Изображение

Изображение

Это было пару лет назад, с тех пор многому научился, многое понял, а писать новую версию некогда.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 28.12.2012 (Пт) 17:54

Adam Smith, во-первых, это тут к чему, а во-вторых, при чём тут Win7?
А в третьих, потоки здесь никакого выигрыша дать не должны, даже скорее наоборот, насколько я представляю...

Adam Smith
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 25.04.2008 (Пт) 9:04
Откуда: ЧР. Грозный

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Adam Smith » 29.12.2012 (Сб) 13:36

Зачем что-то представлять если это тут никчему.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 29.12.2012 (Сб) 14:11

Странный ты какой-то...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 8:05

Хочу на основе MagicPointersOnOff написать для себя функцию перехвата произвольной функции из импорта :)

Код: Выделить всё
            ' А вот под IDE есть проблема: DFC не импортируется через им-
            ' порт, её адрес жестко вшит в динамически генерируемые куски кода.
            ' Так что единственный приемлемый способ её перехватить: найти эти
            ' динамически генерируемые кусочки кода (переходнички) и перезапи-
            ' сать адрес в них.

На сколько я понял, это относится и к другим функциям, которые берутся из подключенной к проекту тлб. Правильно понимаю?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 10:40

arthur2 писал(а):Хочу на основе MagicPointersOnOff написать для себя функцию перехвата произвольной функции из импорта :)


Во-первых, мне надо переделать кирпирч — убрать утечку (хотя сперва нужно подтвердить ваши эксперименты).

Во-втоых, не понял идею.

arthur2 писал(а):На сколько я понял, это относится и к другим функциям, которые берутся из подключенной к проекту тлб. Правильно понимаю?

Неправильно понял, я думаю. Да и DFC не берётся же из TLB. В какой TLB ты её видел?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 11:27

В этом кирпиче у тебя утечки нет - ты там сам выделяешь место под дескриптор, а не редимишь массив заранее.

Хакер писал(а):Во-втоых, не понял идею.

Идея - задекларировать разным способом нужные болванки функций в тлб, а затем переписать адреса функций. Хочу получить те же самые типизированные вызовы по указателю, но через тлб, а значит без конвертации строк.

Хакер писал(а): Да и DFC не берётся же из TLB. В какой TLB ты её видел?
А откуда она берется?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 11:32

arthur2 писал(а):Идея - задекларировать разным способом нужные болванки функций в тлб, а затем переписать адреса функций.

Ну, ты понимаешь, это же дико неудобно. Будешь каждый раз переделывать и перекомпилировать TLB?

Кроме того, неужели ты думаешь, что мне эта идея не приходила? Проблема с «ранним» импортом в том, что вызов функции обычно идёт так:
Код: Выделить всё
mov esi, dword [...]
...
...
...
...
call esi
...
...
...
call esi
...
..
call esi


Таким образом, ты перепишешь ячейку IAT, но вызовы будут идти по старому адресу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 12:01

Хакер писал(а):Ну, ты понимаешь, это же дико неудобно. Будешь каждый раз переделывать и перекомпилировать TLB?
В общем-то, переделывать тлб не так уж и сложно, как оказалось. По крайней мере, если это примитивная тлб без всяких интерфейсов, а только с объявлениями функций.

Я зарегил idl на удобный текстовый редактор и просто добавляю нужные idl-ы в проект. Неудобство только в том, что бейсик блокирует тлб и не дает её перекомпилировать, пока она в референах проекта. Решаю это аддином, который выгружает проект, запускает компиляцию тлб, а затем загружает проект снова.

Хакер писал(а):Кроме того, неужели ты думаешь, что мне эта идея не приходила?
Я не хочу добиться того же изящества и удобства, какое есть в этом твоем кирпиче. Делаю для себя, так что даже не очень удобный вариант меня устроит.

Идея, в общем, такая: экспортирую из себя несколько нужных болванок. Импортирую через тлб назад в себя.
Хакер писал(а):Таким образом, ты перепишешь ячейку IAT, но вызовы будут идти по старому адресу.
А где эти старые адреса хранятся? может, их тоже можно как-то найти и подменить? Асм, увы, не понимаю :(
Последний раз редактировалось arthur2 21.03.2014 (Пт) 12:05, всего редактировалось 1 раз.
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 12:02

arthur2 писал(а):А где эти старые адреса хранятся? может, их тоже можно как-то найти и подменить? Асм, увы, не понимаю :(

1. Учись понимать асм.
2. В регистре ESI, куда записываются перед цепочкой вызовов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 12:12

Хакер писал(а):Учись понимать асм.
Пробовал. Самому - не получается, нужно, чтобы кто-то объяснял. Такой у меня склад мышления. А курсов подобных не встречал.
Хакер писал(а): В регистре ESI, куда записываются перед цепочкой вызовов.
Откуда они берутся, чтобы записать их в эту ESI перед цепочкой вызовов? Или это совсем бесполезно, концов не найти?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 12:26

arthur2 писал(а):Пробовал. Самому - не получается, нужно, чтобы кто-то объяснял.

Не верю. В своё время я думал, что наверное мне никогда не познаю ассемблер. Так, не прочитав ни одной книжки по ассемблеру, в один момент я осознал, что просто понимаю его. Дальше оставалось, понимая 85 %, поставить перед собой вопросы относительно оставшихся 85 процентов, придумать в голове эксперименты, поставить их и открыть и уяснить для себя оставшиеся 15 процентов.

Просто читай дизасм своего и чужого кода. Компилируй какой-то код и смотри, во что он компилируется. Меняй свой код, и смотри, как меняется ассемблерный листинг. И всё придёт.



arthur2 писал(а):Откуда они берутся, чтобы записать их в эту ESI перед цепочкой вызовов?

Из IAT и берутся.

Т.е. последовательность действий будет такая:
  • Адрес функции из ячейки IAT записывается в регистр ESI
  • Ты записываешь в ячейку IAT новый адрес, по которому ты хочешь, чтобы шли вызовы
  • Осуществляется вызов по адресу, который находится в регистре ESI, таким образом выполнение уходит по оригинальному адресу.

Причём это один из возможных сценариев. Сработает ли трюк так или не так в конкретном случае зависит от случая и от настроек оптимизации.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.03.2014 (Пт) 12:37

Хакер писал(а):Т.е. последовательность действий будет такая

А такая последовательность действительно может возникнуть в случае, кода изменение адреса в IAT происходит до первого вызова по нему?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 12:48

Qwertiy писал(а):А такая последовательность действительно может возникнуть в случае, кода изменение адреса в IAT происходит до первого вызова по нему?


Может. Но даже если бы не могла, положение вещей, когда указатель должен быть проинициализирован всенепременно до первого вызова — это уже плохой подход и неудобное решение.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 12:49

Ты не берешь в расчет, что для меня программирование - не то, чем я ежедневно занимаюсь. Увы, но на это у меня в принципе очень мало времени, а последние несколько лет не было вообще нисколько. Чтобы разобраться "твоим" способом, нужно очень сильно погрузиться в тему. И потом - я же говорю, тип мышления - Си, например, я абсолютно бесполезно пытался понять сам по книжкам, а на курсах - разобрался абсолютно без напряжения. У книги нет обратной связи - а мне в обучении она крайне необходима.
Хакер писал(а):Т.е. последовательность действий будет такая:

Адрес функции из ячейки IAT записывается в регистр ESI
Ты записываешь в ячейку IAT новый адрес, по которому ты хочешь, чтобы шли вызовы
Осуществляется вызов по адресу, который находится в регистре ESI, таким образом выполнение уходит по оригинальному адресу.
Получается, что не сработает, если подменять адрес прямо перед вызовом, но ведь должно сработать, если подменить его заранее? Или я опять не понял?

И откуда всё же берется DFC? Я так понимаю, что из импорта. А путь в импорт в бейсике - через тлб.

Разница в проекте и в экзешнике по этому аспекту, на сколько понимаю, в том, что в проекте функции, объявленные через тлб, вызываются как-то хитро (как именно?), а в экзешнике - они уже просто в импорте.
Так?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 12:53

Хакер писал(а):Может. Но даже если бы не могла, положение вещей, когда указатель должен быть проинициализирован всенепременно до первого вызова — это уже плохой подход и неудобное решение.
Я правильно понял, что если даже мы один раз подменим адрес успешно, после первого вызова мы его уже не сможем менять?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 14:54

arthur2 писал(а):Получается, что не сработает, если подменять адрес прямо перед вызовом, но ведь должно сработать, если подменить его заранее? Или я опять не понял?

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

arthur2 писал(а):И откуда всё же берется DFC? Я так понимаю, что из импорта

Ну поскольку речь выше шла о работе под IDE, то неправильно ты понимаешь. DFC под IDE живёт в VBA6.DLL и не экспортируется вообще. Код, ссылающийся на DFC, генерируется силами кода из VBA6.DLL. Таким образом, со стороны VBA6.DLL функция DFC является внутренней сущностью, и VBA6.DLL легко вставлёт адрес своей внутренней функции в генерируемый код. Экспорт и импорт тут не причём.

arthur2 писал(а):Я правильно понял, что если даже мы один раз подменим адрес успешно, после первого вызова мы его уже не сможем менять?

Всё зависит от конкретного случая и от того, как будет действовать оптимизатор.

Если вызовов несколько, и они в одной процедуре, и подмена адреса в этой же процедуре, и один вызов уже состоялся, и ESI ничем не перезаписывается (например не перезаписывается необходимостью иметь адрес для вызова какой-то другой функции) — то облом. Но если что-то не соблюдено, то наверное не облом. И речь, конечно же, про скомпилированный в Native-код проект.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 15:47

Хакер писал(а):Перезапись в ячейки в одной процедуре, вызов по указателю — в другой
Хакер писал(а):Если вызовов несколько, и они в одной процедуре, и подмена адреса в этой же процедуре, и один вызов уже состоялся, и ESI ничем не перезаписывается (например не перезаписывается необходимостью иметь адрес для вызова какой-то другой функции) — то облом.
Да, неудобно. Ровно настолько, чтобы не связываться - планировал как раз менять указатели в цикле :(
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение Хакер » 21.03.2014 (Пт) 15:50

arthur2 писал(а):Ровно настолько, чтобы не связываться - планировал как раз менять указатели в цикле :(

Если случай однократны и исключительный, то можно заморочиться, конечно, поиграв с насройками оптимизации. Но как reusable решение — не годится.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.03.2014 (Пт) 17:04

Хакер писал(а):Если вызовов несколько, и они в одной процедуре, и подмена адреса в этой же процедуре, и один вызов уже состоялся, и ESI ничем не перезаписывается (например не перезаписывается необходимостью иметь адрес для вызова какой-то другой функции) — то облом. Но если что-то не соблюдено, то наверное не облом. И речь, конечно же, про скомпилированный в Native-код проект.

Получается, что если мы аналогичным способом из функции подмены вызовем пустую функцию, то значение в регистре сотрётся и при вызове будет верный (т. е. подмёнённый) адрес.
С другой стороны, промежуточный вызов через регистр кажется чересчур неоптимальным.
Да, тут бредовая идея возникла, прокомментируй, пожалуйста :) А насколько рискованно сравнить текущее значение в регистре с тем адресом, который мы меняем, и при совпадении переписать регистр?

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 18:36

Qwertiy писал(а):Получается, что если мы аналогичным способом из функции подмены вызовем пустую функцию, то значение в регистре сотрётся и при вызове будет верный (т. е. подмёнённый) адрес.


Или даже такая мысль: одну из болванок перенаправляем раз и навсегда на свои нужды. Перенаправляем её как раз на ту функцию, которая будет подменять адреса. Получается, что всякий раз, когда мы будет менять адрес на новый, ESI будет уже использоваться для этой нашей вспомогательной функции, значит замена всякий новый раз будет корректна. Бинго?
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.03.2014 (Пт) 19:12

arthur2, вообще не понял, что ты предлагаешь.
Но по-моему, это работать всё равно не будет, поскольку среда должна во время компиляции понять, что регистр перезаписывается, так что из лишней перезаписи в рантайме при помощи хака ничего не выйдет хорошего.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Magic Pointers («красивые» указатели на функции, вызов)

Сообщение arthur2 » 21.03.2014 (Пт) 19:35

У нас есть несколько функций-болванок в импорте. Мы собираемся подменять адреса этих болванок, чтобы вызывалось то, что мы хотим. Так?

У нас есть гипотетическая функция, которая и будет подменять адреса. Так?

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

Я предлагаю сделать, чтобы сама наша функция подмены использовала регистр. Для этого я предлагаю первую из наших болванок перенаправить как раз на эту самую функцию подмены.

Так понятнее?
Артур
 
   

Пред.След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList