Há um grande número de versões da DLL do D3DX, de cada atualização do SDK, cada versão com um nome exclusivo ( lista de nomes de DLL do D3DX ).
Com muita freqüência, as pessoas têm versões ausentes. Portanto, mesmo que eles tenham uma versão compatível do DirectX, seu projeto baseado em D3D não será executado na máquina.
Quero poder distribuir jogos (pequenos projetos de tempo livre, entradas de congestionamento de jogos, etc.) como um arquivo zip simples, sem a necessidade de um instalador. Mas uma porcentagem significativa de usuários encontra erros .dll ausentes do D3DX. E sem um instalador, a solução oficial da Microsoft (o instalador / atualizador de web DirectX) não é realmente uma solução.
Infelizmente, a Microsoft ainda não nos oferece a opção de vincular estática ao D3DX (o que seria uma boa solução limpa). E evitar o uso do D3DX não é muito prático, especialmente se você estiver trabalhando com shaders (e não, não vou mudar para o OpenGL, pelo menos por enquanto)
Alguém tem soluções inteligentes para evitar esse inferno DLL?
Respostas:
Infelizmente, não há uma solução legal e legal para isso, exceto para fazer um instalador, porque suas mãos estão atadas aos direitos de distribuição concedidos a você pelo DirectX SDK, que fornece as DLLs do D3DX. Sob os termos do contrato de licença a que você está sujeito, usando o SDK (que está localizado em
(SDK Install Directory)/Documentation/License Agreements/
você, é permitido redistribuir apenas as formas binárias de certos subconjuntos do SDK, juntamente com alguns dos códigos de exemplo e utilitário.A partir do SDK de junho de 2010, você permitia redistribuir qualquer coisa no diretório "Redist" e, ao fazer isso, deve incluir certos componentes (DSetup32.dll, DSetup.dll, DXSetup.exe, DXupdate.cab e dxdllreg_x86.cab). O diretório Redist inclui os arquivos .cab para as DLLs do D3DX, mas não as próprias DLLs, para que você não tenha sorte.
Não é terrivelmente difícil construir um instalador, felizmente, que apenas executa o D3DX apropriado
webinstalador ou outros enfeites que é algo que você redistribuir. Os instaladores .msi simples são igualmente fáceis de usar (basta clicar duas vezes em geral) e podem ser configurados para permitir a instalação em diretórios arbitrários, se você estiver preocupado, por algum motivo, em "poluir" o diretório Arquivos de Programas com esses pequenos programas descartáveis. A sobrecarga no tamanho do download de um instalador configurado adequadamente também pode ser bem pequena, portanto, isso não deve ser um problema.EDIT: Aqui está uma boa página sobre o material de instalação do DX .
EDIT 2: Riscado o bit "web" em resposta a uma correção nos comentários.
fonte
Quatro soluções principais vêm à mente.
O primeiro é usar uma versão mais antiga do DirectX SDK. Parece que me lembro que as versões da rotatória 2004 ou anterior estavam vinculadas estaticamente (mas se um tamanho executável maior o assusta, isso pode não ser uma opção), e também é o caso que se você usar uma versão de 2006/2007 ou anterior, o As DLLs D3DX necessárias precisam de uma chance muito maior de estar na máquina. A desvantagem disso é que você perderá correções de bugs, aprimoramentos de desempenho e funcionalidade aprimorada nos SDKs mais recentes (ele também descarta qualquer versão do D3D que não seja 9).
A segunda solução é usar o LoadLibrary e o GetProcAddress nas funções do D3DX. Você escolhe uma versão máxima e mínima suportada (por exemplo, de _42 a _34), depois faz um loop de max para min, constrói o nome da DLL e tenta carregá-lo. Se você carregar OK, faça várias chamadas GetProcAddress e use os ponteiros de função em vez das funções brutas do D3DX. Como extensões OpenGL, se você sabe do que estou falando. Esse é potencialmente um pouco cabeludo, e talvez você ainda precise lidar com o caso em que não consegue encontrar nenhuma DLL no seu intervalo. Mas eu usei este no passado e funciona bem o suficiente.
Terceira solução é simplesmente não usar o D3DX. Pode ser uma opção em alguns casos, pode não ser uma opção no seu caso.
A quarta e última solução é apenas dizer aos usuários para atualizarem o Direct 3D. Eles realmente deveriam fazer isso de qualquer maneira, é um download pequeno e rápido da Microsoft e um solucionador de problemas instantâneo. Seus usuários podem não gostar disso, e você pode ter que lidar com perguntas como "Eu já tenho o D3D11, por que preciso atualizar o meu D3D9"? no nariz.
fonte