声明一个类(实际上是一个数据结构)
type
  PPacketGeneric=^PacketGeneric;
  PacketGeneric=class
    dwType:dWORD;
    dwSize:dWORD;
  end;var 
  aa:array[0..7] of Byte;//用于构造内存数据
  p:pbyte;
  dd:PPacketGeneric;
程序内容
//构造内存数据
  aa[0]:=$01;
  aa[1]:=$0;
  aa[2]:=$0;
  aa[3]:=$0;
  aa[4]:=$88;
  aa[5]:=$0;
  aa[6]:=$0;
  aa[7]:=$0;  p:=@aa;//p指向aa
***  dd:=PPacketGeneric(p);//构造p为PPacketGeneric类型,
  我的目的是要是dd.dwType=1,dd.dwSize=136($88),但是上面的类型转换没有办法实现。
  请问***号语句应该如何更改??

解决方案 »

  1.   

    看不出来你为什么要搞的这么麻烦 , 就你的问题 这么改一下把PacketGeneric=class
      dwType:dWORD;
      dwSize:dWORD;
    end;改为 PacketGeneric= packed record
      dwType:dWORD;
      dwSize:dWORD;
     end;
      

  2.   

    了解一下packed record的定义,如果不适用packed进行定义Delphi是按一次4个字节的方式申请内存,如果一个变量没有4个字节也要占4个字节
      

  3.   

    首先,你的这种应用,用record比用类要方便许多。
    如果你一定要用类,那么,按照下面的方式用(注意,最后不要调用类的 Free  动态数组会自动释放)
    实际上,下面是以动态数组的内存为基准的一个类
    type
      PacketGeneric = class
        dwType:dWORD;
        dwSize:dWORD;
      end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      aa: array of Byte;//用于构造内存数据
      dd: PacketGeneric;
    begin
      SetLength(aa, PacketGeneric.InstanceSize);
      //构造内存数据
      {
      //以类为基准赋值
      dd := PacketGeneric(@aa[0]);
      PInteger(dd)^ := Integer(PacketGeneric);
      dd.dwType := $1;
      dd.dwSize := $88;
      showmessage(format('aa[4]:$%x, aa[8]:$%x', [PDWord(@aa[4])^, PDWord(@aa[8])^]))
      }  //或者 以数组为基准赋值
      PInteger(@aa[0])^ := Integer(PacketGeneric);
      PDWord(@aa[4])^ := 1;
      PDWord(@aa[8])^ := $88;
      dd := PacketGeneric(@aa[0]);
      showmessage(format('dwType:$%x, dwSize:$%x', [dd.dwType, dd.dwSize]))
    end;
      

  4.   

    刚巧,前几天发了一下学习笔记。http://blog.sina.com.cn/s/blog_40ac71670100mg28.html按这种结构。