Да, я в начале статьи указал, что работа ведётся в Visual Studio 2010. К сожалению, в таких мелочах производители различных компиляторов не договорились между собой о единых стандартах.
Будет очень полезно, если вы приведёте аналогичные по действиям участки кода для GCC :)
Возможно помогут какие-то другие параметры, либо уже нужно будет дополнительно немного поправить код в самом бинарнике. Как правило, там не сложные модификации.
Вопрос не программиста, но игрока: в теории это позволит играть в оконном режиме во всю «классику» — Arcanum, Baldur’s Gate, Fallout, Icewind Dale, Planescape?.. Это же прекрасно, спасибо вам большое!
По поводу Baldur's Gate: есть сборки все-в-одном, вроде Baldur's Gate Trilogy. Обычно туда включают www.gibberlings3.net/widescreen/, который позволяет или играть в окне, или подстроить игру под ваше разрешение экрана.
Если вы пишете proxy-dll, то смысла дополнительно перехватывать проксируемые методы через Detours нет, поскольку вы и так можете писать свою реализацию этих методов. Если же вы хотите дополнительно отлавливать вызовы из других библиотек, то Detours здесь верный помощник.
Но надо отметить, что работать будет только с действительно старыми играми, которые используют ddraw. А более новые работают напрямую с D3D9!Direct3DCreate9, и там подменять придётся не столько функции, сколько целый интерфейс.
Статья хорошая, но для Windows DLL такие чудеса — не новость. А вот кто-нибудь знает о подобном решении для Linux ELF? Причем не в принципе как сделать, это-то понятно, а именно готовое reusable решение — на изобретение всех велосипедов самому не хватит жизни. LD_PRELOAD не предлагать, интересует именно proxy решение.
А чем LD_PRELOAD не решение? Тут же подвох в том, что Windows ищет сначала в директории приложения, а потом уже в системных. В Linux такого нет, а значит и не получится без явного использования LD_PRELOAD.
Что значит не получится? Как может не получиться следующий финт: оригинальную libfoo.so переименованием в libfoo2.so, создаем proxy-so libfoo.so которая форвардит вызовы на libfoo2.so?
Проблема с LD_PRELOAD в том, что он очень fragile: его нужно установить, кто угодно может его сбросить, он имеет ограничения по правам. Мой usecase: злые вендоры не хотят обновлять Android на пользовательских девайсах. Пользователи пытаются делать это сами. Корпорация добра Google подыгрвает вендорам, постоянно меняя API/ABI, в основном, именно ради изменений (ну там тип переименовали, C++ ABI). Основная проблема с интерфейсом EGL, связывающим вендоровский OpenGL и графическую подсистему Android. Пользователи хотят выразить свое отношение к происходящему написанием ABI-адаптера, чтобы OpenGL из предыдущих версий можно было использовать с новыми версиями Android. Причем парадигматически верно, чтобы решение всех этих гугло-вндоровских закавык было простое, как бублик и прозрачное, аки слеза, чтобы даже ребенок мог понять, как плохо стараются делать хорошо гугловендоры со своей стороны.
Заменить оригинальную, понятное дело, можно, но тогда эта подмена будет работать для всех программ её использующих, а не «избранных», как это делается в статье.
Возможно ли зуммировать игру в окне в X раз, в пропорции? Например, в 1.4 раза.
Многие игры, поддерживающие только 640х480 смотрятся на больших экранах слишком мелко.
Создание прокси-dll для запуска DirectDraw игр в окне