Compilation D3DXCompileShader在Visual Studio之外运行时出现奇怪错误

Compilation D3DXCompileShader在Visual Studio之外运行时出现奇怪错误,compilation,direct3d,shader,Compilation,Direct3d,Shader,我真的有两个问题 第一个更像是对事件的描述:软件使用DirectX 9并在启动时从资源中编译着色器。当您在IDE中运行软件时,着色器可以在调试和发布版本中正常编译,但是当您双击它以独立运行时,D3DXCompileShader会出现许多奇怪的错误 我把这归因于VisualStudio可能已经将着色器文本文件转换为Unicode,并且不知何故这会抛出D3DXCompileShader。当我在IDE内而不是在IDE外时,为什么它们编译并运行正常是个谜(请注意,如果在VS外启动它,然后将调试器附加到进

我真的有两个问题

第一个更像是对事件的描述:软件使用DirectX 9并在启动时从资源中编译着色器。当您在IDE中运行软件时,着色器可以在调试和发布版本中正常编译,但是当您双击它以独立运行时,D3DXCompileShader会出现许多奇怪的错误

我把这归因于VisualStudio可能已经将着色器文本文件转换为Unicode,并且不知何故这会抛出D3DXCompileShader。当我在IDE内而不是在IDE外时,为什么它们编译并运行正常是个谜(请注意,如果在VS外启动它,然后将调试器附加到进程,则仍然会失败)。有人对此有什么想法吗

我的第二个问题与试图解决上述问题有关。我没有使用自己的名为SHADER的资源数据类型,而是将着色器作为RCDATA导入,因此我现在可以使用D3DXCompileShaderFromResource,而不是手动从资源加载着色器文本。但是,我对此的调用得到了一个错误的HRESULT,但“errors”集合仍然为空。它根本没有调试输出。代码如下所示:

HRESULT result;

result = D3DXCompileShaderFromResource( 0, 
                                        MAKEINTRESOURCE(IDR_SHADERPHONG),
                                        NULL, 
                                        NULL, 
                                        "VERTEXMAIN",
                                        D3DXGetVertexShaderProfile(Window()->GetDevice()),
                                        D3DXSHADER_OPTIMIZATION_LEVEL3,
                                        &MyVertexShaderBuffer,
                                        &errors,
                                        &MyVertexShaderConstants);
HRESULT是-2005529767,它似乎是“失败的”。我在互联网站上找不到与D3DXCompileShaderFromResource相关的任何参考资料

我希望我在stackoverflow的聪明朋友能提供一些帮助。谢谢


好的,问题是(由同事)发现的。加载资源时,我抓取了一个内存块,并错误地将其转换为std::string。也就是说,std::string将在资源中查找空终止符,但资源数据不一定有一个(它只是一个文本文件)。然而,它最终会在软件不应该使用的内存中找到一个

因此,要将资源中的字符缓冲区转换为std::string,应使用以下内容:

return std::string(reinterpret_cast<char const*>(pD), bytes);
,除非您确定pD指向以null结尾的字符串

return std::string(pD);