in reply to Problems with Win32::API module

My guess is that $LLHandle is first 'introduced' within your code by the call of Call($LLHandle) and thus is undefined. The use of strictures, i.e.

#!/usr/bin/perl use strict; use warnings;

would have caught that though.

Unless $LLHandle is exported per default by Win32::API, which I don't know. But I saw no mention of $LLHandle in Win32::API's documentation.

Perhaps you accidentally forgot to include some relevant code?

Replies are listed 'Best First'.
Re^2: Problems with Win32::API module
by Anonymous Monk on May 01, 2007 at 12:48 UTC
    Here is the corrected code.. my fault:
    #!/usr/bin/perl use Win32::API; my $lpBuffer = "\0" x 64; my $ZP4StartSession = new Win32::API("ZP4", "ZP4StartSession", [N], P) + || die Win32::FormatMessage(Win32::GetLastError); my $LLHandle = $ZP4StartSession->Call($lpBuffer) || die Win32::FormatM +essage(Win32::GetLastError);

      The "N" in "[N]" causes $lpBuffer to be interpretted as a number. "\0" x 64 as a number is just 0. Although you tell us nothing about ZP4StartSession(), it appears clear that what you want to pass to it is a pointer to the buffer you allocated in $lpBuffer. Win32::API doesn't support this type of argument very well / easily. It only supports pointers to '\0'-terminated strings.

      However, it might work to use [P] instead. That depends on implementation details of Win32::API that I am not certain of.

      If that doesn't work, then you should probably do:

      my $lpBuffer= "\0" x 64; my $bufAddr= unpack "L", pack "p", $lpBuffer; #... ... $ZP4StartSession->Call( $bufAddr ) ...

      - tye