2011-05-12 1 views
-1

J'ai vraiment deux questions. Le premier est plus une description des événements: le logiciel utilise DirectX 9 et compile les shaders au démarrage à partir des ressources. Les shaders se compilent à la fois avec les versions de débogage et de version lorsque vous exécutez le logiciel à partir de l'IDE, mais lorsque vous double-cliquez dessus pour l'exécuter de façon autonome, vous commencez à recevoir beaucoup d'erreurs bizarres de D3DXCompileShader.D3DXCompileShader erreurs étranges lors de l'exécution en dehors de Visual Studio

Je l'ai mis à la possibilité que Visual Studio a converti les fichiers de texte Shader en Unicode et que cela lance D3DXCompileShader en quelque sorte. Pourquoi compiler et s'exécuter correctement quand je suis dans l'EDI, mais pas en dehors de cela est un mystère (note, il échoue toujours si vous le lancez en dehors de VS, puis attachez le débogueur au processus). Quelqu'un a un avis là dessus?

Ma deuxième question concerne les tentatives de résoudre ce qui précède. Au lieu d'avoir mon propre type de données de ressource appelé SHADER, j'ai importé un shader comme RCDATA, donc au lieu de charger moi-même le shader texte de la ressource, je suis maintenant capable d'utiliser D3DXCompileShaderFromResource. Je reçois un mauvais HRESULT de mon appel à ceci cependant, mais la collection d'erreurs reste vide. Il n'y a pas du tout de sortie de débogage. Le code ressemble à ceci:

HRESULT result; 

result = D3DXCompileShaderFromResource(0, 
             MAKEINTRESOURCE(IDR_SHADERPHONG), 
             NULL, 
             NULL, 
             "VERTEXMAIN", 
             D3DXGetVertexShaderProfile(Window()->GetDevice()), 
             D3DXSHADER_OPTIMIZATION_LEVEL3, 
             &MyVertexShaderBuffer, 
             &errors, 
             &MyVertexShaderConstants); 

Le HRESULT est -2005529767, qui semble avoir échoué. Je ne peux trouver aucune référence sur les interwebs à ce que cela peut signifier par rapport à D3DXCompileShaderFromResource! J'espère que mes amis intelligents à stackoverflow peuvent offrir de l'aide ici: p.1. Merci.


Répondre

0

OK, le problème a été trouvé (par un collègue). Lors du chargement de ma ressource, je saisissais un bloc de mémoire et le convertissais de manière incorrecte en std :: string. C'est-à-dire que std :: string passera par la ressource recherchant un terminateur null, mais les données de ressource n'en auront pas nécessairement une (c'est juste un fichier texte). Il finira par en trouver un, cependant, probablement dans une partie de la mémoire que le logiciel n'est pas supposé utiliser!

Ainsi, pour convertir un char buffer d'une ressource dans un std :: string, ce qui suit doit être utilisé:

return std::string(reinterpret_cast<char const*>(pD), bytes); 

pas:

return std::string(pD); 

, à moins bien sûr que vous connaissez à coup sûr que pD pointe vers une chaîne à zéro terminal.

Questions connexes