C++ 方法
CLIENT_API int _stdcall MornsunSvrGetMessage(void * pBuf,UINT nTimeOut)
{
return PublicApi::Instance().GetMessage(pBuf,nTimeOut);
}这里的 void * pBuf 是一个结构的缓冲区
public static extern int MornsunSvrGetMessage(ref IntPtr msg, int nTimeOut);
这样定制可以C++方法后
IntPtr msg;
MornsunSvrGetMessage(ref msg,1000)
我尝试用
Marshal.PtrToStructure(msg, typeof(ConnectionStatePdu));
方式 转换成 ConnectionStatePdu 就会出现
尝试读取或写入受保护的内存。这通常指示其他内存已损坏
CLIENT_API int _stdcall MornsunSvrGetMessage(void * pBuf,UINT nTimeOut)
{
return PublicApi::Instance().GetMessage(pBuf,nTimeOut);
}这里的 void * pBuf 是一个结构的缓冲区
public static extern int MornsunSvrGetMessage(ref IntPtr msg, int nTimeOut);
这样定制可以C++方法后
IntPtr msg;
MornsunSvrGetMessage(ref msg,1000)
我尝试用
Marshal.PtrToStructure(msg, typeof(ConnectionStatePdu));
方式 转换成 ConnectionStatePdu 就会出现
尝试读取或写入受保护的内存。这通常指示其他内存已损坏
另外,由于pBuf是缓冲区,那么要求C#分配内存,如使用Marshal.AllocHGlobal函数来分配内存。
fixed (byte* p = &ABuffer[0])
{
i = AgentApi.MornsunSvrGetMessage(p, 100);
}
的方式成功分配了缓冲区 也成功获得了 ABuffer 但是我无法将 ABuffer 转换成为 结构
目前可以知道 ABuffer 中0-1,128-132 ,156-160是有数据的 但是和结构体描述的不一样 不管怎么写
我都无法将 128-132 还有156-160的数据转换到 结构体里面
String c1 = OpStruct.BytesToString(ABuffer, 128, 4);c1=3333
String c2 = OpStruct.BytesToString(ABuffer, 156, 4);c2=4444
目前缓冲区里面的值
我些的结构目前只能获取i1的值后面全是空
希望大家能帮我写个结构可以 获得 c1和c2的值。