平台调用----封送结构体指针。
请教你 一个问题。
C定义如下:
BOOL effnEDClientCheckPointInfoByTime(
efSTReadRtInfoRequest*pReqBuffer,//
efSTReadRtInfoResponse * pResBuffer,//
unsignedlong Count //
);
结构如下:
#define EFMI_POINTNAMELENGTH48
#define EFMI_POINTCOMMLENGTHEFMI_POINTNAMELENGTH
//查询实时记录请求包结构
typedef struct defefSTReadRtInfoRequest{
long time;//
char pointName[EFMI_POINTNAMELENGTH+1];//EFMI_POINTNAMELENGTH+1;
char ednaServ[EFMI_POINTCOMMLENGTH+1];//
}efSTReadRtInfoRequest;
//查询实时记录回复包结构
typedef struct defefSTReadRtResponse{
double value;
long time;
unsigned short status;//
char pointName[EFMI_POINTNAMELENGTH+1];//
}efSTReadRtInfoResponse;
c#================
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct defefSTReadRtInfoRequest
{
public Int32 time;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 49)]
public byte[] pointName;//
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 49)]
public byte[] ednaServ;//
}
//****************************************************************
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct defefSTReadRtResponse
{
public double value;
public Int32 time;
public UInt16 status;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 49)]
public byte[] pointName;//
};
[DllImport( "efEDClient.dll ", EntryPoint = "effnEDClientInit ", CharSet = CharSet.Ansi)]
public static extern bool effnEDClientInit();
[DllImport( "efEDClient.dll ", EntryPoint = "effnEDClientCheckPointInfoByTimeEx ", CharSet = CharSet.Ansi)]
public static extern bool effnEDClientCheckPointInfoByTimeEx(ref defefSTReadRtInfoRequest requestBuffer, out defefSTReadRtResponse responseBuffer, UInt32 count);
string[] p = new string[4] { "GDHYSSIS.U31_RTS.1EHC:C47.RO01 ", "GDHYSSIS.U31_RTS.1TURC:J15_01.PNT ", "GDHYSSIS.U31_RTS.1TURC:J15_04.PNT ", "GDHYSSIS.U31_RTS.1TURC:J15_11.PNT " };
for (int i = 0; i < nCount; i++)//显示输出数据
{
defefSTReadRtInfoRequest req = new defefSTReadRtInfoRequest();
System.Text.UnicodeEncoding converter = new System.Text.UnicodeEncoding();
string arrP, arrServ;
arrP = p[i];
arrServ = "GDHYSSIS.U31_RTS ";
req.pointName = new byte[49];
req.ednaServ = new byte[49];
req.pointName = converter.GetBytes(arrP);
req.time = 0;
req.ednaServ = converter.GetBytes(arrServ);
defefSTReadRtResponse iResp = new defefSTReadRtResponse();
iResp.pointName = new byte[49];
if (effnEDClientCheckPointInfoByTimeEx(ref req, out iResp, nCount))
{
Console.WriteLine( "值: " + iResp.value.ToString() + "--- " + iResp.status.ToString() + "time: " + iResp.time.ToString());
}
报错:未能封送数据类型 长度与布局中不匹配。
[解决办法]
程序问题吧?
//此处你初始化了它们的大小, 但是后面的
req.pointName = new byte[49];
req.ednaServ = new byte[49];
//这里你又赋值了,arrP,和arrServ的大小不等于49吧(数得真累啊 @_@)?
req.pointName = converter.GetBytes(arrP);
req.ednaServ = converter.GetBytes(arrServ);
//此处替换成试试
Array.Copy(arrP.ToCharArray(),0, req.pointName,0, arrP.Length);
Array.Copy(arrServ.ToCharArray(),0, req.ednaServ,0, arrServ.Length);