DirectX C++程序调用D3DCompile返回HRESULT 0x80070005错误求助
D3DCompile返回0x80070005(拒绝访问)问题排查
先给结论:这个错误基本是代码或项目配置问题,系统权限的可能性微乎其微——你已经有管理员权限,Windows 10默认不会限制D3DCompile的正常调用。
下面是具体排查点:
HLSL文件读取异常
如果你是从文件加载HLSL代码,先检查路径是否正确,有没有拼写错误或者相对路径指向不对。另外,读取文件时要确保拿到完整内容,比如用ReadFile时,是否没处理文件大小的计算,导致读取的字节数不足?还有,右键HLSL文件看看是不是被设成了“只读”——虽然管理员能读,但偶尔会触发奇怪的访问问题,取消只读试试。D3DCompile参数错误
仔细核对传给D3DCompile的每一个参数:- 确认着色器代码的字节数组确实以
\0结尾,且传递的长度包含这个终止符,别漏算。 - 编译目标字符串(比如
"cs_5_0")别拼错,要和你用的DirectX版本匹配——DirectX 11对应cs_5_0,DirectX 12得用cs_6_0。 pDefines参数如果不是空,要确保每个宏定义的格式都正确,没有语法错误。pOutput和pErrorMsgs的指针要正确初始化,别传了空指针又没处理后续逻辑。
- 确认着色器代码的字节数组确实以
Visual Studio项目配置问题
- 检查项目的平台工具集是不是最新的(比如v143),Windows SDK版本要和你的DirectX版本兼容——比如DirectX 11至少要Windows 10 SDK 10.0.19041.0及以上。
- 如果是运行时读取HLSL文件,要确保文件被复制到了程序的输出目录(右键HLSL文件→属性→复制到输出目录,设为“如果较新则复制”)。
务必获取编译错误信息
哪怕D3DCompile返回错误,也要把pErrorMsgs里的内容打出来,这才是定位问题的关键。比如加这段代码:ID3DBlob* errorBlob = nullptr; HRESULT hr = D3DCompile(shaderCode, codeLength, nullptr, nullptr, nullptr, "CSMain", "cs_5_0", 0, 0, &shaderBlob, &errorBlob); if (FAILED(hr)) { if (errorBlob) { OutputDebugStringA(static_cast<char*>(errorBlob->GetBufferPointer())); errorBlob->Release(); } // 处理错误逻辑 }错误信息会直接告诉你是HLSL语法错了,还是参数不对,比单纯看 HRESULT 有用10倍。
内容的提问来源于stack exchange,提问作者Jeffrey Bjelstrom
相关产品推荐
相关产品推荐

