![]() |
|
Модераторы: Daevaorn Страницы: (8) Все « Первая ... 2 3 [4] 5 6 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]()
|
|
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
[color=silver]
сорри - ночь на дворе ) Ну а с примером Вы перемудрили Правильно ли я понял: 1. Посредством интерфейса MSL , мы можем управлять состоянием хозяина 2. MSL - предоставляет некий общий интерфейс 3. Вызов методов MSL происходят на стороне клиeнта удобным ему способом. Добавлено через 4 минуты и 57 секунд это принципиальная деталь, или просто вариант реализации? |
|||
|
||||
| vaddsm |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Сделал именно так, как хотел видеть. В BCB работает, сейчас еще в VS отладить осталось.
После такой вот строчки: TAnyClass *Inst = new TAnyClass(); Появляется MessageBox(0,"Action fired~!","Trick! ;)))",0); Решил интригу сделать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
борланд позволяет так писать? ))) Это сообщение отредактировал(а) mes - 7.9.2008, 13:13 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
У меня нет вариантов как Вы добыли this от Inst по смещению метода (
Добавлено через 4 минуты и 4 секунды тут borland позволяет забыть "&" ? Это сообщение отредактировал(а) mes - 7.9.2008, 13:15 |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
а почему нет? с & и без него записи эквивалентны |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
не хотел-бы я этот код разбирать
Добавлено через 4 минуты и 43 секунды вообще это не правильно, нужно писать &ClassName::CallMethod но borland позволяет и так... Добавлено через 7 минут и 27 секунд вот то-же ошибка, указатель на функцию не обязан помещаться в DWORD Добавлено через 9 минут и 53 секунды в общем код в топку, то-же самое можно сделать красиво с помощью шаблонов... кстати интересно, что ты будешь делать, когда отладчик тебе покажет на ошибку в строке Добавлено через 12 минут и 1 секунду неужели этот код собрался без единого предупреждения.... если да, то фтопку борланд |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
это почему это? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Я так до сих пор и не понял кто и как будет использовать интерфейс,
вот еще один основанный на догадках пример, без затрагивания конструктора. Таблица составляется на этапе компиляции. В момент создания объекта, никаких(за исключением предусмотренных компилятором, таких как смена указателя на VMT) действий производится не будет. Связывание интерфейса с реализацией происходит в момент запроса интерфейса. Никаких лишних переменных в класс хозяин не добавляется . (т.е реально использовать такой вид связывания для чистых абстракных класов) Естественно , что для удобного использования , можно скрыть все под макросами, как в вышеприведенных примерах.
Это сообщение отредактировал(а) mes - 7.9.2008, 14:39 |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
потому-что мы получаем указатель на функцию vs2005, позволяет делать только так |
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
Lazin, если есть под рукой Страуструп специальное издание. Открой страницу 199.
макросам ON_WM_SOMETHING можно скормить как func так и &func, разницы не будет. Следовательно VS по баробану, ка ки должно быть. Добавлено через 29 секунд 2005 не помню, но в 2003 и 2008 точно можно. |
|||
|
||||
| vaddsm |
|
||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Указатель на метод класса НИКОГДА не DWORD, если только он не static __stdcall А вот первые 4 байта, всегда адрес метода в памяти, затем, например this... Это уже зависит от того, какой это метод, но в данном случае, мы конкретно указали void __fastcall.
С чего ради?
Lazin, а ведь на прошлый пафос, вроде: За такой код меня бы уволили. Ты мне так и не ответил, почему? А сейчас опять необоснованно разбрасываешься словами, и уж тем более:
Ну так давай! Докажи что это не болтовня! Тайна конструктора TMyLib:
|
||||||||||
|
|||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
А нельзя ли расшифровать, что происходит в ассемблерной вставке ? |
|||
|
||||
| Lazin |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ты что-то путаешь в коде который ты привел
ты используешь указатель на метод класса, при чем там this я не в курсе, но я точно знаю что любой указатель нельзя приводить к DWORD, так как указатель может быть и 8-ми байтовым (на 64х битных системах), а указатель на метод или функцию нельзя приводить даже к void* попробуй собрать и запустить свой код под em64t, узнаешь потому-что лень, потому-что выходные
по твоему это входит в противоречие с тем что я говорил? Здесь происходит вызов функции, но, где гарантия что lpfn нужно вызывать именно так, ведь в своем коде ты делаешь С-style cast и приводишь указатель на функцию к DWORD, и в принципе, туда можно передать любую функцию... в общем так не делают Добавлено через 2 минуты и 3 секунды просвети, что это такое? |
||||||||
|
|||||||||
| vaddsm |
|
||||||||||||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 128 Регистрация: 30.6.2007 Репутация: нет Всего: нет |
Да канеш можно.
Прежде всего давайте рассмотри начало любой функции описанной средствами языка c++ в машинном коде:
Как известно, регистр ESP – это указатель на текущий адрес в стеке, тогда из приведенного примера однозначно следует, что начало каждой функции ознаменуется: 1. Сохранением в стек регистра EBP, содержащего адрес начала стека вызывающей функции. 2. Записью в регистр EBP, текущего адреса в стеке. Благодаря этому правилу мы всегда можем раскрутить стек и дойти до начала стека интересующей нас функции. В нашем случае крутить ) придется не долго. Но так, как для выполнения этой операции нам потребуется один регистр, необходимо позаботится о том, чтобы его первоначальное значение не было утеряно:
Далее, получим адрес начала стека конструктора класса TMyLib.
Так, как конструктор класса TMyLib вызывается из конструктора шаблонного класса TMyLibInterface, получим начало стека и этого конструктора.
Мы уже у цели, финишная прямая – получение адреса начала стека конструктора класса над которым производим действие, в данном случае, это TAnyClass.
Но в данном случае мы берем значение не из ячейки стека, в которой находится очередной EBP, а на 4 байта выше, именно туда функция – метод класса помещает указатель. А как по вашему работает отладчик, который всегда в Watches, вам покажет значения локальных переменных. Вот, например как сохраняет this, fastcall метод:
После приведенных инструкций, в EAX у нас содержится адрес экземпляра TAnyClass. Почему именно EAX, спросите вы, а все очень просто, функции скомпилированных по конвенции fastcall принимают указатель this именно в этом регистре. Адрес метода, который мы будем вызывать у нас уже есть, это lpfn. Не будет терять время даром, nop, nop, nop )). Вызываем:
Вот и все, теперь для чистоты эксперимента, вернем все туда, где оно и лежало.
Это сообщение отредактировал(а) vaddsm - 7.9.2008, 17:20 |
||||||||||||||||
|
|||||||||||||||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
я отвечу. 1. Куча макросов, код тяжело читать. 2. Код - костыль, не то что палтформо - а компиляторо зависим. 3. Мне сходу не понятно, что делает втой код, и не факт что я бы быстро вьехал, если бы не знал. Это показатель, для меня. Это сообщение отредактировал(а) vinter - 7.9.2008, 17:27 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |