in reply to Re: Re: Re: Re: Re: Re: Win32 Shared Memory
in thread Win32 Shared Memory

I agree. Funnily enough, I think that this maybe a new feature as I don't recall not being able to use constant strings previously.

The line of code in question from Win32::API::Type.pm(195) is

$_[1] = unpack("Z*", $_[1]);

Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail

Replies are listed 'Best First'.
Re: Re: Re: Re: Re: Re: Re: Re: Win32 Shared Memory
by ysth (Canon) on May 16, 2004 at 06:24 UTC
    Ah, I'd thought this was XS...from Perl there's no good way to inspect the string buffer beyond the actual end of the perl string. But it does look like it unintentionally modifies the caller's parameter; probably not a good thing. Is there a better way to unalias one parameter than:
    splice(@_, 1, 1, unpack("Z*", $_[1]))

      The code the goes on to return the modified $_[1],

      sub Pack { my $type = $_[0]; if(packing($type) eq 'c' and is_pointer($type)) { $_[1] = pack("Z*", $_[1]); return $_[1]; } $_[1] = pack( packing($type), $_[1]); return $_[1]; }

      so a simple  return unpack'Z*',''.$_[1]; would probably do the job in the case where the parameter is a constant string or other IN parameter.

      But that solution falls down when the parameter being passed is an OUT or INOUT buffer. In that case, the calling code need for its copy of the buffer to be modifiable by the OS, so copying the buffer to null terminate it, would be a problem.


      Examine what is said, not who speaks.
      "Efficiency is intelligent laziness." -David Dunham
      "Think for yourself!" - Abigail