C#调用OK采集卡问题,卡型号OK_M20A,遇到错误"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"采集图片
OK32API.okCaptureTo(this.m_handle, OK32Targets.Buffer, 0, 1);
                        OK32API.okGetCaptureStatus(this.m_handle, 1);
//取得图片信息
                    short width; //
                    short height; //
                    int stride;//
                    OK32API.okGetTargetInfo(this.m_handle, OK32Targets.Buffer, 0, out width, out height, out stride);
                    //读取图片数据
                    IntPtr pData = Marshal.AllocHGlobal(stride * height);
                    OK32API.okReadRect(this.m_handle, OK32Targets.Buffer, 0, pData);
                    bmp = new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, pData );
                    bmp.RotateFlip(RotateFlipType.Rotate180FlipNone);
                    Marshal.FreeHGlobal(pData);出现在Marshal.FreeHGlobal(pData),希望有做过图像卡采集的大神指点一下c#

解决方案 »

  1.   

    Pdata被破坏,已不是最初的pdata了,看看api的调用约定
      

  2.   

    dotnet是会自动回收内存的。
    在厂家类库里自动分的内存,有可能会在c#中被释放。
      

  3.   

    在API初始化、释放这方面看看
      

  4.   

    目前改为这样,不再抛异常(可能原因是数据源问题,数据源为8位黑白位图):
    //读取图片数据
    IntPtr pData = Marshal.AllocHGlobal(width *3 * height);
    OK32API.okReadRect(this.m_handle, OK32Targets.Buffer, 0, pData);
                        bmp = new Bitmap(width, height, stride, PixelFormat.Format24bppRgb, pData );
                        Marshal.FreeHGlobal(pData);