首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用IDirect3DTexture9::LockRect时的ACCESS_VIOLATION异常(0xC0000005)

使用IDirect3DTexture9::LockRect时的ACCESS_VIOLATION异常(0xC0000005)
EN

Stack Overflow用户
提问于 2013-06-01 05:24:29
回答 2查看 2.2K关注 0票数 0

使用DirectX 9,我尝试创建并以以下方式填充LPDIRECT3DTEXTURE9纹理。

  1. 首先,我使用IDirect3DTexture9::CreateTexture创建了纹理: LPDIRECT3DTEXTURE9 pTexture;如果失败( pd3dDevice->CreateTexture( MAX_IMAGE_WIDTH,MAX_IMAGE_HEIGHT,1,0,// D3DUSAGE_DYNAMIC,D3DFMT_A8R8G8B8,D3DPOOL_MANAGED,// D3DPOOL_DEFAULT ),){ //句柄错误大小写}
  2. 然后,我尝试按如下方式锁定纹理上的一个矩形: 无符号int uiSize = GetTextureSize();D3DLOCKED_RECT rect;ARGB BlackColor ={ (char)0xFF,(char)0x00 };:ZeroMemory( & rect,sizeof( D3DLOCKED_RECT ) );// Lock大纲纹理重新映射,然后将位转换为位,并使用位作为outlineTexture访问点,如果( pTexture == NULL ){返回ERROR_NOT_INITIALIZED;}pTexture>LockRect( 0,&rect,NULL,D3DLOCK_NOSYSLOCK );//考虑?ARGB* bits = (ARGB*)rect.pBits;for (无符号int uiPixel = 0;uiPixel < uiSize;++uiPixel ){ //复制所有黑色像素时,只有当( compositeMaskuiPixel == BlackColor ){ bitsuiPixel = compositeMaskuiPixel;}pTexture>UnlockRect(0 );返回ERROR_SUCCESS;

ARGB只是一个定义如下的结构:

代码语言:javascript
运行
复制
struct ARGB
{
    char b;
    char g;
    char r;
    char a;

    bool operator==( ARGB& comp )
    {
        if ( a == comp.a &&
             r == comp.r &&
             g == comp.g &&
             b == comp.b )
            return TRUE;
        else
            return FALSE;
    }

    bool operator!=( ARGB& comp )
    {
        return !( this->operator==( comp ) );
    }
};

我想要做的是根据应用程序中的算法预先计算像素数据数组(黑色轮廓),然后只将该像素数据集中的纯黑色像素写入我的LPDIRECT3DTEXTURE9以供稍后呈现。

应用程序当前在ACCESS_VIOLATION调用时抛出一个LockRect异常(0xC0000005)。有谁能解释一下原因吗?

以下是具体的异常细节:

在TestApp.exe: 0xC0000005:访问冲突读取位置0x00000001中0x0132F261处的未处理异常。

0x000000000x00000001的位置不同.这暗示了什么吗?

另外,如果有更好的方法来做我想做的事,那么我会全神贯注地听下去:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-02 08:39:33

和你问题上的其他评论员一样,原则上我看不出你创建和锁定纹理的方式有什么问题。我自己也这样做过--在D3DPOOL_MANAGED中创建一个纹理,并使用LockRect更新内容。

然而,有三个方面使我感到关切。我发帖作为回应,因为有太多的评论,所以请容忍我……

  1. 锁定时使用D3DLOCK_NOSYSLOCK标志。我发现,当为多线程操作创建了D3D设备时,这可能会导致冲突。
  2. 您访问锁定位元的方式没有考虑到步幅。我理解这个错误显然发生在这段代码之前,但还是值得一提的。
  3. 您正在转换到您自己的struct进行像素访问,并且不清楚struct的实际大小可能是什么,因为我看不到项目的打包选项。

因此,我建议您可以做三件事,以确定上述任何一项是否造成了问题:

首先,只需为锁定调用使用默认的零标志即可。

代码语言:javascript
运行
复制
pTexture->LockRect( 0, &rect, NULL, 0 );

第二,验证您的ARGB结构实际上是4个字节。

代码语言:javascript
运行
复制
ASSERT(sizeof(ARGB) == 4);

最后,除了锁定和解锁纹理之外,什么也不做,看看您是否仍然得到运行时错误,但也检查返回代码。

代码语言:javascript
运行
复制
HRESULT hr = pTexture->LockRect( 0, &rect, NULL, 0 );
ASSERT(SUCCEEDED(hr));
hr = pTexture->UnlockRect( 0 );
ASSERT(SUCCEEDED(hr));

在任何情况下,在更新纹理位时,必须逐行进行,同时考虑到LockRect调用在D3DLOCKED_RECT.Pitch中返回的步幅。

也许你可以根据上面的结果更新你的问题,我可以在必要时修改这个答案。

票数 1
EN

Stack Overflow用户

发布于 2013-06-02 23:46:40

这真是愚蠢至极。对不起大家。

我一直跟踪纹理指针,直到代码;LPDIRECT3DTEXTURE9指针实际上存储在另一个自定义纹理类对象类型中,并附加了额外的上下文数据;这些包装器对象是另一个类的成员,这些类被复制并在各处使用,但是没有为该类编写的赋值操作符或复制构造函数。在处理的大量纹理列表中,从容器类发送的纹理中有一个被发现无效,因为它实际上是无效的;它应该包含另一个纹理的副本,但只包含一个无效的指针。

为大家的不幸的业余错误感到抱歉,但是感谢你们的伟大的指点和保证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16869398

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档