Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.12.2016, 17:46
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию Как связаться со своей dll загруженной в процесс игры

Всем привет! Есть dll моя самописная, в ней функция снятия скриншота directx и opengl, функцию проверил все работает если использовать ее из моей dll.
А как можно мне получить скриншот из моей самописной exe программы?
Fraps загружает fraps32.dll в игру и потом к ней обращается из fraps.exe как он это делает?
Ответить с цитированием
  #2  
Старый 12.12.2016, 17:55
ApxaHGe1 ApxaHGe1 вне форума
Активный
 
Регистрация: 08.04.2008
Адрес: Нижний новгород
Сообщения: 311
Репутация: 38
По умолчанию

и ты загрузи свою длл в процесс и вызывай функцию из нее
Ответить с цитированием
  #3  
Старый 12.12.2016, 18:00
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Тут дело в другом. Мне в моей программе(exe) нужна возможность снимать скриншоты fullscreen игр. Чтобы я не делал получались только черные квадраты, на просторах инета нашел что если это игра directx или opengl то нужно внедрять свою dll иначе никак, сказали мол фрапс так делает.
Разобрался как сделать и внедрить dll только не могу разобраться как теперь мне в моей программе получить скриншот. Нужно чтоб скриншот делался по запросу exe, фрапс именно так и делает
Ответить с цитированием
  #4  
Старый 12.12.2016, 22:54
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ну, во-первых, можно легко снимать скриншоты обычным принтскрином, если игра запущена в оконном режиме, будь она хоть трижды на DirectX и OpenGL. Так проще, тем более, что многие современные игры это умеют.
Во-вторых, по делу: мы имеем ДЛЛ в другом процессе, т.е. требуется IPC (Interprocess Communication). Тут могут быть разные варианты, большинство из которых строятся на костылях.

Вариант первый, наверно самый простой - создать в игре фейковое пустое невидимое окно и слать сообщения этому окну. В dll сделать обработчик сообщений окна.
Вариант второй, тоже кривой - поднять в dll серверный сокет на localhost и принимать команды.
Вариант третий - использовать пайпы (Pipes).
Вариант четвертый, наркоманский - создать объект для синхронизации каким-нибудь CreateEvent, сбросить его состояние в DLL и сделать WaitForSingleObject. Когда надо сделать скрин из своего приложения менять состояние объекта. В этот момент поток выйдет из ожидания, сделает скриншот и снова сбросит состояние объекта.

Вообще, на MSDN есть список предлагаемых вариантов, но большинство из них трудноприменимы.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
Shaft (13.12.2016)
  #5  
Старый 13.12.2016, 11:07
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Во спасибо. Вариант с серверным сокетом подошел. Отправляю команду и путь куда сохранить и скриншот уже там где надо.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:45.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter