Es gibt eine große Anzahl von Versionen der D3DX-DLL, von jedem SDK-Update, wobei jede Version einen eindeutigen Namen hat ( Liste der D3DX-DLL-Namen ).
Nur allzu oft fehlen Versionen. Obwohl sie eine kompatible Version von DirectX haben, kann Ihr D3D-basiertes Projekt nicht auf ihrem Computer ausgeführt werden.
Ich möchte Spiele (kleine Freizeitprojekte, Spiele-Jam-Einträge usw.) als einfache Zip-Datei verteilen können, ohne dass ein Installer erforderlich ist. Bei einem erheblichen Prozentsatz der Benutzer fehlen jedoch die DLL-Fehler für D3DX. Und ohne einen Installer ist die offizielle Lösung von Microsoft (der DirectX-Web-Installer / Updater) keine wirkliche Lösung.
Leider gibt uns Microsoft immer noch nicht die Möglichkeit, statisch auf D3DX zu verlinken (was eine schöne, saubere Lösung wäre). Das Vermeiden von D3DX ist nicht sehr praktisch, besonders wenn Sie mit Shadern arbeiten (und nein, ich wechsle zumindest vorerst nicht zu OpenGL).
Hat jemand clevere Lösungen, um diese DLL-Hölle zu vermeiden?
Antworten:
Leider gibt es keine gute legale Lösung dafür, außer ein Installationsprogramm zu erstellen, da Ihre Hände von den Distributionsrechten gebunden sind, die Ihnen vom DirectX SDK gewährt werden, das die D3DX-DLLs bereitstellt. Gemäß den Bedingungen der Lizenzvereinbarung sind Sie an die Verwendung des SDK gebunden (das sich in
(SDK Install Directory)/Documentation/License Agreements/
Ihnen befindet, darf nur die binären Formen bestimmter Teilmengen des SDK zusammen mit einem Teil des Beispiel- und Dienstprogrammcodes weitergeben.Seit dem SDK vom Juni 2010 dürfen Sie alles im Verzeichnis "Redist" neu verteilen und müssen dabei bestimmte Komponenten (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab und dxdllreg_x86.cab) einbeziehen. Das Redist-Verzeichnis enthält die CAB-Dateien für die D3DX-DLLs, jedoch nicht die DLLs selbst, sodass Sie Pech haben.
Es ist zum Glück nicht allzu schwer, ein Installationsprogramm zu erstellen, das nur das entsprechende D3DX
-Webinstallationsprogramm ausführt, oder etwas, das Sie weitergeben. Einfache MSI-Installationsprogramme sind für einen Benutzer genauso einfach zu verwenden (Doppelklicken ist im Allgemeinen alles, was erforderlich ist) und können so konfiguriert werden, dass sie die Installation in beliebigen Verzeichnissen ermöglichen, wenn Sie aus irgendeinem Grund Bedenken haben, das Programmdateiverzeichnis mit zu "verschmutzen" diese kleinen Wegwerfprogramme. Der Overhead bei der Download-Größe eines entsprechend konfigurierten Installationsprogramms kann ebenfalls recht gering sein, sodass dies kein allzu großes Problem darstellen sollte.BEARBEITEN: Hier ist eine gute Seite über DX-Installationsmaterial .
EDIT 2: Das "Web" -Bit wurde als Reaktion auf eine Korrektur in den Kommentaren durchgestrichen.
quelle
Es fallen mir vier Hauptlösungen ein.
Zunächst muss eine ältere Version des DirectX-SDK verwendet werden. Ich scheine mich zu erinnern, dass Versionen von Roundabout 2004 oder früher statisch verknüpft waren (aber wenn eine größere ausführbare Datei Sie erschreckt, ist dies möglicherweise keine Option), und es ist auch der Fall, dass Sie eine Version von 2006/2007 oder früher als die verwenden Benötigte D3DX-DLLs haben eine viel höhere Chance, auf dem Computer zu sein. Dies hat den Nachteil, dass Sie Bugfixes, Leistungsverbesserungen und verbesserte Funktionen in den neueren SDKs verpassen werden (dies schließt auch jede andere Version von D3D als 9 aus).
Die zweite Lösung besteht darin, LoadLibrary und GetProcAddress für die D3DX-Funktionen zu verwenden. Sie wählen eine maximal und minimal unterstützte Version aus (z. B. von _42 bis _34), gehen dann in eine Schleife von max nach min, konstruieren den DLL-Namen und versuchen, ihn mit LoadLibrary zu laden. Wenn Sie es in Ordnung laden, führen Sie eine Reihe von GetProcAddress-Aufrufen durch und verwenden Ihre Funktionszeiger anstelle der unformatierten D3DX-Funktionen. Ein bisschen wie OpenGL-Erweiterungen, wenn Sie wissen, wovon ich spreche. Dies ist möglicherweise ein wenig haarig, und Sie müssen sich möglicherweise noch mit dem Fall befassen, in dem Sie keine DLL in Ihrem Bereich finden können. Aber ich habe dieses in der Vergangenheit benutzt und es funktioniert gut genug.
Die dritte Lösung ist, D3DX einfach nicht zu verwenden. Könnte in einigen Fällen eine Option sein, in Ihrem Fall möglicherweise keine Option.
Die vierte und letzte Lösung besteht darin, Ihre Benutzer anzuweisen, ihr Direct 3D-System zu aktualisieren. Sie sollten das auf jeden Fall tun, es ist ein kleiner und schneller Download von Microsoft und es ist ein sofortiger Problemlöser. Ihre Benutzer möchten dies möglicherweise nicht tun, und Sie müssen sich möglicherweise mit Fragen wie "Ich habe bereits D3D11, warum muss ich mein D3D9 aktualisieren" befassen, aber unter dem Strich kann es insgesamt wirtschaftlicher sein es auf der Nase.
quelle