Tue Jan 31 18:22:54 2012: Request 74578 was acted upon.
Transaction: Ticket created by DOUGW
       Queue: Win32-API
     Subject: (No subject given)
   Broken in: 0.64
    Severity: Normal
       Owner: Nobody
  Requestors: do...@cpan.org
      Status: new
 Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=74578 >



<p>
When using Win32::API::Struct on 64bit, I get extraneous "x" (null
bytes) in the pack/unpack templates.
When I do a straight unpack without the x's, I get the data correctly.
</p>
<p>
Or if I remove the 'align' logic in Win32::API::Struct::getPack() and
getUnpack(), I also get a correct result.
Is this a bug or is there something else I should be doing?
</p>

<pre>
  $Win32::API::DEBUG = 1;

  Win32::API::Struct->typedef('DLXSTRUCT', qw(
    CHAR    VarName[12];
    LONG32  StartDate;
    LONG32  EndDate;
    INT32   NumberObs;
    INT32   Frequency;
    ULONG32 DateTimeMod;
    INT32   Magnitude;
    INT32   DecPrecision;
    INT32   DifType;
    INT32   AggType;
    CHAR  DataType[8];
    CHAR  Group[4];
    CHAR  Source[6];
    CHAR  Geography1[8];
    CHAR  Geography2[8];
    CHAR  Descriptor[82];
    CHAR  ShortSource[10];
    CHAR  LongSource[70];
  )) or die "Err";

  # 'PPS' when using the Struct above
  # 'PPP' when using the buffer below
  my $GetInfo = Win32::API->new(
  #  $dll, 'DLXGetInfo', 'PPP', 'I',
    $dll, 'DLXGetInfo', 'PPS', 'I',
  ) or die "Err: $!";

  # When using 'PPP' above
  #my $dlx = " " x 246;


  # Character fields missing first 3 characters, number fields are garbage
  my $info_result = $get_info->Call('', $field, $dlx);
  # Debug output:
  # (PM)Struct::getPack: DLXSTRUCT(buffer) =
pack(a12xlxxliiLiiiia8a4a6a8a8a82a10a71, 48)
  # (PM)Struct::getUnpack(DLXSTRUCT):
unpack(Z12xlxxliiLiiiiZ8Z4Z6Z8Z8Z82Z10Z71, ...field names)

  # For 'PPP' call above
  # Everything ok
  #my ($name, $start, $end, $n_obs, $freq, $dt_mod, $mag, $prec,
  #    $diftype, $agg_type, $data_type, $group, $source, $geo1, $geo2,
$desc, $short_source, $long_source)
  # = unpack('Z12 l l i i L i i i i Z8 Z4 Z6 Z8 Z8 Z82 Z10 Z70', $dlx);
</pre>

Reply via email to