Your using a module 6 years older than the current version with .68-.45*100 releases in between. A 6 year old module isn't necessarily bad, but if it has had 2 dozen releases since in 6 years, using such an old version is ill advised. Try using the latest version of Win32::API.

As an experiment, I installed 0.45 of Win32::API, your code still doesn't run.
C:\Documents and Settings\Owner\Desktop\cpan libs\Win32-Wlan-0.06>perl + wlan.pl The system cannot find the file specified at C:/perl512/site/lib/Win32 +/Wlan/API. pm line 381, <DATA> line 164. C:\Documents and Settings\Owner\Desktop\cpan libs\Win32-Wlan-0.06>perl + -MWin32:: API -MWin32::Wlan::API -e "print $Win32::API::VERSION" 0.45 C:\Documents and Settings\Owner\Desktop\cpan libs\Win32-Wlan-0.06>
Internally, Win32::API 0.45 still generates a garbage struct since your using undefined Win32::API types.
#from Win32::API::Struct 0.45 sub Pack { my $self = shift; my($packing, $items, $recipients) = $self->getPack(); DEBUG "(PM)Struct::Pack: $self->{__typedef__}(buffer) = pack($pack +ing, @$items)\n"; $self->{buffer} = pack($packing, @$items); if(DEBUG) { for my $i (0..$self->sizeof-1) { printf " %3d: 0x%02x\n", $i, ord(substr($self->{buffer} +, $i, 1)); } } $self->{buffer_recipients} = $recipients }
$packing contains "SL". I modified Wlan::API's WlanConnect to
sub WlanConnect { croak "Wlan functions are not available" unless $wlan_available; my ($handle, $guuid, $profilename, $ssid) = @_; my $pDot11Ssid = Win32::API::Struct->new('DOT11_SSID'); $pDot11Ssid->{uSSIDLength} = length $ssid; $pDot11Ssid->{ucSSID} = $ssid; my $Wlan_connection_parameters = Win32::API::Struct->new('WLAN_CON +NECTION_PARAMETERS'); $Wlan_connection_parameters->{wlanConnectionMode} = 0; $Wlan_connection_parameters->{strProfile} = $profilename; $Wlan_connection_parameters->{pDot11Ssid} = $pDot11Ssid; $Wlan_connection_parameters->{pDesiredBssidList} = 0; $Wlan_connection_parameters->{dot11BssType} = 3; $Wlan_connection_parameters->{dwFlags} = 0; my $reterr = $API{ WlanConnect }->Call($handle, $guuid, $Wlan_con +nection_parameters, 0); $reterr == 0 or die "WlanConnect return Error $reterr "; };
and reran it under Win32::API, 0.45.
C:\Documents and Settings\Owner\Desktop\cpan libs\Win32-Wlan-0.06>perl + wlan.pl WlanConnect return Error 87 at C:/perl512/site/lib/Win32/Wlan/API.pm +line 382, <DATA> line 164. C:\Documents and Settings\Owner\Desktop\cpan libs\Win32-Wlan-0.06>perl + -MWin32: API -MWin32::Wlan::API -e "print $Win32::API::VERSION" 0.45 C:\Documents and Settings\Owner\Desktop\cpan libs\Win32-Wlan-0.06>
The work around is to use "INT" instead of enums specific types and keep a hash that converts enum slice names (as hash key names) to numeric equivalents (hash key value). Not all the things in WLAN_CONNECTION_PARAMETERS are enums. Some are pointers to other structs. Can I ask what level is your knowledge of C?

update, at first glance, there seems to be a bug in latest Win32::API, a ::Struct with a pointer to a ::Struct is broken, the parent ::Struct always treats the child ::Struct nested inline struct, not a struct pointer. So the Error 87 invalid parameter is the limit of using Win32::API::Struct module. You have to use pack, there probably is no alternative.

In reply to Re^9: Adding WlanConnect() to Win32::Wlan::API (structs no go?) by bulk88
in thread Adding WlanConnect() to Win32::Wlan::API by tomsell

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.