异常:HRESULT: 0x80070057 (E_INVALIDARG)) 解决方案

在使用VS2010进行.NET项目调试时遇到错误,通过清理临时文件目录解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在工作中突然断电,然后我重启机子后,发现项目无法调试了。

报错:未能加载....程序集(异常:HRESULT: 0x80070057 (E_INVALIDARG)) )



然后我在网上搜了下,是这样说的:

windows 7 或 2008 r2的操作系统,或者是wow 64位的操作系统,需要删除 C:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files


VS2010 需要清理一下 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files 。


VS2008 删除 C:\WINDOWS\Microsoft.NETramework\v2.0.50727\Temporary  ASP.NETes 


我的是vs2010 用的.net  操作系统是win7的  我就删了 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files文件夹,结果发现还是报错


后来我在google上搜了下说:win7的还要删除 c:\users\username\AppData\Local\Temp\Temporary ASP.NET Files\  因为它还在工作。


现在项目能调试了。

把我吓了一跳,我还说我刚刚工作就捅漏子。
#ifndef _CD2DC_H_ #define _CD2DC_H_ #define _CRT_SECURE_NO_WARNINGS #define NO_WARN_MBCS_MFC_DEPRECATION #include <SDKDDKVer.h> #include <afxwin.h> #include <d2d1.h> #include <dwrite.h> #include <wincodec.h> #include <unordered_map> namespace MFCEx { /** * @class CD2DC * @brief 封装Direct2D渲染功能的类,用于在MFC应用中实现硬件加速的2D图形渲染 */ class CD2DC final//禁止继承 { enum ResourceType { BRUSH, BITMAP, TEXT_FORMAT, GEOMETRY }; using ResourceMap = std::unordered_map<IUnknown*, ResourceType>; public: CD2DC(); ~CD2DC(); /** * @brief 初始化Direct2D资源 * @param _pWnd [in] 关联的MFC窗口指针 * @param _iWidth [in] 渲染区域的宽度(像素) * @param _iHeight [in] 渲染区域的高度(像素) * @return BOOL 初始化成功返回TRUE,失败返回FALSE */ BOOL Initialize(CWnd* _pWnd, const size_t _iWidth, const size_t _iHeight); /** * @brief 调整渲染区域大小 * @param _iWidth [in] 新的渲染区域宽度(像素) * @param _iHeight [in] 新的渲染区域高度(像素) * @return BOOL 调整成功返回TRUE,失败返回FALSE */ BOOL Resize(const size_t _iWidth, const size_t _iHeight); /** * @brief 开始绘制操作(必须在绘制前调用) */ void BeginDraw(); /** * @brief 结束绘制操作(必须在绘制后调用) */ void EndDraw(); FLOAT GetDpiX() const; FLOAT GetDpiY() const; size_t GetLogicalWidth() const; size_t GetLogicalHeight() const; inline void Release(IUnknown* pResource); ID2D1Bitmap* CreateBitmap(UINT _nWidth, UINT _nHeight, UINT _nRGBA = 4); private: /** * @brief 创建Direct2D渲染目标 * @return BOOL 创建成功返回TRUE,失败返回FALSE */ BOOL CreateRenderTarget(); void Clear(); void RecreateResources(); void UpdateWindowDpi(); // 需要添加资源注册接口 void RegisterResource(IUnknown* pResource, ResourceType Type); // 资源注销接口 void UnregisterResource(IUnknown* pResource); private: CWnd* m_pWnd = nullptr; //< 关联的MFC窗口指针 size_t m_iLogicalWidth = 0; // 逻辑尺寸 size_t m_iLogicalHeight = 0; FLOAT m_fDpiX = 96.0f; // DPI 值 FLOAT m_fDpiY = 96.0f; ID2D1Factory* m_pFactory = nullptr; ///< Direct2D工厂接口 ID2D1HwndRenderTarget* m_pTarget = nullptr; //< 窗口渲染目标接口 IDWriteFactory* m_pWriteFactory = nullptr; //< DirectWrite文本工厂接口 bool m_bInitialized = false; ///< 初始化状态标志 ResourceMap m_Map;//资源管理集 }; } #endif // !_CD2DC_H_ #include "CD2DC.h" #pragma comment(lib, "d2d1.lib") #pragma comment(lib, "dwrite.lib") //#include <ShellScalingApi.h> // 包含GetDpiForMonitor的头文件 //#pragma comment(lib, "Shcore.lib") // 链接Shcore.lib库 // 3. 添加资源安全释放宏 #define SAFE_RELEASE(p) { if(p) { p->Release(); p = nullptr; } } /** * @brief 构造函数(初始化成员变量) */ MFCEx::CD2DC::CD2DC() { } /** * @brief 析构函数(释放所有Direct2D资源) */ MFCEx::CD2DC::~CD2DC() { Clear(); } void MFCEx::CD2DC::Clear() { for (ResourceMap::iterator it = m_Map.begin(); it != m_Map.end(); ++it) { it->first->Release(); } m_Map.clear(); SAFE_RELEASE(m_pTarget); SAFE_RELEASE(m_pFactory); SAFE_RELEASE(m_pWriteFactory); } /** * @brief 初始化Direct2D资源 * @param _pWnd [in] 关联的MFC窗口指针 * @param _iWidth [in] 渲染区域的宽度(像素) * @param _iHeight [in] 渲染区域的高度(像素) * @return BOOL 初始化成功返回TRUE,失败返回FALSE */ BOOL MFCEx::CD2DC::Initialize(CWnd* _pWnd, const size_t _iWidth, const size_t _iHeight) { // 验证窗口句柄有效性 if (!_pWnd || !_pWnd->GetSafeHwnd()) return FALSE; // 创建Direct2D工厂 HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &m_pFactory); if (FAILED(hr)) return FALSE; // 创建DirectWrite工厂 hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&m_pWriteFactory) ); if (FAILED(hr)) return FALSE; // 设置成员变量 m_pWnd = _pWnd; // DPI 感知处理 UpdateWindowDpi(); // 替换原有的GetDesktopDpi调用 m_iLogicalWidth = _iWidth; // 存储逻辑尺寸 m_iLogicalHeight = _iHeight; // 创建渲染目标 if (!CreateRenderTarget()) { SAFE_RELEASE(m_pWriteFactory); SAFE_RELEASE(m_pFactory); return FALSE; } m_bInitialized = TRUE; return TRUE; } /** * @brief 调整渲染区域大小 * @param _iWidth [in] 新的渲染区域宽度(像素) * @param _iHeight [in] 新的渲染区域高度(像素) * @return BOOL 调整成功返回TRUE,失败返回FALSE */ BOOL MFCEx::CD2DC::Resize(const size_t _iWidth, const size_t _iHeight) { if (!m_pTarget) return FALSE; // 更新 DPI 值 UpdateWindowDpi(); // 替换原有的GetDesktopDpi调用 m_iLogicalWidth = _iWidth; m_iLogicalHeight = _iHeight; size_t physWidth = static_cast<size_t>(_iWidth * m_fDpiX / 96.0f); size_t physHeight = static_cast<size_t>(_iHeight * m_fDpiY / 96.0f); D2D1_SIZE_U size = D2D1::SizeU(physWidth, physHeight); return SUCCEEDED(m_pTarget->Resize(size)); } /** * @brief 开始绘制操作(必须在绘制前调用) */ void MFCEx::CD2DC::BeginDraw() { if (m_pTarget) m_pTarget->BeginDraw(); } /** * @brief 结束绘制操作(必须在绘制后调用) */ void MFCEx::CD2DC::EndDraw() { if (!m_pTarget) return; if (D2DERR_RECREATE_TARGET == m_pTarget->EndDraw()) { SAFE_RELEASE(m_pTarget); if (CreateRenderTarget()) { RecreateResources(); // 触发资源重建 } } } /** * @brief 创建Direct2D渲染目标 * @return BOOL 创建成功返回TRUE,失败返回FALSE */ BOOL MFCEx::CD2DC::CreateRenderTarget() { // 验证工厂和窗口有效性 if (!m_pFactory || !m_pWnd) return FALSE; // 创建窗口渲染目标 D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE ); D2D1_RENDER_TARGET_PROPERTIES rtProps = D2D1::RenderTargetProperties( D2D1_RENDER_TARGET_TYPE_DEFAULT, pixelFormat ); size_t physWidth = static_cast<size_t>(m_iLogicalWidth * m_fDpiX / 96.0f); size_t physHeight = static_cast<size_t>(m_iLogicalHeight * m_fDpiY / 96.0f); HRESULT hr = m_pFactory->CreateHwndRenderTarget( rtProps, // 使用自定义属性 D2D1::HwndRenderTargetProperties(m_pWnd->GetSafeHwnd(), D2D1::SizeU(physWidth, physHeight)), &m_pTarget ); return SUCCEEDED(hr); } FLOAT MFCEx::CD2DC::GetDpiX() const { return m_fDpiX; } FLOAT MFCEx::CD2DC::GetDpiY() const { return m_fDpiY; } size_t MFCEx::CD2DC::GetLogicalWidth() const { return m_iLogicalWidth; } size_t MFCEx::CD2DC::GetLogicalHeight() const { return m_iLogicalHeight; } void MFCEx::CD2DC::RecreateResources() { for (ResourceMap::iterator it = m_Map.begin(); it != m_Map.end(); ++it) { } } void MFCEx::CD2DC::UpdateWindowDpi() { if (!m_pWnd) return; // 获取窗口DPI(Windows 10以上使用GetDpiForWindow) m_fDpiX = static_cast<FLOAT>(GetDpiForWindow(m_pWnd->GetSafeHwnd())); m_fDpiY = static_cast<FLOAT>(GetDpiForWindow(m_pWnd->GetSafeHwnd())); // 如果获取失败,则回退到GetDeviceCaps方式 if (m_fDpiX == 0 || m_fDpiY == 0) { const HDC hdc = ::GetDC(m_pWnd->GetSafeHwnd()); m_fDpiX = static_cast<FLOAT>(GetDeviceCaps(hdc, LOGPIXELSX)); m_fDpiY = static_cast<FLOAT>(GetDeviceCaps(hdc, LOGPIXELSY)); ::ReleaseDC(m_pWnd->GetSafeHwnd(), hdc); } } // 需要添加资源注册接口 void MFCEx::CD2DC::RegisterResource(IUnknown* pResource, ResourceType Type) { if (!pResource) return; // 检查资源是否已注册(避免重复注册) auto it = m_Map.find(pResource); if (it != m_Map.end()) { // 已存在则更新类型(实际开发中应记录日志) //it->second = Type; return; } // 添加新资源引用计数 pResource->AddRef(); m_Map.emplace(pResource, Type); } // 资源注销接口 void MFCEx::CD2DC::UnregisterResource(IUnknown* pResource) { if (!pResource) return; auto it = m_Map.find(pResource); if (it != m_Map.end()) { // 释放资源并移除映射 it->first->Release(); m_Map.erase(it); } } inline void MFCEx::CD2DC::Release(IUnknown* pResource) { UnregisterResource(pResource); } ID2D1Bitmap* MFCEx::CD2DC::CreateBitmap(UINT _nWidth, UINT _nHeight, UINT _nRGBA) { D2D1_SIZE_U size = { _nWidth, _nHeight }; D2D1_BITMAP_PROPERTIES props = { { DXGI_FORMAT_R8G8B8A8_UNORM, (_nRGBA == 4) ? D2D1_ALPHA_MODE_FORCE_DWORD : (D2D1_ALPHA_MODE)(_nRGBA) }, m_fDpiX, m_fDpiY }; ID2D1Bitmap* bitmap; HRESULT hr = m_pTarget->CreateBitmap(size, nullptr, _nWidth*_nRGBA, props, &bitmap); if (FAILED(hr))return NULL; return bitmap; } 着重帮我分析CreateBitmap的完整性
08-06
<think>嗯,用户遇到了Direct3D 11中创建2D纹理着色器资源视图失败的问题,错误代码是0x80070057。这个错误代码通常代表E_INVALIDARG,也就是参数无效。我需要回忆一下在D3D11中创建着色器资源视图时有哪些可能的参数错误。 首先,D3DX11CreateShaderResourceViewFromFile函数的参数。用户可能提供的文件名不正确,或者文件格式不支持。比如,如果文件不是DDS格式,或者DDS文件的格式不符合要求,比如没有正确的Mipmap链,或者纹理尺寸不是2的幂,特别是在旧硬件上可能有问题。另外,D3D11需要纹理的格式与着色器期望的格式匹配,比如NV12可能需要多个SRV,但用户可能错误地只创建了一个。 然后,函数的第三个和第四个参数是D3DX11_IMAGE_LOAD_INFO结构体和ID3DX11ThreadPump对象。如果用户在这里传入了非空的值,但结构体中的某些设置不正确,比如绑定了不支持的标志,可能导致错误。比如,如果指定了Mipmap级别超过实际存在的数量,或者格式转换不正确。 另外,纹理的绑定标志是否正确?比如,创建纹理时是否指定了D3D11_BIND_SHADER_RESOURCE标志。如果纹理是用其他标志创建的,比如作为渲染目标,但没有同时允许着色器资源,那么创建SRV会失败。 还有,检查纹理的格式是否支持SRV。有些格式可能不支持,比如某些压缩格式在特定硬件上不支持,或者格式类型不匹配。例如,如果尝试为深度模板纹理创建SRV而没有使用正确的格式,就会失败。 用户引用的资料中提到,NV12像素着色器需要两个SRV,一个用于亮度,一个用于色度。如果用户正在处理NV12格式的纹理,可能需要分别创建两个SRV,但代码中可能只创建了一个,导致参数错误。这时候需要检查纹理的格式是否是DXGI_FORMAT_NV12,然后正确分割成两个SRV,可能一个是R8_UNORM(亮度),另一个是R8G8_UNORM(色度)。 此外,DirectX SDK的示例代码可能对用户有帮助。比如,引用的代码示例中创建了grass.dds和water2.dds的SRV,用户需要确认自己的纹理文件是否有效,路径是否正确,是否成功加载。可能文件路径错误,或者文件损坏,导致加载失败,进而SRV创建失败。 还有,检查设备是否支持请求的格式。使用CheckFormatSupport函数来确认纹理格式是否支持D3D11_FORMAT_SUPPORT_SHADER_SAMPLE。如果不支持,就需要转换格式。 总结可能的解决步骤:检查文件路径和格式,确认纹理参数正确,确保绑定标志包含SHADER_RESOURCE,检查格式支持,处理NV12等需要多个SRV的情况,参考官方示例代码的正确用法。</think>在Direct3D 11中创建2D纹理着色器资源视图失败(错误代码0x80070057,即E_INVALIDARG)的解决方案如下: ### 1. 验证纹理文件有效性 - 检查纹理文件路径是否正确,确保文件存在且可访问 - 确认纹理文件格式符合要求(如DDS格式需包含完整的Mipmap链) - 使用DirectX Texture Tool验证文件有效性 示例代码: ```cpp // 检查文件是否存在 if (GetFileAttributes(L"Textures/example.dds") == INVALID_FILE_ATTRIBUTES) { // 处理文件不存在的情况 } ``` ### 2. 检查纹理创建参数 必须确保原始纹理创建时包含`D3D11_BIND_SHADER_RESOURCE`标志: ```cpp D3D11_TEXTURE2D_DESC texDesc; texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; // 必须包含此标志 texDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; // 确保格式兼容性 // ...其他参数设置 ``` ### 3. 验证SRV创建参数 特别注意NV12格式需要创建两个SRV[^1],标准格式示例: ```cpp // 标准RGBA格式创建示例 HRESULT hr = D3DX11CreateShaderResourceViewFromFile( device, L"texture.dds", nullptr, // D3DX11_IMAGE_LOAD_INFO(保持nullptr使用默认参数) nullptr, // ID3DX11ThreadPump &srv, nullptr ); ``` ### 4. 处理特殊格式 对YUV(NV12)等特殊格式: ```cpp // 亮度通道 CreateShaderResourceView(pTexture, &SRVDesc_Luma, &m_pLumaSRV); // 色度通道 CreateShaderResourceView(pTexture, &SRVDesc_Chroma, &m_pChromaSRV); ``` ### 5. 检查硬件支持 使用`CheckFormatSupport`验证格式兼容性: ```cpp UINT formatSupport; if (FAILED(device->CheckFormatSupport(format, &formatSupport))) { // 处理不支持格式 } if (!(formatSupport & D3D11_FORMAT_SUPPORT_SHADER_SAMPLE)) { // 格式不支持着色器采样 } ``` ### 6. 调试建议 - 使用DirectX调试层获取详细错误信息 - 参考Microsoft官方示例验证代码结构[^3] ```cpp // 启用调试层 D3D11_CREATE_DEVICE_FLAG createDeviceFlags = D3D11_CREATE_DEVICE_DEBUG; ``` ### 典型错误场景解决方案表 | 错误原因 | 验证方法 | 解决方案 | |---------|---------|---------| | 无效文件路径 | 文件存在性检查 | 修正资源路径 | | 格式不支持 | CheckFormatSupport | 转换纹理格式 | | 缺少绑定标志 | 检查BindFlags | 添加D3D11_BIND_SHADER_RESOURCE | | 参数冲突 | 调试层输出 | 统一纹理与SRV格式 |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值