首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AccessViolationException读入

AccessViolationException读入
EN

Stack Overflow用户
提问于 2014-04-18 16:04:02
回答 1查看 388关注 0票数 0

我有下面的代码,并且不明白为什么我定期得到一个AccessViolationException或COMException。任何帮助都将不胜感激。谢谢。

代码语言:javascript
复制
        IntPtr eventObject = IntPtr.Zero;
        NativeOverlapped HidOverlapped = new NativeOverlapped();
        Byte[] inputReportBuffer = null;
        Int32 numberOfBytesRead = 0;
        Int32 result = 0;
        Boolean success = false;
        IntPtr unManagedBuffer = IntPtr.Zero;
        IntPtr unManagedOverlapped = IntPtr.Zero;

        Array.Resize(ref inputReportBuffer, Capabilities.InputReportByteLength);

        eventObject = CreateEvent
            (IntPtr.Zero,
            false,
            false,
            String.Empty);

        HidOverlapped.OffsetLow = 0;
        HidOverlapped.OffsetHigh = 0;
        HidOverlapped.EventHandle = eventObject;

        unManagedBuffer = Marshal.AllocHGlobal(inputReportBuffer.Length);
        unManagedOverlapped = Marshal.AllocHGlobal(Marshal.SizeOf(HidOverlapped));
        Marshal.StructureToPtr(HidOverlapped, unManagedOverlapped, false);

        success = ReadFile
            (readHandle,
            unManagedBuffer,
            inputReportBuffer.Length,
            ref numberOfBytesRead,
            unManagedOverlapped);

        while (!busyWait()) ;
        // If ReadFile returned true, report is available. Otherwise, check for completion
        if (!success)
        {
            result = WaitForSingleObject(eventObject, 1000);

            switch (result)
            {
                case WAIT_OBJECT_0:
                    success = true;
                    GetOverlappedResult
                        (readHandle,
                        unManagedOverlapped,
                        ref numberOfBytesRead,
                        false);
                    break;
                case WAIT_TIMEOUT:
                    CancelIo(readHandle);
                    break;
                default:
                    CancelIo(readHandle);
                    break;
            }
        }
        if (success)
        {
            // Report was received.
            // Copy Received data to inputReportBuffer for application use
            Marshal.Copy(unManagedBuffer, inputReportBuffer, 0, numberOfBytesRead);
            ProcessUSB(inputReportBuffer);
        }
        Marshal.FreeHGlobal(unManagedOverlapped);  // <-- AccessViolationException Here.
        Marshal.FreeHGlobal(unManagedBuffer);
        success = HidD_FreePreparsedData(preparsedData);

另外,下面是来自异常的堆栈跟踪:

代码语言:javascript
复制
   at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Runtime.InteropServices.Marshal.FreeHGlobal(IntPtr hglobal)
   at TWEEQ.MainWindow.ReadUSB()
   at TWEEQ.MainWindow.myTimer_Elapsed(Object sender, ElapsedEventArgs e)
   at System.Timers.Timer.MyTimerCallback(Object state)
   at System.Threading.TimerQueueTimer.CallCallbackInContext(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.TimerQueueTimer.CallCallback()
   at System.Threading.TimerQueueTimer.Fire()
   at System.Threading.TimerQueue.FireNextTimers()
   at System.Threading.TimerQueue.AppDomainTimerCallback()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-18 18:04:21

雷蒙德·陈在http://blogs.msdn.com/b/oldnewthing/archive/2011/02/02/10123392.aspx的博客

很有可能在调用CancelIO之后I/O还没有完成,而且您正在打破博客中所述的基本规则。也就是说,“重叠结构必须在I/O完成之前保持有效”。

在调用WaitForSingleObject(eventObject, 0xFFFFFFFF)之前尝试添加FreeHGlobal (或任何用于无穷大的const )。

此外,您还可以将switch语句简化如下:

代码语言:javascript
复制
            case WAIT_TIMEOUT:
            default:
                CancelIo(readHandle);
                break;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23157806

复制
相关文章

相似问题

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