本帖最后由 ym505885 于 2011-04-05 23:20:01 编辑

解决方案 »

  1.   

    您可以不看代码的 问题已经描述的很清晰了吧?CSDN上不都是各式各样的问题吗 您都是让他们自己调试去?
      

  2.   

        IdUDPServer2.SendBuffer('127.0.0.1',8001,Msg_ZC,Sizeof(Msg_ZC));   //Sizeof一定要获得结构体的长度才行。
    其中,sizeof(Msg_ZC)有问题,关键是你的结构定义中不要用String类型,可这样定义:
    TData = record
    ...
    FData :array[0..120] of String[255];
    end;
    这样FData的长度固定了。
    你可做个测试,如:
    TTest=record
        a:integer;//占4个字节
         s:string;
    end;然后写段程序:
    var v:TTest;
    begin
        v.a := 0;
        v.s := '01234567890123456789';
        showmessage(inttostr(sizeof(v))+','+inttostr(sizeof(TTest)));
    end;
    改变v.s的长度,你看看结果如何?
      

  3.   

    无法接收的问题可能是UDP丢包了
    你的这个“invalid pointer operation”错误可能是调用DLL产生的,你可以试试一个简单的程序加载调用opcauto.dll看是否也会出错。
      

  4.   

    之前做过楼控的OPC,通讯的都直接用COM+了,不需要自己写通讯部分呀,不过COM+配置有点麻烦。收到乱码可以以十六进制打印出来,和原数据对比就知道为什么了
      

  5.   

    TData = record
    Fid :array[0..50] of byte;
    FCmd :array[0..101] of byte;
    FMgs :array[0..101] of byte;
    FClientFlag :array[0..101] of byte;
    FDataSize :array[0..8] of byte;
    FIsList :array[0..1] of byte;
    FData :array[0..120] of String; 这句话定义的有问题,得不到正确的长度。要用定长结构,简单点得改法把string改为string[255]
    end;
      

  6.   

    在结构体中用string,再用sizeof获取长度是有问题的。
      

  7.   

    UDP通讯中不能有变长的类型,要用定长的,像string绝对不能用