Il existe un grand nombre de versions de la DLL D3DX, à partir de chaque mise à jour du SDK, chaque version ayant un nom unique ( liste des noms de DLL D3DX ).
Trop souvent, les gens ont des versions manquantes. Ainsi, même s'ils disposent d'une version compatible de DirectX, votre projet basé sur D3D ne fonctionnera pas sur leur machine.
Je veux pouvoir distribuer des jeux (petits projets de loisirs, entrées de jam de jeu, etc.) sous la forme d'un simple fichier zip, sans avoir besoin d'un installateur. Mais un pourcentage important d'utilisateurs se heurtent à des erreurs D3DX .dll manquantes. Et sans programme d'installation, la solution officielle de Microsoft (le programme d'installation / mise à jour Web DirectX) n'est pas vraiment une solution.
Malheureusement, Microsoft ne nous donnera toujours pas la possibilité de créer des liens statiques vers D3DX (ce qui serait une bonne solution propre). Et éviter d'utiliser D3DX n'est pas très pratique, surtout si vous travaillez avec des shaders (et non, je ne passe pas à OpenGL, du moins pour l'instant)
Quelqu'un a-t-il des solutions intelligentes pour éviter cet enfer de DLL?
Réponses:
Malheureusement, il n'y a pas de bonne solution légale pour cela, sauf pour faire un programme d'installation, car vos mains sont liées par les droits de distribution qui vous sont accordés par le SDK DirectX, qui fournit les DLL D3DX. Selon les termes du contrat de licence auquel vous êtes lié en utilisant le SDK (qui se trouve dans
(SDK Install Directory)/Documentation/License Agreements/
vous, vous êtes uniquement autorisé à redistribuer les formes binaires de certains sous-ensembles du SDK, ainsi qu'une partie de l'exemple et du code utilitaire.Depuis le SDK de juin 2010, vous avez autorisé à redistribuer quoi que ce soit dans le répertoire "Redist" et, ce faisant, vous devez inclure certains composants (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab et dxdllreg_x86.cab). Le répertoire Redist inclut les fichiers .cab pour les DLL D3DX, mais pas les DLL elles-mêmes , vous n'avez donc pas de chance.
Il n'est pas très difficile de construire un programme d'installation, heureusement, qui exécute simplement le programme
d'installationWebD3DX approprié ou quoi que ce soit quelque chose que vous redistribuez. Les programmes d'installation simples .msi sont tout aussi faciles à utiliser pour un utilisateur (un double-clic est généralement tout ce qui est nécessaire) et peuvent être configurés pour autoriser l'installation dans des répertoires arbitraires, si vous avez des raisons de "polluer" le répertoire Program Files avec ces petits programmes à jeter. La surcharge de la taille de téléchargement d'un programme d'installation correctement configuré peut également être assez petite, de sorte que cela ne devrait pas poser trop de problème.EDIT: Voici une bonne page sur les choses d'installation DX .
EDIT 2: rayé le bit "web" en réponse à une correction dans les commentaires.
la source
Quatre solutions principales me viennent à l'esprit.
La première consiste à utiliser une ancienne version du SDK DirectX. Je semble me souvenir que les versions du rond-point 2004 ou antérieur étaient liées statiquement (mais si une taille exécutable plus grande vous fait peur, ce ne serait peut-être pas une option), et c'est également le cas que si vous utilisez une version de 2006/2007 ou antérieure, alors la Les DLL D3DX dont vous avez besoin auront beaucoup plus de chances d'être sur la machine. L'inconvénient est que vous manquerez des corrections de bogues, des améliorations de performances et des fonctionnalités améliorées dans les nouveaux SDK (cela exclut également toute version de D3D autre que 9).
La deuxième solution consiste à utiliser LoadLibrary et GetProcAddress sur les fonctions D3DX. Vous choisissez une version prise en charge maximale et minimale (par exemple, de _42 à _34), puis entrez dans une boucle de max à min, construisez le nom de la DLL et essayez de la charger dans la bibliothèque de bibliothèque. Si vous le chargez correctement, vous effectuez ensuite un tas d'appels GetProcAddress et utilisez vos pointeurs de fonction au lieu des fonctions D3DX brutes. Un peu comme les extensions OpenGL, si vous savez de quoi je parle. Celui-ci est potentiellement un peu poilu, et vous devrez peut-être encore faire face au cas où vous ne trouverez aucune DLL dans votre gamme. Mais j'ai utilisé celui-ci dans le passé et cela fonctionne assez bien.
La troisième solution consiste simplement à ne pas utiliser D3DX. Peut être une option dans certains cas, peut-être pas une option dans votre cas.
La quatrième et dernière solution consiste simplement à dire à vos utilisateurs de mettre à niveau leur Direct 3D. Ils devraient vraiment le faire de toute façon, c'est un téléchargement petit et rapide de Microsoft, et c'est un solutionneur de problème instantané. Vos utilisateurs peuvent ne pas aimer avoir à le faire, et vous devrez peut-être répondre à des questions telles que "J'ai déjà le D3D11, pourquoi dois-je mettre à niveau mon D3D9", mais dans l'ensemble, cela peut être plus économique dans l'ensemble à prendre sur le nez.
la source