Форум программистов, компьютерный форум CyberForum.ru

Наследование от виртуального класса - C++

Восстановить пароль Регистрация
 
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
18.11.2012, 03:07     Наследование от виртуального класса #1
Хукаю DirectX с помощью Detours.
Делаю обёртку. Пишу много обезьяньего кода.
Получаю такой месседж:
перегружающая виртуальная функция отличается от "IDirect3D9::EnumAdapterModes" только соглашением о вызове
С winAPI знаком поверхностно. С DirectX ещё более поверхностно. Но задача требует выполнения (какая - читайте историю моих сообщений).
С Си++ знаком на уровне страшной комбинации Си кода, Си++ кода и ассемблерных вставок (хардкор, только хардкор).
Следовательно вопрос - что за виртуальные функции, с чем их едят... ой... читать учебники я умею. Неправильно задаю вопрос...
Вот так - каким образом мне перегрузить виртуальную функцию, чтобы VSC++2010 не ругалась на эти перегрузки.

P.S. В перегруженном методе - вызов метода из класса-родителя (лишь парочка заполнена зловещим кодом).
P.P.S. Если интересует обезьяний код - прикрепил в аттачи (просьба не падать в обморок, больше половины - копипаста).
P.P.P.S. Detours 1.5.
Вложения
Тип файла: zip lol.zip (593.3 Кб, 3 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
18.11.2012, 03:10     Наследование от виртуального класса #2
это видимо новый тренд
выкладывать куски кода и текст ошибки с указанием строки ныне не модно
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11825 / 6804 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
18.11.2012, 03:13     Наследование от виртуального класса #3
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Следовательно вопрос - что за виртуальные функции, с чем их едят... ой... читать учебники я умею.
Да тут дело не в виртуальности, а вот в чем:
C++
1
2
3
4
int foo(int x){
}
char foo(int x){
}
Цитата Сообщение от AnyOne697 Посмотреть сообщение
Вот так - каким образом мне перегрузить виртуальную функцию, чтобы VSC++2010 не ругалась на эти перегрузки.
Измените список параметров
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
18.11.2012, 11:46  [ТС]     Наследование от виртуального класса #4
Цитата Сообщение от Croessmah Посмотреть сообщение
Измените список параметров
Так ведь вся суть именно в том, чтобы подменить класс IDirect3D9 на собственную реализацию. Подгружая dll-кой программа будет работать, используя наш враппер и можно будет внедрить свой добрый (или не очень) код.
Тем более, что возвращающее значение одинаковое...
Разве только добавить бессмысленный аргумент со значением по умолчанию... В общем, попробую. Надеюсь - поможет.

Добавлено через 17 минут
Цитата Сообщение от alex_x_x Посмотреть сообщение
выкладывать куски кода и текст ошибки с указанием строки ныне не модно
Простите, но специально для Вас я пережал в zip проект и кинул в аттач.
Просто бессмысленно кидать один и тот же код. Но если кратко, то:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Direct3D9Wrapper : public IDirect3D9
{
public:
 
    Direct3D9Wrapper( LPDIRECT3D9 pDirect3D );
    ~Direct3D9Wrapper();
 
    HRESULT QueryInterface(REFIID riid, void** ppvObj, int dummy = 0);
    ULONG AddRef(int dummy = 0);
    ULONG Release(int dummy = 0);
//туева хуча подобных методов
    HMONITOR GetAdapterMonitor(UINT Adapter, int dummy = 0);
    HRESULT CreateDevice(UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface, int dummy = 0);
 
    IDirect3D9* Direct3D9;
Если без dummy - кидает ошибку на каждый из методов.
Правда я не знаю, как поведёт себя приложение, когда я запущу его с это dll-кой. Сейчас всё соберу и посмотрю.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2012, 11:49     Наследование от виртуального класса #5
Цитата Сообщение от AnyOne697 Посмотреть сообщение
C++
1
2
ULONG AddRef(int dummy = 0);
ULONG Release(int dummy = 0)
;
почему эти методы с параметрами?
IDirect3D9 наследует IUnknown в котором для этих методов никаких параметров нет
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
18.11.2012, 12:01  [ТС]     Наследование от виртуального класса #6
Ну конечно, что я делаю? Какой dummy? Методы наследуются. И они чистые. Мне теперь объект класса не создать! Эх...
Актуальность только растёт.

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
почему эти методы с параметрами?
IDirect3D9 наследует IUnknown в котором для этих методов никаких параметров нет
Цитата Сообщение от AnyOne697 Посмотреть сообщение
перегружающая виртуальная функция отличается от "IDirect3D9::EnumAdapterModes" только соглашением о вызове
Цитата Сообщение от Croessmah Посмотреть сообщение
Измените список параметров
И что с этим делать?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
18.11.2012, 12:06     Наследование от виртуального класса #7
Цитата Сообщение от AnyOne697 Посмотреть сообщение
И что с этим делать?
изучить основы COM и написать реализацию этих методов
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2012, 20:41     Наследование от виртуального класса
Еще ссылки по теме:

C++ Наследование, конструктор класса
Наследование класса Exception C++
C++ Нужно ли прописывать конструктор и деструктор для чисто виртуального абстрактного класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
AnyOne697
 Аватар для AnyOne697
134 / 106 / 5
Регистрация: 22.05.2010
Сообщений: 532
26.11.2012, 20:41  [ТС]     Наследование от виртуального класса #8
Неделю спал, проснулся, взялся вспоминать... Не очень...

Цитата Сообщение от Jupiter Посмотреть сообщение
изучить основы COM и написать реализацию этих методов
Не совсем понял... Я же вроде реализацию сделал... Однострочную. Но сделал. Это банальная обёртка... Почему она не работает?.. Не понимаю... Часа два сидел и писал скрипт-генератор реализаций. Но не работать. Наверное, я просто плохо знаю Си с плюсами. Возможно, я просто не то наследую. Мне нужно инъектировать dll-ку и получить доступ к поверхностям DirectX. Что вообще твориться с этим миром? Зачем всё так сложно?
Yandex
Объявления
26.11.2012, 20:41     Наследование от виртуального класса
Ответ Создать тему
Опции темы

Текущее время: 15:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru