Вы можете использовать магию контекстов активации, чтобы попытаться решить вашу проблему.
Многое зависит от погоды, у сторонних компонентов в вашей системе уже есть манифесты - и насколько фальсификация этих манифестов может представлять собой нарушение лицензии.
Чтобы решить проблемы с версиями DLL, в Windows XP появилась технология, называемая контекстами активации. Иногда известный как параллельные сборки, или даже что-то ужасное, как Изоляция приложений
Чтобы суммировать много чтения в маленьком пространстве:
манифесты - это фрагменты данных XML, которые могут описывать сборку или описывать зависимость от сборок. Сборка - это манифест, плюс его dll.
Причина, по которой это существует, заключается в том, что сборка может принять простую dll. «comctl32.dll» и его номер версии (v6), и создайте объект с более уникальным именем, чтобы можно было безопасно установить несколько версий простой библиотеки DLL в одном месте. Сборки предназначены для установки в C:\Windows\WinSxS
.
Когда файл манифеста описывает dll в сборке, он называется манифестом сборки. И обычно имеет другое имя для DLL.
Когда файл манифеста описывает сборки, используемые dll или exe, он называется манифестом приложения и обычно внедряется как ресурс RT_MANIFEST - в EXE с res id 1, в Dlls с res id 2 - или на диске в виде файла с именем «appname.exe.manifest» / «dllname.dll.2.manifest».
Манифесты приложения определяют то, что называется контекстом активации - это в основном пространство имен, в котором Windows будет искать вещи.
Каждый манифест создает контекст активации. Каждый контекст активации имеет отображение простых имен dll в сборках.
Итак, если вы создаете сборку с вашим файлом opengl32.dll и создаете контекст активации для файла app.exe, ссылающегося (локальный файл opengl32.dll), то, возможно, все остальные DLL может (и будет) продолжать использовать файл систем opengl32.dll, несмотря на тот факт, что имена очень похожи coff .
Проблема в том, что res-id манифеста приложения - 1 - означает, что он используется для создания контекста активации процесса по умолчанию - поэтому ВСЕ dll, не имеющие собственных явных манифестов (Cg?), Будут искать обработайте пространство по умолчанию и найдите, что opengl32.dll
Таким образом, вы должны создать манифесты для каждой dll, которая еще не встраивает их, убедившись, что просто НЕ ссылаетесь на вашу сборку opengl32.dll, что должно позволить затем вернуться к порядку поиска по умолчанию и найдите его в обычном каталоге system32.
это означает, что ваш файл opengl32.dll не может быть в папке exe, так как в этой папке выполняется поиск dll-файлов перед system32 (факт, на который вы полагаетесь для перехвата).
Нас спасает довольно простой порядок поиска, который система использует при поиске сборок. сначала он ищет в WinSxS. Ваш Opengl32.dll не будет там, установка там является серьезной проблемой. Затем он ищет в папке exe-файла подпапку с именем сборки, ТО затем он ищет в папке exe-файла непосредственно манифест сборки.
Это означает, что вы можете создать сборку, которая называется что-то вроде: "OpenGLHook"
И ваша структура папок будет выглядеть так:
\appfolder\
app.exe
app.exe.manifest - contains a dependentAssembly node to OpenGLHook
OpenGLHook\OpenGLHook.manifest - contains a file name=opengl32.dll
OpenGLHook\opengl32.dll - your hook dll
yourimpl.dll - your implementation dll that linkgs to cg.dll
cg.dll - cg libraries
cg.dll.2.manifest - a stub manifest you put together to ensure cg
doesnt use the app default activation ctx.
Хм, удачи?