Связаны ли приложения D3D9 с точной версией D3DX DLL?

Если я собрал свое приложение для D3DX June2007_d3dx9_34, а на целевой системе установлена ​​более новая версия Nov2007_d3dx9_36, должно ли это быть проблемой?

Я распространяю библиотеки D3DX с помощью средства "redist-installer" от MS, но заметил один "чистый" ПК (ранее D3DX не устанавливался), я получил ошибку об отсутствии D3DX DLL. Прежде чем попытаться выяснить, не работает ли сам установщик, я подумал, может быть, проблема заключается в том, чтобы предоставить слишком новую версию DLL - будет ли приложение искать DLL с точным именем?

2 ответа

Решение

Библиотеки D3DX не имеют обратной совместимости, и API может меняться в зависимости от версии. Таким образом, целевая система должна иметь ту же версию D3DX, с которой вы строите свое приложение - более новая версия не будет работать.

Если вы используете Dependency Walker в своем приложении, оно должно показать вам, что существует зависимость от DLL с точным номером версии.

Распространяемый в DirectX SDK включает в себя всю историю dll D3DX. При установке последней версии распространяемого пакета DirectX ваша система должна иметь все версии этих библиотек. Приложения могут и разрешают устанавливать только те файлы, которые им нужны, удаляя cab-файлы из структуры каталогов распространяемого пакета, чтобы уменьшить размер распространяемых компонентов, и таким образом вы можете получить 43 библиотеки DLL. но не 37 например.

Если вы удалите зависимость dll D3DX и D3DCOMPILER из своего приложения, вы сможете убедиться, что приложение будет работать, так как dll ядра d3d9 d3d10 и d3d11 не зависят от версии и также связаны с выпусками пакетов обновления для Windows (т.е. D3D11 для Vista поставляется из Vista SP2 или Win7 стоковая установка например).

Другой возможный способ удалить зависимость и позволить запуску приложения сделать dll модулем отложенной загрузки, чтобы он загружался только при необходимости (например, компиляция шейдеров в среде разработки). Пока вы уверены, что шейдеры существуют на компьютерах конечных пользователей должным образом, вам не нужно будет компилировать шейдеры и не произойдет сбой. Вызов LoadLibrary и вызов функций вручную был бы более безопасным вариантом с лучшим сообщением об ошибке по вашему выбору, но это намного больше работы.

Другие вопросы по тегам