<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<head><meta forua="true" http-equiv="Cache-Control" content="max-age=0" /></head>
<card title="c#(c++/c DLL)尝试读取或写入受保护的内存,这通常指示其他内存已损坏" id="card1">
<p> 游客</p><p>
标题:c#(c++/c DLL)尝试读取或写入受保护的内存,这通常指示其他内存已损坏<br/>
正文:<br/>
 C#调用非托管DLL中的API： LONG APIENTRY devwdm_GetImageBuffer(BYTE *pImageMem);  函数功能： 采集一帧RGB24图像到内存  pImageMem： 图像缓冲区指针C#调用： C# code<br/>[DllImport(&amp;quot;devwdm.dll&amp;quot;)]<br/>public static extern int devwdm_GetImageBuffer(IntPtr pImageMem);<br/>于是报错：尝试读取或写入受保护的内存。这通常指示其他内存已损坏。求助于大家，根据大家的意见，把API中的 BYTE* 转换到C#中，分别用 byte[] 、IntPtr 、ref byte[]、 ...甚至用unsafe了，可是还是报错，有人说内存不够大，于是我非配了很大的内存，扔报错...万般无奈，去C++的示例程序中看，示例程序中调用该函数没有任何问题。pImageMem是用来存放图象数据的缓冲区 字节数组(长*宽*3)lpsz是文件名(用于保存图象) 字符数组(Unicode/ANSI)devwdm_GetImageBuffer(pImageMem); 对字节数组赋值CT_SaveBmp(lpsz,pImageMem,m_strWideth,m_strHeight,0);以BMP格式保存CT_SaveJpeg(lpsz,pImageMem,m_strWideth,m_strHeight,0);以JPG格式保存以C#重写上述功能,要注意的几点:1,获取正确的m_strWideth和m_strHeight ,据此申请内存块:  IntPtr ptrImage = Marshal.AllocHGlobal(m_strWideth*m_strHeight*3);2,构建文件名,szFile是用户输入的字符串?  string filename = &amp;quot;XXX&amp;quot;;  IntPtr ptrFileName = Marshal.AllocHGlobal(filename.Length+1);  Marshal.Copy(s.ToCharArray(), 0, ptrFileName, s.Len<br/><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=293&amp;Page=1">[&lt;&lt;]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=293&amp;Page=1">[[1]]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=293&amp;Page=2">[2]</a><a href="http://camnpr.com/wap.asp?mode=WAP&amp;act=View&amp;id=293&amp;Page=2">[&gt;&gt;]</a><br/>
<br/>
<a href="wap.asp?act=Com&amp;id=293">查看评论(0)</a><br/>
<a href="wap.asp?act=AddCom&amp;inpId=293">发表评论</a><br/><br/>

<br/>

<br/>
<a href="http://camnpr.com/wap.asp">首页</a>
</p>
</card>
</wml>