![]() |
|
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]()
|
|
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Здравствуйте.
Меня интересует как правильно получить адрес функции у класса. (Я хочу потом использовать функцию у класса как CallBack_function, поэтому для этого мне нужно получить адрес) Например вот такой код
Подскажите пожалуйста как тут правильно сделать? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Можно присвоить метод переменной типа метод, а потом извлечь адрес функции.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Ak47black |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Alexeis, ага так вышло.
Ну всетаки почему напрямую нельзя получить, то до меня недоходит Добавлено @ 16:53 Alexeis, а такой код который ниже реально сделать вообще?
waveOutProc - функция принадлежащая классу. При выполнении получаю ошибку
Пытаюсь процедуру обработки привязать к классу Это сообщение отредактировал(а) Ak47black - 1.12.2007, 16:54 |
||||
|
|||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 22 Всего: 128 |
низя метод назначить в кач.колбэка апи функции
-------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Почему? Метод фактически не отличается от функции. Есть свои особенности, метод реализуется как функция. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| OdesitVadim |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 9.11.2007 Где: Одесса:) Репутация: нет Всего: нет |
Вся загвоздка в том, что в методах есть неявный параметр, токорый указывает на объект. Вам то это не видно, а линковщик, когда собирает, обнаруживает несоответсвие параметров.
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Хмм поэтому.
Вообщем у меня у цель, то сделать класс, при использовании которого, каждый экземпляр которого имел-бы свою CallBack функцию и проигровали звук независимо друг от друга. Как-бы тут сделать может какие идеи есть? Это сообщение отредактировал(а) Ak47black - 1.12.2007, 23:30 |
|||
|
||||
| Alexeis |
|
||||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Ak47black, так что тот
Ну эту проблему как раз обойти не сложно, если постараться, то функции можно впарить чего угодно. Можно попробовать такой способ
Суть его в том что винда думает будто у функции 5 параметров, каждый из которых DWORD у нас так е есть 5м параметром будет Self. Винда конечно же не знает что мы там ждем указатель на объект и пихает туда первый параметр, потому сразу после вызова нужно либо расставить параметры по своим местам, либо переименовать так чтобы не запутаться. Теперь обязательный момент. waveOutOpen разрешает калбэк передать дополнительный параметр, в нем передаем указатель на реальный объект, после вызова в Self мы должны записать это значение см Self := TForm1(dwInstance); Теперь по идее все на своих местах. Просили 5 параметров типа DWORD мы их вам дали по модели stdcall. Сомнение у меня вызывает только, то что по модели stdcall параметры передаются справа-налево, если это касается и указателя на класс, то проблем не должно возникнуть. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
| Ak47black |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Alexeis, с этим то кодом Erorr у меня выходит
С такими параметрами и недолжно работать по идее.
Это сообщение отредактировал(а) Ak47black - 2.12.2007, 13:35 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Ну я понадеялся, что хватит сообразительности вместо пустых параметров поставить реальные -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Alexeis, а мне кажется что error изза того что стёк портится.
Добавлено через 2 минуты и 41 секунду При вызове waveOutProc все параметры сдвинуты на 1 влево. Добавлено через 3 минуты и 47 секунд И эррор появляется только после первого выполнения waveOutProc. Это сообщение отредактировал(а) Ak47black - 2.12.2007, 14:58 |
|||
|
||||
| Ak47black |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Хотя вроде нет
Вот так вызов происходит в Winmm.dll
А вот сама пустая процедура CallBack
Чтото я запутался тут Какиенибудь идеи есть? И еше при вызове WaveOutOpen, парметры ненужно смешать, я пробовал waveOutProc как внизу
waveOutProc вызывается один раз, после прохождения получаю error :| |
||||||
|
|||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 34 Всего: 459 |
Епрст ну что за 0! я же говорил там должен быть указатель на класс!
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Эммм это в моем случае 0? Где?
|
|||
|
||||
| Ak47black |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2205 Регистрация: 2.12.2005 Репутация: нет Всего: 0 |
Пытаюсь понять что именно вызывает ошибку чтобы както предотвратить.
Покопав понял, что изза того что стек портиться прога прыгает(возвращается) на 00000000 адрес
Я предполагаю что вот этот лишний параметр както его и портит, только как? |
|||
|
||||
![]()
|
| Правила форума "Delphi: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |