Istnieje wiele wersji biblioteki DLL D3DX, z każdej aktualizacji SDK, każda wersja ma unikalną nazwę ( lista nazw bibliotek D3DX ).
Zbyt często ludzie nie mają wersji. Więc nawet jeśli mają kompatybilną wersję DirectX, twój projekt oparty na D3D nie będzie działał na ich komputerze.
Chcę być w stanie dystrybuować gry (małe projekty w wolnym czasie, wpisy dotyczące jam gier itp.) Jako zwykły plik zip, bez potrzeby instalatora. Ale znaczny procent użytkowników napotyka brakujące błędy D3DX .dll. Bez instalatora oficjalne rozwiązanie Microsoftu (internetowy instalator / narzędzie do aktualizacji DirectX) nie jest zbyt dobrym rozwiązaniem.
Niestety, Microsoft nadal nie daje nam możliwości statycznego linkowania do D3DX (co byłoby ładnym czystym rozwiązaniem). Unikanie używania D3DX nie jest zbyt praktyczne, zwłaszcza jeśli pracujesz z shaderem (i nie, przynajmniej nie przełączam się na OpenGL)
Czy ktoś ma sprytne rozwiązania pozwalające uniknąć tego piekła DLL?
Odpowiedzi:
Niestety, nie ma na to dobrego, legalnego rozwiązania, z wyjątkiem stworzenia instalatora, ponieważ twoje ręce są związane prawami do dystrybucji przyznanymi ci przez DirectX SDK, który zapewnia biblioteki DLL D3DX. Zgodnie z warunkami umowy licencyjnej jesteś zobowiązany do korzystania z zestawu SDK (który znajduje się w
(SDK Install Directory)/Documentation/License Agreements/
tobie, możesz jedynie redystrybuować formy binarne niektórych podzbiorów SDK, wraz z niektórymi przykładowymi kodami i kodami narzędziowymi.Począwszy od zestawu SDK z czerwca 2010 r. Można zezwolić na redystrybucję czegokolwiek w katalogu „Redist”, a do tego należy dołączyć pewne składniki (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab i dxdllreg_x86.cab). Katalog Redist zawiera pliki cab dla bibliotek DLL D3DX, ale nie same biblioteki DLL, więc masz pecha.
To nie jest strasznie trudne do zbudowania instalatora, na szczęście, że właśnie prowadzi odpowiednią D3DX
internetowejinstalatora lub cokolwiek to jest coś, czego redystrybucji. Proste instalatory .msi są tak samo łatwe w użyciu dla użytkownika (podwójne kliknięcie jest ogólnie wszystkim, czego potrzeba) i można je skonfigurować tak, aby zezwalało na instalację w dowolnych katalogach, jeśli z jakiegoś powodu martwisz się o „zanieczyszczenie” katalogu Program Files za pomocą te małe programy wyrzucania. Narzut w rozmiarze pobierania odpowiednio skonfigurowanego instalatora może być również dość mały, więc nie powinno to stanowić większego problemu.EDYCJA: Oto dobra strona na temat instalacji DX .
EDYCJA 2: W odpowiedzi na korektę w komentarzach przekreślono bit „sieci”.
źródło
Przychodzą mi na myśl cztery główne rozwiązania.
Pierwszym z nich jest użycie starszej wersji zestawu DirectX SDK. Wydaje mi się, że pamiętam, że wersje z ronda 2004 lub wcześniejszego były połączone statycznie (ale jeśli przeraża cię większy rozmiar pliku wykonywalnego, może to nie być opcja), a także w przypadku wersji z roku 2006/2007 lub wcześniejszego Potrzebne biblioteki DLL D3DX będą miały znacznie większą szansę na bycie na komputerze. Minusem tego jest to, że będziesz tracić poprawki błędów, ulepszenia wydajności i ulepszoną funkcjonalność w nowszych zestawach SDK (wyklucza to również dowolną wersję D3D inną niż 9).
Drugim rozwiązaniem jest użycie LoadLibrary i GetProcAddress w funkcjach D3DX. Wybierasz maksymalną i minimalną obsługiwaną wersję (powiedzmy od _42 do _34), następnie przechodzisz do pętli od max do min, konstruujesz nazwę DLL i próbujesz ją załadować. Jeśli załadujesz go OK, wykonasz kilka wywołań GetProcAddress i użyjesz wskaźników funkcji zamiast surowych funkcji D3DX. Coś w rodzaju rozszerzeń OpenGL, jeśli wiesz o czym mówię. Ten jest potencjalnie trochę włochaty i być może będziesz musiał poradzić sobie ze sprawą, w której nie możesz znaleźć żadnej biblioteki DLL w swoim zasięgu. Ale korzystałem z tego w przeszłości i działa wystarczająco dobrze.
Trzecie rozwiązanie to po prostu nie używać D3DX. W niektórych przypadkach może być opcją, może nie być opcją w twoim przypadku.
Czwarte i ostatnie rozwiązanie polega po prostu na poinformowaniu użytkowników o aktualizacji Direct 3D. Tak naprawdę powinni to robić, to małe i szybkie pobieranie z Microsoft, i to natychmiastowe rozwiązanie problemu. Twoi użytkownicy mogą nie chcieć tego robić i być może będziesz musiał poradzić sobie z pytaniami typu „Mam już D3D11, dlaczego muszę aktualizować swój D3D9”, ale w sumie może okazać się bardziej ekonomiczny to na nosie.
źródło