C#中,调用的C++ DLL,在DLL中有API函数:LONG APIENTRY devwdm_GetImageBuffer(BYTE *pImageMem);函数功能:      采集一帧RGB24图像到内存
pImageMem:     图像缓冲区指针C#调用:        [DllImport("devwdm.dll")]
        //函数功能:采集一帧RGB24图像到内存   pImageMem:图像缓冲区指针
        public static extern int devwdm_GetImageBuffer(IntPtr pImageMem);请问我怎么才能将该函数存入到内存中的图片数据读出来,并用Panel控件在Form中显示出来啊?

解决方案 »

  1.   

    pictureBox1.Image = Image.FromStream(new MemoneryStream(imgByte));//imgByte为内存数据
    内存可以读 
    Marshal.ReadInt32((IntPtr)0x14F2CEC);
      

  2.   

    //要读取的内存长度
    int len=100;
    byte[] imgByte=new byte[len];
    IntPtr hglobal = Marshal.AllocHGlobal(len);
    devwdm_GetImageBuffer(hglobal);
    pictureBox1.Image = Image.FromStream(new MemoneryStream(imgByte));//imgByte为内存数据
    Marshal.FreeHGlobal(hglobal);
    就是先申请一块内存区域,然后再存放你要读取的内存中的数据。
      

  3.   

    回复:3楼感谢您的指点,不过报错:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。是不是我将C++ DLL中的 byte*,在C#中转换为IntPtr是不正确的?那应该如何转换和调用呢
      

  4.   

    你首先需要确认申请的内存长度是正确的?
    如果需要的长度是1024,那你先定义的长度小于1024的,看调用后是否还会出现尝试读取或写入受保护的内存另外你有C++的DEMO不,看下它是怎么调用的?
    因为不清楚pImageMem这个参数是否要先做什么处理,然后才调用devwdm_GetImageBuffer
      

  5.   

    谢谢,我看看DEMO请问降byte* 转换为IntPtr这样可以吗?
    我是菜鸟,还望指点,感激不尽
      

  6.   

    三楼的代码在执行完devwdm_GetImageBuffer(hglobal);后,少了句Marshal.Copy(hglobal,imgByte,...不过以你的报错信息判断,可能原因不是出在这里,最好贴出出错代码.另外,你的CDLL的函数返回值是长度吗?如果是长度的话,试试
    int len=0;
    IntPtr hglobal = Marshal.AllocHGlobal(len);
    len=devwdm_GetImageBuffer(hglobal);
    byte[] imgByte=new byte[len];
    Marshal.Copy(hglobal,imgByte,0,len);
    Marshal.FreeHGlobal(hglobal);
    pictureBox1.Image = Image.FromStream(new MemoneryStream(imgByte));
      

  7.   

    int len=1024*1024*1024;//尽可能大,超过图像数据的长度;
    IntPtr hglobal = Marshal.AllocHGlobal(len);
    len=devwdm_GetImageBuffer(hglobal);
    byte[] imgByte=new byte[len];
    Marshal.Copy(hglobal,imgByte,0,len);
    Marshal.FreeHGlobal(hglobal);
    pictureBox1.Image = Image.FromStream(new MemoneryStream(imgByte));
      

  8.   

    非常感谢,jointan 的帮助,用了您的代码,但是还是老问题...
      

  9.   

    信息太少了,可以把你DEMO里调用这个函数前后的代码都贴出来看看
      

  10.   

    DEMO中该函数的调用
    int len=m_strWideth*m_strHeight*3;
    BYTE* pDrawBuf=new BYTE[len];
    devwdm_GetImageBuffer(pDrawBuf);
      

  11.   


    8楼的代码就可以了,长度设的一样就行,没看出有特殊的地方。APIENTRY 指明该方法是用什么样的方式调用的?stdcall,_cdcel??
      

  12.   

    楼主你的DLL哪里下载的?