http://www.perlmonks.org?node_id=164208


in reply to pack()ing Win32 Structures

A couple of things -

  1. 'u' in the pack template is UUEncoded text, I think you want 'U' for unicode, right? The template you are looking for should be "LU32PLU32PL"
  2. Instead of " " x 32, pass a list of 32 32's, for example:
    push @splist, 32 for (1 .. 32); $tz_struct = pack("LU32PLU32PL", 0, @splist, $systime_struct, 0, @splist, $systime_struct, 0 +);
  3. 'P' and 'N' are constants defined in Win32::API, not strings. The third parameter to new Win32::API should be an anonymous list or an array reference, not a string literal
    'GetTimeZoneInformation', [P], N
  4. Have fun unpacking the unicode string! If all you are interested in is the bias, try "LS64PLS64PL" for the template.

Update:

Updated my Win32::API, and updated #3 above. Thanks mothra:-)
BTW, $bias returns 480 after making the above modifications (UTC -8)

Replies are listed 'Best First'.
Re: Re: pack()ing Win32 Structures
by mothra (Hermit) on May 06, 2002 at 02:27 UTC
    'P' and 'N' are constants defined in Win32::API, not strings. The third parameter to new Win32::API should be an anonymous list or an array reference, not a string literal
    'GetTimeZoneInformation', [P], N
    FWIW, according to the documentation, string literals are allowed for specifying the types of the parameters.
      You must have a newer version of Win32::API than I do. The docs in mine say:

      The third parameter, the input parameter list, specifies how many arguments the function wants, and their types. It MUST be passed as a list reference.