Сейчас на форуме: bartolomeo, asfa, _MBK_ (+7 невидимых) |
![]() |
eXeL@B —› Вопросы новичков —› Рисуем в чужом Direct3D приложении |
Посл.ответ | Сообщение |
|
Создано: 15 ноября 2011 22:50 · Личное сообщение · #1 Всем привет! Есть игра, которая использует DirectDraw7. Понадобилось выводить в углу окна этой игры некоторую информацию. Например FPS. Я перехватил вызов функции DirectDrawCreateEx и дальше незнаю в какую сторону двигаться. Прикрепляю лог сделанный с помощью DirectX Logger. Помогите пожалуйста информацией, примерами. ![]() ![]() |
|
Создано: 16 ноября 2011 03:56 · Поправил: MasterSoft · Личное сообщение · #2 битком инфы, по твоему запросу в гугле первая ссылка. или гугл сломался? если ищешь готовое, на sf поищи такси - фрапсоаналог) а вообще я бы на твоём месте смотрел в сторону оверлеев.сорцы тож найти можно если поискать. Хотя всё эт не совсем по тематике форума. ![]() |
|
Создано: 16 ноября 2011 04:44 · Личное сообщение · #3 |
|
Создано: 16 ноября 2011 09:14 · Поправил: MasterSoft · Личное сообщение · #4 |
|
Создано: 18 ноября 2011 15:38 · Личное сообщение · #5 Code:
![]() |
|
Создано: 18 ноября 2011 21:18 · Поправил: Dynamic · Личное сообщение · #6 punxer cпасибо. Очень помогли Ваши куски кода. С помощью функции HookCOM успешно перехватил IDirectDraw7_SetCooperativeLevel и IDirectDraw7_CreateSurface. По той же схеме собрался перехватить IDirectDrawSurface7_GetAttachedSurface. Функция выглядит так: Code:
Но при запуске приложение крашится. Посмотрел я в отладчике на эту функцию: Code:
Перед выполнением RETN 0C верхушка стека выглядит так: Code:
При выполнении RETN 0C попадаем на 0018FB9C и падаем. Стоит изменить функцию к виду: Code:
и приложение нормально работает через MyIDirectDrawSurface7_GetAttachedSurface функцию. Code:
Подскажите пожалуйста в чем может быть проблема. Компилирую с помощью VS2010. ![]() |
|
Создано: 24 ноября 2011 17:10 · Личное сообщение · #7 Из моего скромного опыта по перехвату API усвоил, что в процедурах обработки перехваченных функций не стоит использовать локальные переменные. Так же по возможности стоит использовать ассемблерные вставки аля CMP:JXX вместо конструкций IF:ENDIF ![]() |
|
Создано: 24 ноября 2011 21:53 · Личное сообщение · #8 Dynamic Проблема в прототипе: Code:
А надо: Code:
В вашем объявлении на один параметр меньше, поэтому stdcall соглашение не очищает полностью стек, и вместо адреса возврата на вершине стека этот параметр, что приводит к иксепшену. foxmail пишет: Из моего скромного опыта по перехвату API усвоил, что в процедурах обработки перехваченных функций не стоит использовать локальные переменные. Это неправда. Их юзать как раз можно, никаких проблем нет. Да и быть не может, только если вы не создаёте какой-то огромный локальный буфер, который настолько здоровенный, что вызывает переполнение стэка. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 24 ноября 2011 22:29 · Поправил: Dynamic · Личное сообщение · #9 ARCHANGEL, если бы ![]() Вы написали прототип функции DirectDraw7_CreateSurface, а не IDirectDrawSurface7_GetAttachedSurface. Вот что я нашел в ddraw.h: Code:
Code:
msdn: Так что проблема не в прототипе. ![]() |
|
Создано: 24 ноября 2011 22:31 · Личное сообщение · #10 |
|
Создано: 26 ноября 2011 19:15 · Личное сообщение · #11 Приветствую Логгер Директикса из первого поста поддерживает плагины, так что вручную перехваты ставить не надо. надо написать обработчик и указать ему, возможно этот путь будет более легким для топикстартера http://blackninja2000.narod.ru/rus/directx_logger.html ![]() |
|
Создано: 29 ноября 2011 00:32 · Поправил: punxer · Личное сообщение · #12 Dynamic Код перехвата покажите весь Откуда устанавливается перехват pSurf->GetAttachedSurface? Куда указывает lplpThis Code:
Из моего скромного опыта по перехвату API усвоил, что в процедурах обработки перехваченных функций не стоит использовать локальные переменные. Так же по возможности стоит использовать ассемблерные вставки аля CMP:JXX вместо конструкций IF:ENDIF Это отнють не так. И как правило в таких перехватах на с++ в ассемблере нет особой нужды вообще ![]() |
![]() |
eXeL@B —› Вопросы новичков —› Рисуем в чужом Direct3D приложении |