读书人

平台调用-封送结构体指针。该如何处理

发布时间: 2011-12-27 22:22:55 作者: rapoo

平台调用----封送结构体指针。
请教你 一个问题。
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);

读书人网 >C#

热点推荐