首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2011-12-27 
平台调用----封送结构体指针。请教你一个问题。C定义如下:BOOLeffnEDClientCheckPointInfoByTime(efSTReadRt

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

热点排行