C# 调用 C++的DLL 尝试读取或写入受保护的内存
C++ 原形
DLL_EXPORT int WAPA_IPC_Dec(int index, unsigned char *instream, int istream_size, unsigned char *outstream); //解码,其中index为解码器的索引号,istream是编码数据,istream_size编码数据的大小,ostream为解码后的数据
DLL_EXPORT int WAPA_IPC_SetDataCallBack(DataCallBack fData); //设置视频回调函数
typedef BOOL (CALLBACK *DataCallBack)(int index, int type, BYTE* pData, int len, int param1, int param2);
C#代码
//解码,其中index为解码器的索引号,istream是编码数据,istream_size编码数据的大小,ostream为解码后的数据
[DllImport("SDK.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int WAPA_IPC_Dec(int index, [In, MarshalAs(UnmanagedType.LPStr)]StringBuilder instream, int istream_size, [Out, MarshalAs(UnmanagedType.LPStr)]StringBuilder outstream);
//视频回调函数,index为摄像机索引,type为帧类型,pData为指向长度为len的帧数据的指针,bMove为TRUE表示这一帧的图像有移动,param1、param2为图像宽高
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate bool DataCallBack(int index, int type, [In, MarshalAs(UnmanagedType.LPStr)]StringBuilder pData, int len, int param1, int param2);
调用
int i = DvrClinet.DvrInit(TVFORMAT.PAL);
int m; StringBuilder _buildera;
m = DvrClinet.DvrLogin("192.168.1.200", 0);
int y = DvrClinet.DvrInitDec(1920, 1080, 264, 0);
int n = DvrClinet.DvrGetCameraState(m);
_buildera = new StringBuilder(1920 * 1080 * 2);
DvrClinet.DvrSetDataCallBack(new DataCallBack(ShowDisplay));
public bool ShowDisplay(int index, int type, [In, MarshalAs(UnmanagedType.LPStr)]StringBuilder pData, int len, int param1, int param2)
{
byte[] ss = new byte[len];
byte[] aa = new byte[len];
IntPtr pImage = Marshal.AllocHGlobal(param1 * param2);
// pData = new StringBuilder(len);
DvrClinet.WAPA_IPC_Dec(m, pData, len, _buildera);//这里报错,尝试读取或写入受保护的内存
//_buildera.Remove(0, _buildera.Length);
//pData.Remove(0, _buildera.Length);
MessageBox.Show(pData.Length.ToString()
);
return true;
}
为什么 一调试就出现 尝试读取或写入受保护的内存的错误呢,请高手帮忙 要怎么改