develooper Front page | perl.libwin32 | Postings from December 2011

Re: How to create a Win32::API::Struct struct if the struct has unionin it?

Thread Previous | Thread Next
From:
Aldo Calpini
Date:
December 1, 2011 01:39
Subject:
Re: How to create a Win32::API::Struct struct if the struct has unionin it?
Message ID:
4ED74BC8.9030606@perl.it
On 27.11.2011 02:29, Burak Gürsoy wrote:
> Hi,
>
> I'm wondering about how to create a SYSTEM_INFO structure from Perl:
>
> http://msdn.microsoft.com/en-us/library/windows/desktop/ms724958(v=vs.85).aspx
>
> to pass this to GetNativeSystemInfo(). Win32::API::Struct->typedef()
> seems to support
> simple structs only. Is there a way to create such a nested struct?
> Otherwise, is there any
> other way apart from XS?

hi Burak,

short answer is: you can't :-)

more elaborate answer: nested structs are not a problem, first define 
the inner struct and then use its name as type of one of the outer 
struct member.

union members, on the other hand, are not supported. for SYSTEM_INFO, 
however, the DWORD member (dwOemId) is obsolete and you should not need 
it at all.

should you really need to access both the DWORD and the corresponding 
two WORDs, you have to convert the data yourself (which in this case 
means some bit-shifting). for example, if you define the struct having 
the DWORD:

my $wProcessorArchitecture = $system_info->{dwOemId} & 0xffff;
my $wReserved = $system_info->{dwOemId} >> 16;

or the other way around, if you define the struct having two WORDs:

my $dwOemId = $system_info->{wProcessorArchitecture} | 
$system_info->{wReserved} << 16;

hope this helps!

cheers,
Aldo

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About