У меня есть программа, в которую я добавляю эффекты полноэкранного пост-обработки. У меня нет источника для программы (это проприетарно, хотя разработчик отправил мне копию отладочных символов, формат .map). У меня есть код для написанных и работающих эффектов, никаких проблем.Избегайте переполнения стека в библиотеке обертки
Моя проблема теперь связана с двумя.
Я попробовал два метода до сих пор:
использовать объезды, чтобы изменить таблицу импорта оригинальной программы. Это отлично работает и гарантированно стабильно, но пользователь, с которым я разговаривал, не устраивает его, он требует установки (за исключением извлечения архива), и возникает вопрос, исправляется ли программа с помощью Detours в соответствии с условиями лицензионного соглашения. Итак, этот вариант отсутствует.
Другой вариант - традиционная замена DLL. Я обернул OpenGL (opengl32.dll), и мне нужна программа для загрузки моей DLL вместо системной копии (просто отбросьте ее в папку программы с правильным названием, это легко).
Мне тогда нужна моя DLL для загрузки фреймворка Cg и времени выполнения (который зависит от OpenGL) и нескольких других вещей. Когда Cg загружается, он вызывает некоторые из моих функций, которые вызывают функции Cg, и я склонен получать переполнения стека и бесконечные циклы. Мне нужно иметь возможность включать DLL-библиотеки Cg в подкаталог и по-прежнему использовать их функции (не уверены, возможно ли, чтобы таблица импорта DLL-файлов указывала на DLL в подкаталоге), или мне нужно динамически связать их (что я ' d скорее не делать, просто для упрощения процесса сборки), что-то, чтобы заставить их ссылаться на файл системы (а не на мою пользовательскую замену).
Вся цепь: Программа загружает DLL A (с именем opengl32.dll). DLL A загружает Cg.dll и динамически ссылки (GetProcAddress) в sysdir/opengl32.dll. Теперь мне нужно Cg.dll также ссылаться на sysdir/opengl32.dll, не DLL A.
Как это сделать? Редактировать: Как это сделать легко без использования GetProcAddress? Если ничего не работает, я готов вернуться к этому, но я бы предпочел, если это вообще возможно.
Редактировать 2: Я просто наткнулся на функцию SetDllDirectory в документах MSDN (на совершенно несвязанный поиск). На первый взгляд это похоже на то, что мне нужно. Это правильно, или я ошибаюсь? (выкл., чтобы опробовать его сейчас)
Редактировать 3: Я решил эту проблему, выполнив несколько иначе. Вместо того, чтобы отбрасывать OpenGL32.dll, я переименовал свою DLL в DInput.dll. Преимущество не только в том, что нужно экспортировать одну функцию вместо более 120 (для программы, Cg и GLEW), мне не нужно беспокоиться о возвращающихся функциях (я могу ссылаться на OpenGL, как обычно) , Чтобы войти в звонки, мне нужно перехватить, я использую «Объемы». В целом, он работает намного лучше. Этот вопрос, тем не менее, по-прежнему остается интересной проблемой (и, надеюсь, будет полезен для всех, кто пытается сумасшедшие вещи в будущем). Оба ответа хороши, поэтому я еще не уверен, что выбрать ...
Для всех, кто сталкивается с этим вопросом в будущем, лучшие варианты (которые я закончил с помощью некоторого времени позже) - это ** не использовать Detours **. Это глючит, особенно в WoW64, и отсутствует базовые функции, такие как рекурсия. [EasyHook] (http://easyhook.codeplex.com/) намного превосходит функции, стабильность/производительность и общую обработку. – ssube