Здравствуйте, я хочу в игре включить режим wireframe. Я сделал .dll-ку: Code: library Project2; uses SysUtils, Classes,opengl; {$R *.res} begin glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); end. И загружаю ее в процесс с помощью функции LoadLibrary_Ex которая описана здесь Но ничего не работает, что я не так делаю?
а зачем через dll? Я с OpenGL не знаком, только с DirectX, указывай в рендере непосредственно : Code: glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
ну тут надо хук делать на функцию glPolygonMode методом перехвата таблицы импорта (IAT), либо сплайсингом, и в хуке непосредствеено указывать в параметрах заданные константы opengl ( GL_FRONT_AND_BACK, GL_LINE ), только так
Ииии так, я снова здесь Использую функции отсюда Мой код dll-ки: Code: library Project2; uses SysUtils,opengl,dialogs,windows, Classes, ApiHookTools in 'D:\Program Files\FireFox\apihook2\APIHOOK\apihooktools.pas'; {$R *.res} procedure reDraw; begin glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); end; var data:pfunctionrestoredata; gg:bool; begin gg:=setprocedurehook(getmodulehandle('Gdi32.dll'),'SwapBuffers',@reDraw,data); end. При инжекте вылазит это Прошу мне помочь
Ну потому что dll неправильно работает. Чтобы все правильно работало с помощью этого ApiHookTools, нужно: 1) Чтобы dll при загрузке устанавливала хук. 2) Дальше новая процедура (наша, подмена тот, которую мы перехватываем) выполняет какие то действия. В данном случае это: Code: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); Потом она снимает хук с процедуры, и вызывает истинную (то есть SwapBuffers с теми параметрами, которые ей передала сама программа) и снова устанавливает хук (такая реализация, как в данном юните - ApiHookTools, не подходит для многопоточных приложений).
Chrome~ правильно сказал, но именно сама ошибка возникает из-за того что у твоей функции нет параметров(а SwapBuffers принемает 1 параметр через стек dc : HDC вроде так.) и еще не указанно что это стандартный вызов(влепи stdcall Бред, в OpenGL приложении может быть только один главный экран(никогда не видел что бы было несколько контекстов воспроизведения) и SwapBuffers вызывается только в одном потоке, а если и в нескольких, то не одновременно(ну изврат какой то получается).
Вот держи http://zalil.ru/29670188 Там написал инжектор и собственно саму DLL, тестировал на Quake 2, выгляжит достаточно наркоманско) На других играх не тестил, но думаю по исходникам будет смысл понятен что да как поменять. Кстати хук надо было тсавить не на SwapBuffers, а на glBegin, меня ток потом пробило. Что бы запустить - кидаешь Injector.exe и wh_inject.dll в папку с игрой, вводишь имя EXE игры в инжектор и запускаешь.
Если действительно перехватываемая функция вызывается только из одного потока, то да, проблем не должно быть. Если из нескольких, - то могут возникнуть небольшие затруднения, если использовать этот способ.
В кс все работает, но правда как ты и сказал, выглядит "наркоманско", есть идеи как исправить? Пробовал использовать glDisable(DEPTH_TEST) вместо вайерфрема, не помогло, стены все-равно рисуются
Попробуй как то так (на основе кода Jingo Bo): Code: procedure hook_glBegin(mode: GLenum); stdcall; begin { Хехе :) } if (mode = GL_TRIANGLE_STRIP) or (mode = GL_TRIANGLE_FAN) then glDisable(GL_DEPTH_TEST) else glEnable(GL_DEPTH_TEST); UnHookCodeHook(@frd); glBegin(mode); SetProcedureHook(GetModuleHandle(PAnsiChar(opengl32)), 'glBegin', @hook_glBegin, @frd); end; Результат, - все объекты должны выводиться на передний план. Я раньше так пробовал, - не самый лучший вариант, но и не самый худший.
Хехе))) Вот тебе зачем нужен такой режим... Нас счет наркоманского вида...можно попробовать отловить когда начинется рисоваться сцена и там вызвать glClear, все старое сотрет.
Тааак. Немного не по теме, но напишу здесь: Сделал хук на Direct3DCreate9. Инджектю, сообщение "LOL WORKING" появляется, но после этого игру крашает, в чем может быть причина? Исходик http://pastebin.com/74bhZ1Ar