这段代码总是出错

公西雒 2013-12-02 01:35:34
尝试读取或写入受保护的内存。这通常指示其他内存已损坏
困扰两天,没能解决!
        int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
{
try
{
if (!mbGotOne)
{
// The buffer should be long enought
if (BufferLen <= mstride * mvideoHeight)
{
// Copy the frame to the buffer
// m_handle = pBuffer;
CopyMemory(mhandle, pBuffer, mstride * mvideoHeight);
// m_handle = pBuffer;
mbGotOne = true;//这里弹出错误。
// Picture is ready.
mpictureReady.Set();
}
}
else
{
mdropped++;
}
}
catch (System.Exception ex)
{
MessageBox.Show(ex.ToString());
}
return 0;
}
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
_moli 2013-12-02
  • 打赏
  • 举报
回复
引用 7 楼 danding_ge 的回复:
[quote=引用 6 楼 u012609909 的回复:] [quote=引用 5 楼 danding_ge 的回复:] [quote=引用 4 楼 u012609909 的回复:] 移植前后环境一致么,有没有丢了代码?
可能是环境不同造成的,
        public IntPtr GetBitMap()
        {
            try
            {
                mhandle = Marshal.AllocCoTaskMem(mstride * mvideoHeight);
                mpictureReady.Reset();
                mbGotOne = false;
                // If the graph hasn't been started, start it.
                Start();
                if (!mpictureReady.WaitOne(50, false))  //引发System.AccessViolationException异常
                {
                    //  throw new Exception("Timeout waiting to get picture");
                    Marshal.FreeCoTaskMem(mhandle);
                    return IntPtr.Zero;
                }
                //     createTxt("test", (timeGetTime() - starttime).ToString() + " 1 " + m_handle.ToString() + " " + (ptrFlag++).ToString()); 
            }
            catch
            {
                Marshal.FreeCoTaskMem(mhandle);
                return IntPtr.Zero;
            }
            return mhandle;
        }
这里面的WaitOne(50, false)把50调大就不会出异常了,不明所以。。[/quote] 我在msdn上看到的: WaitHandle.WaitOne (Int32, Boolean) 说明: 在派生类中被重写时,阻塞当前线程,直到当前的 WaitHandle 收到信号,使用 32 位有符号整数度量时间间隔并指定是否在等待之前退出同步域。 由 .NET Compact Framework 支持。 [/quote]这个我也看到了,但我还是不明白原因、。。。[/quote] 我也不明白
公西雒 2013-12-02
  • 打赏
  • 举报
回复
引用 6 楼 u012609909 的回复:
[quote=引用 5 楼 danding_ge 的回复:] [quote=引用 4 楼 u012609909 的回复:] 移植前后环境一致么,有没有丢了代码?
可能是环境不同造成的,
        public IntPtr GetBitMap()
        {
            try
            {
                mhandle = Marshal.AllocCoTaskMem(mstride * mvideoHeight);
                mpictureReady.Reset();
                mbGotOne = false;
                // If the graph hasn't been started, start it.
                Start();
                if (!mpictureReady.WaitOne(50, false))  //引发System.AccessViolationException异常
                {
                    //  throw new Exception("Timeout waiting to get picture");
                    Marshal.FreeCoTaskMem(mhandle);
                    return IntPtr.Zero;
                }
                //     createTxt("test", (timeGetTime() - starttime).ToString() + " 1 " + m_handle.ToString() + " " + (ptrFlag++).ToString()); 
            }
            catch
            {
                Marshal.FreeCoTaskMem(mhandle);
                return IntPtr.Zero;
            }
            return mhandle;
        }
这里面的WaitOne(50, false)把50调大就不会出异常了,不明所以。。[/quote] 我在msdn上看到的: WaitHandle.WaitOne (Int32, Boolean) 说明: 在派生类中被重写时,阻塞当前线程,直到当前的 WaitHandle 收到信号,使用 32 位有符号整数度量时间间隔并指定是否在等待之前退出同步域。 由 .NET Compact Framework 支持。 [/quote]这个我也看到了,但我还是不明白原因、。。。
_moli 2013-12-02
  • 打赏
  • 举报
回复
引用 5 楼 danding_ge 的回复:
[quote=引用 4 楼 u012609909 的回复:] 移植前后环境一致么,有没有丢了代码?
可能是环境不同造成的,
        public IntPtr GetBitMap()
        {
            try
            {
                mhandle = Marshal.AllocCoTaskMem(mstride * mvideoHeight);
                mpictureReady.Reset();
                mbGotOne = false;
                // If the graph hasn't been started, start it.
                Start();
                if (!mpictureReady.WaitOne(50, false))  //引发System.AccessViolationException异常
                {
                    //  throw new Exception("Timeout waiting to get picture");
                    Marshal.FreeCoTaskMem(mhandle);
                    return IntPtr.Zero;
                }
                //     createTxt("test", (timeGetTime() - starttime).ToString() + " 1 " + m_handle.ToString() + " " + (ptrFlag++).ToString()); 
            }
            catch
            {
                Marshal.FreeCoTaskMem(mhandle);
                return IntPtr.Zero;
            }
            return mhandle;
        }
这里面的WaitOne(50, false)把50调大就不会出异常了,不明所以。。[/quote] 我在msdn上看到的: WaitHandle.WaitOne (Int32, Boolean) 说明: 在派生类中被重写时,阻塞当前线程,直到当前的 WaitHandle 收到信号,使用 32 位有符号整数度量时间间隔并指定是否在等待之前退出同步域。 由 .NET Compact Framework 支持。
公西雒 2013-12-02
  • 打赏
  • 举报
回复
引用 4 楼 u012609909 的回复:
移植前后环境一致么,有没有丢了代码?
可能是环境不同造成的,
        public IntPtr GetBitMap()
        {
            try
            {
                mhandle = Marshal.AllocCoTaskMem(mstride * mvideoHeight);
                mpictureReady.Reset();
                mbGotOne = false;
                // If the graph hasn't been started, start it.
                Start();
                if (!mpictureReady.WaitOne(50, false))  //引发System.AccessViolationException异常
                {
                    //  throw new Exception("Timeout waiting to get picture");
                    Marshal.FreeCoTaskMem(mhandle);
                    return IntPtr.Zero;
                }
                //     createTxt("test", (timeGetTime() - starttime).ToString() + " 1 " + m_handle.ToString() + " " + (ptrFlag++).ToString()); 
            }
            catch
            {
                Marshal.FreeCoTaskMem(mhandle);
                return IntPtr.Zero;
            }
            return mhandle;
        }
这里面的WaitOne(50, false)把50调大就不会出异常了,不明所以。。
_moli 2013-12-02
  • 打赏
  • 举报
回复
移植前后环境一致么,有没有丢了代码?
公西雒 2013-12-02
  • 打赏
  • 举报
回复
引用 1 楼 u012609909 的回复:
可能是类型大小的问题吧
引用 2 楼 findcaiyzh 的回复:
这个代码看不出啥。重要的是参数是不是传对了。
我是移植的代码,没动过,原程序运行没问题,移植过来就出错了。
宝_爸 2013-12-02
  • 打赏
  • 举报
回复
这个代码看不出啥。重要的是参数是不是传对了。
_moli 2013-12-02
  • 打赏
  • 举报
回复
可能是类型大小的问题吧

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧