Re: [rt.cpan.org #48006] Warnings from Win32::API::Struct

[email protected] ("Bill Luebkert via RT")
Newsgroups perl.libwin32
Message-ID <[email protected]>
Sun Jul 19 16:07:36 2009: Request 48006 was acted upon.
Transaction: Correspondence added by [email protected]
       Queue: Win32-API
     Subject: Re: [rt.cpan.org #48006] Warnings from Win32::API::Struct
   Broken in: (no value)
    Severity: Normal
       Owner: COSIMO
  Requestors: [email protected]
      Status: new
 Ticket <URL: http://rt.cpan.org/Ticket/Display.html?id=48006 >


Cosimo Streppone via RT wrote:
> Sun Jul 19 10:43:11 2009: Request 48006 was acted upon.
> Transaction: Ticket created by COSIMO
>        Queue: Win32-API
>      Subject: Warnings from Win32::API::Struct
>    Broken in: (no value)
>     Severity: Normal
>        Owner: COSIMO
>   Requestors: [email protected]
>       Status: new
>  Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=48006 >
> 
> 
> loads of warnings when using the module:
> 
>   return $self->{align} unless $self->{align} eq 'auto';
>  
> Should it be:
> 
>   return $self->{align} unless ! defined $self->{align} || $self->
> {align} eq 'auto';
> 
> But not 100% sure?
>  
> In addition there are a number of debug lines which also cause loads
> of warnings:
>  
> Struct.pm:221    DEBUG "(PM)Struct::getPack: $self->{__typedef__}
> (buffer) = pack($packing, @items)\n";
> Struct.pm:229    DEBUG "(PM)Struct::Pack: $self->{__typedef__}(buffer) 
> = pack($packing, @$items)\n";

I think there are some bugs in there too.  Does sizeof work properly
in the current version ?  There might be alignment issues too.
I'm using 0.50.

Here's a test case that should show the sizeof problem:

use strict;
use warnings;
use Win32::API::Struct;

typedef Win32::API::Struct PROCESSENTRY32 => qw(
     DWORD dwSize;
     DWORD cntUsage;
     DWORD th32ProcessID;
     DWORD th32DefaultHeapID;
     DWORD th32ModuleID;
     DWORD cntThreads;
     DWORD th32ParentProcessID;
     LONG  pcPriClassBase;
     DWORD dwFlags;
     char szExeFile[260];
);	# 9*4=36+260=296
my $pe32 = new Win32::API::Struct ('PROCESSENTRY32');
my $size = $pe32->sizeof;
print "size=$size should be 296\n";

__END__

This produces:
size=40 should be 296

I changed my version of Struct.pm to alleviate the symptom, but
not sure if it's the correct change (my changes on the right >):

143,147c144,148
<       if(defined $align and $align > 0) {
<       return scalar(@{ $self->{typedef} }) * $align;
<     } else {
<       return $size;
<     }
---
 > #     if(defined $align and $align > 0) {     $Bill - comment out this align test
 > #             return scalar(@{ $self->{typedef} }) * $align;  $Bill
 > #     } else {        $Bill
 > #             return $size;   $Bill
 > #     }       $Bill
189c190
<         ($name, $type, my $orig) = @$member;  # $Bill - just a strict issue
---
 >       ($name, $type, $orig) = @$member;
246c247
<         ($name, $type, $orig) = @$member;
---
 >         ($name, $type, my $orig) = @$member;  # $Bill - just a strict issue

There may be other issues.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.