Hay una gran cantidad de versiones de D3DX dll, de cada actualización de SDK, cada versión tiene un nombre único ( lista de nombres de d3DX dll ).
Con demasiada frecuencia, a las personas les faltan versiones. Entonces, a pesar de que tienen una versión compatible de DirectX, su proyecto basado en D3D no se ejecutará en su máquina.
Quiero poder distribuir juegos (pequeños proyectos de tiempo libre, entradas de juegos, etc.) como un simple archivo zip, sin la necesidad de un instalador. Pero un porcentaje significativo de usuarios se topa con errores de D3DX .dll que faltan. Y sin un instalador, la solución oficial de Microsoft (el instalador / actualizador web DirectX) no es realmente una solución.
Desafortunadamente, Microsoft aún no nos dará la opción de vinculación estática a D3DX (lo que sería una buena solución limpia). Y evitar usar D3DX no es muy práctico, especialmente si está trabajando con sombreadores (y no, no voy a cambiar a OpenGL, al menos por ahora)
¿Alguien tiene soluciones inteligentes para evitar este infierno de DLL?
Respuestas:
Desafortunadamente, no hay una buena solución legal para esto, excepto hacer un instalador, porque sus manos están atadas por los derechos de distribución que le otorga el SDK de DirectX, que proporciona las DLL de D3DX. Según los términos del acuerdo de licencia al que está obligado a utilizar el SDK (que se encuentra en
(SDK Install Directory)/Documentation/License Agreements/
usted, solo se le permite redistribuir las formas binarias de ciertos subconjuntos del SDK, junto con algunos de los códigos de muestra y utilidad.A partir del SDK de junio de 2010, usted permitió redistribuir cualquier cosa en el directorio "Redist" y al hacerlo debe incluir ciertos componentes (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab y dxdllreg_x86.cab). El directorio Redist incluye los archivos .cab para las DLL D3DX, pero no las DLL en sí, por lo que no tiene suerte.
Afortunadamente, no es terriblemente difícil construir un instalador que solo ejecute el instalador
webD3DX apropiado o no, eso es algo que redistribuye. Los instaladores .msi simples son igual de fáciles de usar para un usuario (generalmente, hacer doble clic es todo lo que se necesita) y se pueden configurar para permitir la instalación en directorios arbitrarios, si le preocupa por alguna razón "contaminar" el directorio de Archivos de programa con estos pequeños programas descartables. La sobrecarga en el tamaño de descarga de un instalador configurado adecuadamente también puede ser bastante pequeña, por lo que no debería ser un gran problema.EDITAR: Aquí hay una buena página sobre cosas de instalación de DX .
EDIT 2: eliminó el bit "web" en respuesta a una corrección en los comentarios.
fuente
Se me ocurren cuatro soluciones principales.
El primero es usar una versión anterior del DirectX SDK. Me parece recordar que las versiones de la rotonda 2004 o anteriores estaban vinculadas estáticamente (pero si un tamaño ejecutable más grande te asusta, eso podría no ser una opción), y también es el caso de que si utilizas una versión de 2006/2007 o anterior, entonces Las DLL de D3DX que necesita tendrán muchas más posibilidades de estar en la máquina. La desventaja de esto es que se perderán las correcciones de errores, las mejoras de rendimiento y la funcionalidad mejorada en los SDK más nuevos (también descarta cualquier versión de D3D que no sea la 9).
La segunda solución es usar LoadLibrary y GetProcAddress en las funciones D3DX. Elige una versión compatible máxima y mínima (por ejemplo, de _42 a _34), luego entra en un ciclo de máximo a mínimo, construye el nombre de la DLL e intenta cargarlo en la biblioteca. Si lo carga bien, entonces hace un montón de llamadas GetProcAddress y usa sus punteros de función en lugar de las funciones D3DX sin procesar. Algo así como las extensiones de OpenGL, si sabes de lo que estoy hablando. Este es potencialmente un poco complicado, y es posible que aún tenga que lidiar con el caso en el que no puede encontrar ninguna DLL en su rango. Pero he usado este en el pasado y funciona bastante bien.
La tercera solución es simplemente no usar D3DX. Puede ser una opción en algunos casos, podría no ser una opción en su caso.
La cuarta y última solución es decirles a sus usuarios que actualicen su Direct 3D. Realmente deberían estar haciendo esto de todos modos, es una descarga pequeña y rápida de Microsoft, y es un solucionador de problemas instantáneo. Es posible que a sus usuarios no les guste tener que hacerlo, y es posible que tenga que lidiar con preguntas como "Ya tengo D3D11, ¿por qué necesito actualizar mi D3D9", pero a fin de cuentas puede resultar más económico en general? en la nariz
fuente